From f5a1e7dd3c566b232f37f457ab31c162d8872501 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 15 Jul 2024 08:09:20 +0200 Subject: [PATCH 01/73] fix equal checks for cells and output (#8721) ### Description * Check for equal Vc on returning a value * Avoid PartialEq checks for values that are never equal ### Testing Instructions --- crates/turbo-tasks-memory/src/output.rs | 24 +++++++--------- crates/turbopack-core/src/source_map/mod.rs | 2 +- crates/turbopack-css/src/process.rs | 32 +++++++-------------- 3 files changed, 22 insertions(+), 36 deletions(-) diff --git a/crates/turbo-tasks-memory/src/output.rs b/crates/turbo-tasks-memory/src/output.rs index 43f50580c1fb7..d1c83f7ef216a 100644 --- a/crates/turbo-tasks-memory/src/output.rs +++ b/crates/turbo-tasks-memory/src/output.rs @@ -56,7 +56,17 @@ impl Output { pub fn link(&mut self, target: RawVc, turbo_tasks: &dyn TurboTasksBackendApi) { debug_assert!(*self != target); - self.assign(OutputContent::Link(target), turbo_tasks) + if let OutputContent::Link(old_target) = &self.content { + if *old_target == target { + // unchanged + return; + } + } + self.content = OutputContent::Link(target); + // notify + if !self.dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(&take(&mut self.dependent_tasks)); + } } pub fn error(&mut self, error: Error, turbo_tasks: &dyn TurboTasksBackendApi) { @@ -79,18 +89,6 @@ impl Output { } } - pub fn assign( - &mut self, - content: OutputContent, - turbo_tasks: &dyn TurboTasksBackendApi, - ) { - self.content = content; - // notify - if !self.dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(&take(&mut self.dependent_tasks)); - } - } - pub fn gc_drop(self, turbo_tasks: &dyn TurboTasksBackendApi) { // notify if !self.dependent_tasks.is_empty() { diff --git a/crates/turbopack-core/src/source_map/mod.rs b/crates/turbopack-core/src/source_map/mod.rs index 2af9fcbef4717..98031567bd621 100644 --- a/crates/turbopack-core/src/source_map/mod.rs +++ b/crates/turbopack-core/src/source_map/mod.rs @@ -43,7 +43,7 @@ pub trait GenerateSourceMap { /// The distinction between the source map spec's [sourcemap::Index] and our /// [SourceMap::Sectioned] is whether the sections are represented with Vcs /// pointers. -#[turbo_tasks::value(shared)] +#[turbo_tasks::value(shared, cell = "new")] pub enum SourceMap { /// A decoded source map contains no Vcs. Decoded(#[turbo_tasks(trace_ignore)] InnerSourceMap), diff --git a/crates/turbopack-css/src/process.rs b/crates/turbopack-css/src/process.rs index 23a901ecd97f5..202a309261f97 100644 --- a/crates/turbopack-css/src/process.rs +++ b/crates/turbopack-css/src/process.rs @@ -274,7 +274,7 @@ impl<'i, 'o> StyleSheetLike<'i, 'o> { #[turbo_tasks::value(transparent)] pub struct UnresolvedUrlReferences(pub Vec<(String, Vc)>); -#[turbo_tasks::value(shared, serialization = "none", eq = "manual")] +#[turbo_tasks::value(shared, serialization = "none", eq = "manual", cell = "new")] pub enum ParseCssResult { Ok { #[turbo_tasks(debug_ignore, trace_ignore)] @@ -296,13 +296,7 @@ pub enum ParseCssResult { NotFound, } -impl PartialEq for ParseCssResult { - fn eq(&self, _: &Self) -> bool { - false - } -} - -#[turbo_tasks::value(shared, serialization = "none", eq = "manual")] +#[turbo_tasks::value(shared, serialization = "none", eq = "manual", cell = "new")] pub enum CssWithPlaceholderResult { Ok { parse_result: Vc, @@ -324,12 +318,6 @@ pub enum CssWithPlaceholderResult { NotFound, } -impl PartialEq for CssWithPlaceholderResult { - fn eq(&self, _: &Self) -> bool { - false - } -} - #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] pub enum FinalCssResult { Ok { @@ -390,10 +378,10 @@ pub async fn process_css_with_placeholder( url_references: *url_references, placeholders: HashMap::new(), } - .into()) + .cell()) } - ParseCssResult::Unparseable => Ok(CssWithPlaceholderResult::Unparseable.into()), - ParseCssResult::NotFound => Ok(CssWithPlaceholderResult::NotFound.into()), + ParseCssResult::Unparseable => Ok(CssWithPlaceholderResult::Unparseable.cell()), + ParseCssResult::NotFound => Ok(CssWithPlaceholderResult::NotFound.cell()), } } @@ -602,7 +590,7 @@ async fn process_content( } .cell() .emit(); - return Ok(ParseCssResult::Unparseable.into()); + return Ok(ParseCssResult::Unparseable.cell()); } _ => { @@ -629,7 +617,7 @@ async fn process_content( } .cell() .emit(); - return Ok(ParseCssResult::Unparseable.into()); + return Ok(ParseCssResult::Unparseable.cell()); } } }) @@ -669,12 +657,12 @@ async fn process_content( Ok(v) => v, Err(err) => { err.to_diagnostics(&handler).emit(); - return Ok(ParseCssResult::Unparseable.into()); + return Ok(ParseCssResult::Unparseable.cell()); } }; if handler.has_errors() { - return Ok(ParseCssResult::Unparseable.into()); + return Ok(ParseCssResult::Unparseable.cell()); } if matches!(ty, CssModuleAssetType::Module) { @@ -722,7 +710,7 @@ async fn process_content( url_references: Vc::cell(url_references), options: config, } - .into()) + .cell()) } /// Visitor that lints wrong css module usage. From c454e35586b9575d264457be562f82982d2468eb Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 15 Jul 2024 08:11:17 +0200 Subject: [PATCH 02/73] add unloading of tasks to GC (#8671) ### Description Inactive tasks can be completely unloaded. This disconnects them from the graph and frees nearly all memory (except for the TaskId mapping). When running GC for a task we check if it's inactive and unload it when it is. But we also need to enqueue a task for GC again when it becomes inactive. So we maintain a queue of potentially inactive tasks and walk the children during GC. --- .../turbo-tasks-memory/src/aggregation/mod.rs | 8 +- crates/turbo-tasks-memory/src/cell.rs | 58 ++-- crates/turbo-tasks-memory/src/gc.rs | 178 +++++++++-- .../turbo-tasks-memory/src/memory_backend.rs | 40 ++- crates/turbo-tasks-memory/src/task.rs | 299 ++++++++++++------ 5 files changed, 417 insertions(+), 166 deletions(-) diff --git a/crates/turbo-tasks-memory/src/aggregation/mod.rs b/crates/turbo-tasks-memory/src/aggregation/mod.rs index 154031527de5c..bfbd8da7b657f 100644 --- a/crates/turbo-tasks-memory/src/aggregation/mod.rs +++ b/crates/turbo-tasks-memory/src/aggregation/mod.rs @@ -81,7 +81,7 @@ impl AggregationNode { AggregationNode::Leaf { aggregation_number, .. } => *aggregation_number as u32, - AggregationNode::Aggegating(aggegating) => aggegating.aggregation_number, + AggregationNode::Aggegating(aggregating) => aggregating.aggregation_number, } } @@ -92,21 +92,21 @@ impl AggregationNode { fn uppers(&self) -> &CountHashSet { match self { AggregationNode::Leaf { uppers, .. } => uppers, - AggregationNode::Aggegating(aggegating) => &aggegating.uppers, + AggregationNode::Aggegating(aggregating) => &aggregating.uppers, } } fn uppers_mut(&mut self) -> &mut CountHashSet { match self { AggregationNode::Leaf { uppers, .. } => uppers, - AggregationNode::Aggegating(aggegating) => &mut aggegating.uppers, + AggregationNode::Aggegating(aggregating) => &mut aggregating.uppers, } } fn followers(&self) -> Option<&CountHashSet> { match self { AggregationNode::Leaf { .. } => None, - AggregationNode::Aggegating(aggegating) => Some(&aggegating.followers), + AggregationNode::Aggegating(aggregating) => Some(&aggregating.followers), } } } diff --git a/crates/turbo-tasks-memory/src/cell.rs b/crates/turbo-tasks-memory/src/cell.rs index a23086da20305..11b756f84217c 100644 --- a/crates/turbo-tasks-memory/src/cell.rs +++ b/crates/turbo-tasks-memory/src/cell.rs @@ -158,9 +158,14 @@ impl Cell { } } + /// Assigns a new content to the cell. Will notify dependent tasks if the + /// content has changed. + /// If clean = true, the task inputs weren't changes since the last + /// execution and can be assumed to produce the same content again. pub fn assign( &mut self, content: CellContent, + clean: bool, turbo_tasks: &dyn TurboTasksBackendApi, ) { match self { @@ -175,31 +180,46 @@ impl Cell { ref mut dependent_tasks, } => { event.notify(usize::MAX); - // Assigning to a cell will invalidate all dependent tasks as the content might - // have changed. - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(dependent_tasks); + if clean { + // We can assume that the task is deterministic and produces the same content + // again. No need to notify dependent tasks. + *self = Cell::Value { + content, + dependent_tasks: take(dependent_tasks), + }; + } else { + // Assigning to a cell will invalidate all dependent tasks as the content might + // have changed. + if !dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(dependent_tasks); + } + *self = Cell::Value { + content, + dependent_tasks: AutoSet::default(), + }; } - *self = Cell::Value { - content, - dependent_tasks: AutoSet::default(), - }; } &mut Cell::TrackedValueless { ref mut dependent_tasks, } => { - // Assigning to a cell will invalidate all dependent tasks as the content might - // have changed. - // TODO this leads to flagging task unnecessarily dirty when a GC'ed task is - // recomputed. We need to use the notification of changed cells for the current - // task to check if it's valid to skip the invalidation here - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(dependent_tasks); + if clean { + // We can assume that the task is deterministic and produces the same content + // again. No need to notify dependent tasks. + *self = Cell::Value { + content, + dependent_tasks: take(dependent_tasks), + }; + } else { + // Assigning to a cell will invalidate all dependent tasks as the content might + // have changed. + if !dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(dependent_tasks); + } + *self = Cell::Value { + content, + dependent_tasks: AutoSet::default(), + }; } - *self = Cell::Value { - content, - dependent_tasks: AutoSet::default(), - }; } Cell::Value { content: ref mut cell_content, diff --git a/crates/turbo-tasks-memory/src/gc.rs b/crates/turbo-tasks-memory/src/gc.rs index b0253fa0e8110..96c7be4800cd9 100644 --- a/crates/turbo-tasks-memory/src/gc.rs +++ b/crates/turbo-tasks-memory/src/gc.rs @@ -3,16 +3,18 @@ use std::{ collections::VecDeque, fmt::Debug, mem::take, + num::NonZeroU32, sync::atomic::{AtomicU32, AtomicUsize, Ordering}, time::Duration, }; use concurrent_queue::ConcurrentQueue; +use dashmap::DashSet; use parking_lot::Mutex; use tracing::field::{debug, Empty}; -use turbo_tasks::TaskId; +use turbo_tasks::{TaskId, TurboTasksBackendApi}; -use crate::MemoryBackend; +use crate::{task::GcResult, MemoryBackend}; /// The priority of a task for garbage collection. /// Any action will shrink the internal memory structures of the task in a @@ -30,7 +32,7 @@ pub struct GcPriority { pub struct GcTaskState { pub priority: GcPriority, /// The generation where the task was last accessed. - pub generation: u32, + pub generation: Option, } impl GcTaskState { @@ -38,9 +40,9 @@ impl GcTaskState { &mut self, duration: Duration, memory_usage: usize, - generation: u32, + generation: NonZeroU32, ) { - self.generation = generation; + self.generation = Some(generation); self.priority = GcPriority { memory_per_time: ((memory_usage + TASK_BASE_MEMORY_USAGE) as u64 / (duration.as_micros() as u64 + TASK_BASE_COMPUTE_DURATION_IN_MICROS)) @@ -49,16 +51,22 @@ impl GcTaskState { }; } - pub(crate) fn on_read(&mut self, generation: u32) -> bool { - if self.generation < generation { - self.generation = generation; - true + pub(crate) fn on_read(&mut self, generation: NonZeroU32) -> bool { + if let Some(old_generation) = self.generation { + if old_generation < generation { + self.generation = Some(generation); + true + } else { + false + } } else { - false + self.generation = Some(generation); + true } } } +const MAX_DEACTIVATIONS: usize = 100_000; const TASKS_PER_NEW_GENERATION: usize = 100_000; const MAX_TASKS_PER_OLD_GENERATION: usize = 200_000; const PERCENTAGE_TO_COLLECT: usize = 30; @@ -69,11 +77,16 @@ pub const PERCENTAGE_IDLE_TARGET_MEMORY: usize = 75; struct OldGeneration { tasks: Vec, - generation: u32, + generation: NonZeroU32, } struct ProcessGenerationResult { priority: Option, + content_dropped_count: usize, + unloaded_count: usize, +} + +struct ProcessDeactivationsResult { count: usize, } @@ -88,34 +101,66 @@ pub struct GcQueue { /// Tasks from old generations. The oldest generation will be garbage /// collected next. generations: Mutex>, + /// Tasks that have become inactive. Processing them should ensure them for + /// GC, if they are not already ensured and put all child tasks into the + /// activation_queue + deactivation_queue: ConcurrentQueue, + /// Tasks that are active and not enqueued in the deactivation queue. + // TODO Could be a bit field with locks, an array of atomics or an AMQF. + active_tasks: DashSet, } impl GcQueue { pub fn new() -> Self { Self { - generation: AtomicU32::new(0), + // SAFETY: Starting at 1 to produce NonZeroU32s + generation: AtomicU32::new(1), incoming_tasks: ConcurrentQueue::unbounded(), incoming_tasks_count: AtomicUsize::new(0), generations: Mutex::new(VecDeque::with_capacity(128)), + deactivation_queue: ConcurrentQueue::unbounded(), + active_tasks: DashSet::new(), } } /// Get the current generation number. - pub fn generation(&self) -> u32 { - self.generation.load(Ordering::Relaxed) + pub fn generation(&self) -> NonZeroU32 { + // SAFETY: We are sure that the generation is not 0, since we start at 1. + unsafe { NonZeroU32::new_unchecked(self.generation.load(Ordering::Relaxed)) } } /// Notify the GC queue that a task has been executed. - pub fn task_executed(&self, task: TaskId) -> u32 { + #[must_use] + pub fn task_executed(&self, task: TaskId) -> NonZeroU32 { self.add_task(task) } /// Notify the GC queue that a task has been accessed. - pub fn task_accessed(&self, task: TaskId) -> u32 { + #[must_use] + pub fn task_accessed(&self, task: TaskId) -> NonZeroU32 { self.add_task(task) } - fn add_task(&self, task: TaskId) -> u32 { + /// Notify the GC queue that a task should be enqueue for GC because it is + /// inactive. + #[must_use] + pub fn task_inactive(&self, task: TaskId) -> NonZeroU32 { + self.add_task(task) + } + + /// Notify the GC queue that a task was active during GC + pub fn task_gc_active(&self, task: TaskId) { + self.active_tasks.insert(task); + } + + /// Notify the GC queue that a task might be inactive now. + pub fn task_potentially_no_longer_active(&self, task: TaskId) { + if self.active_tasks.remove(&task).is_some() { + let _ = self.deactivation_queue.push(task); + } + } + + fn add_task(&self, task: TaskId) -> NonZeroU32 { let _ = self.incoming_tasks.push(task); if self.incoming_tasks_count.fetch_add(1, Ordering::Acquire) % TASKS_PER_NEW_GENERATION == TASKS_PER_NEW_GENERATION - 1 @@ -123,7 +168,10 @@ impl GcQueue { self.incoming_tasks_count .fetch_sub(TASKS_PER_NEW_GENERATION, Ordering::Release); // We are selected to move TASKS_PER_NEW_GENERATION tasks into a generation - let gen = self.generation.fetch_add(1, Ordering::Relaxed); + let gen = unsafe { + // SAFETY: We are sure that the generation is not 0, since we start at 1. + NonZeroU32::new_unchecked(self.generation.fetch_add(1, Ordering::Relaxed)) + }; let mut tasks = Vec::with_capacity(TASKS_PER_NEW_GENERATION); for _ in 0..TASKS_PER_NEW_GENERATION { match self.incoming_tasks.pop() { @@ -143,11 +191,38 @@ impl GcQueue { }); gen } else { - self.generation.load(Ordering::Relaxed) + self.generation() + } + } + + fn process_deactivations( + &self, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> ProcessDeactivationsResult { + let mut i = 0; + loop { + let Ok(id) = self.deactivation_queue.pop() else { + break; + }; + backend.with_task(id, |task| { + if !task.potentially_become_inactive(self, backend, turbo_tasks) { + self.active_tasks.insert(id); + } + }); + i += 1; + if i > MAX_DEACTIVATIONS { + break; + } } + ProcessDeactivationsResult { count: i } } - fn process_old_generation(&self, backend: &MemoryBackend) -> ProcessGenerationResult { + fn process_old_generation( + &self, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> ProcessGenerationResult { let old_generation = { let guard = &mut self.generations.lock(); guard.pop_back() @@ -160,7 +235,8 @@ impl GcQueue { // No old generation to process return ProcessGenerationResult { priority: None, - count: 0, + content_dropped_count: 0, + unloaded_count: 0, }; }; // Check all tasks for the correct generation @@ -169,8 +245,10 @@ impl GcQueue { for (i, task) in tasks.iter().enumerate() { backend.with_task(*task, |task| { if let Some(state) = task.gc_state() { - if state.generation <= generation { - indices.push((Reverse(state.priority), i as u32)); + if let Some(gen) = state.generation { + if gen <= generation { + indices.push((Reverse(state.priority), i as u32)); + } } } }); @@ -180,7 +258,8 @@ impl GcQueue { // No valid tasks in old generation to process return ProcessGenerationResult { priority: None, - count: 0, + content_dropped_count: 0, + unloaded_count: 0, }; } @@ -235,35 +314,66 @@ impl GcQueue { } // GC the tasks - let mut count = 0; + let mut content_dropped_count = 0; + let mut unloaded_count = 0; for task in tasks[..tasks_to_collect].iter() { backend.with_task(*task, |task| { - if task.run_gc(generation) { - count += 1; + match task.run_gc(generation, self, backend, turbo_tasks) { + GcResult::NotPossible => {} + GcResult::Stale => {} + GcResult::ContentDropped => { + content_dropped_count += 1; + } + GcResult::Unloaded => { + unloaded_count += 1; + } } }); } ProcessGenerationResult { priority: Some(max_priority), - count, + content_dropped_count, + unloaded_count, } } /// Run garbage collection on the queue. - pub fn run_gc(&self, backend: &MemoryBackend) -> Option<(GcPriority, usize)> { - let span = - tracing::trace_span!("garbage collection", priority = Empty, count = Empty).entered(); + pub fn run_gc( + &self, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> Option<(GcPriority, usize)> { + let span = tracing::trace_span!( + parent: None, + "garbage collection", + priority = Empty, + deactivations_count = Empty, + content_dropped_count = Empty, + unloaded_count = Empty, + already_unloaded_count = Empty + ) + .entered(); + + let ProcessDeactivationsResult { + count: deactivations_count, + } = self.process_deactivations(backend, turbo_tasks); - let ProcessGenerationResult { priority, count } = self.process_old_generation(backend); + let ProcessGenerationResult { + priority, + content_dropped_count, + unloaded_count, + } = self.process_old_generation(backend, turbo_tasks); - span.record("count", count); + span.record("deactivations_count", deactivations_count); + span.record("content_dropped_count", content_dropped_count); + span.record("unloaded_count", unloaded_count); if let Some(priority) = &priority { span.record("priority", debug(priority)); } else { span.record("priority", ""); } - priority.map(|p| (p, count)) + priority.map(|p| (p, content_dropped_count)) } } diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 64fe7cb9182e8..cc2f973988ac9 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -3,6 +3,7 @@ use std::{ cell::RefCell, future::Future, hash::{BuildHasher, BuildHasherDefault, Hash}, + num::NonZeroU32, pin::Pin, sync::{ atomic::{AtomicBool, Ordering}, @@ -137,7 +138,7 @@ impl MemoryBackend { pub fn run_gc( &self, idle: bool, - _turbo_tasks: &dyn TurboTasksBackendApi, + turbo_tasks: &dyn TurboTasksBackendApi, ) -> bool { if let Some(gc_queue) = &self.gc_queue { let mut did_something = false; @@ -154,7 +155,7 @@ impl MemoryBackend { return did_something; } - let collected = gc_queue.run_gc(self); + let collected = gc_queue.run_gc(self, turbo_tasks); // Collecting less than 100 tasks is not worth it if !collected.map_or(false, |(_, count)| count > 100) { @@ -330,21 +331,28 @@ impl Backend for MemoryBackend { let generation = if let Some(gc_queue) = &self.gc_queue { gc_queue.generation() } else { - 0 + // SAFETY: 1 is not zero + unsafe { NonZeroU32::new_unchecked(1) } }; - let reexecute = self.with_task(task_id, |task| { - task.execution_completed( - duration, - memory_usage, - generation, - stateful, - self, - turbo_tasks, + let (reexecute, once_task) = self.with_task(task_id, |task| { + ( + task.execution_completed( + duration, + memory_usage, + generation, + stateful, + self, + turbo_tasks, + ), + task.is_once(), ) }); if !reexecute { if let Some(gc_queue) = &self.gc_queue { - gc_queue.task_executed(task_id); + let _ = gc_queue.task_executed(task_id); + if once_task { + gc_queue.task_potentially_no_longer_active(task_id); + } self.run_gc(false, turbo_tasks); } } @@ -402,7 +410,7 @@ impl Backend for MemoryBackend { } else { Task::add_dependency_to_current(TaskEdge::Cell(task_id, index)); self.with_task(task_id, |task| { - match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell| { + match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, _| { cell.read_content( reader, move || format!("{task_id} {index}"), @@ -439,7 +447,7 @@ impl Backend for MemoryBackend { turbo_tasks: &dyn TurboTasksBackendApi, ) -> Result> { self.with_task(task_id, |task| { - match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell| { + match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, _| { cell.read_content_untracked( move || format!("{task_id}"), move || format!("reading {} {} untracked", task_id, index), @@ -499,8 +507,8 @@ impl Backend for MemoryBackend { turbo_tasks: &dyn TurboTasksBackendApi, ) { self.with_task(task, |task| { - task.with_cell_mut(index, self.gc_queue.as_ref(), |cell| { - cell.assign(content, turbo_tasks) + task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, clean| { + cell.assign(content, clean, turbo_tasks) }) }) } diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 0920f0687429f..4d470de14d71c 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -5,6 +5,7 @@ use std::{ future::Future, hash::{BuildHasherDefault, Hash}, mem::{replace, take}, + num::NonZeroU32, pin::Pin, sync::{atomic::AtomicU32, Arc}, time::Duration, @@ -187,6 +188,7 @@ impl TaskState { state_type: Scheduled { event: Event::new(move || format!("TaskState({})::event", description())), outdated_edges: Default::default(), + clean: true, }, collectibles: Default::default(), output: Default::default(), @@ -310,6 +312,8 @@ impl MaybeCollectibles { struct InProgressState { event: Event, count_as_finished: bool, + /// true, when the task wasn't changed since the last execution + clean: bool, /// Dependencies and children that need to be disconnected once leaving /// this state outdated_edges: TaskEdgesSet, @@ -346,6 +350,8 @@ enum TaskStateType { Scheduled { event: Event, outdated_edges: Box, + /// true, when the task wasn't changed since the last execution + clean: bool, }, /// Execution is happening @@ -427,6 +433,21 @@ use self::{ }, }; +pub enum GcResult { + /// The task is not allowed to GC, e. g. due to it being non-pure or having + /// state. + NotPossible, + /// The task was rescheduled for GC and must not be GC'ed now but at a later + /// time. + Stale, + /// Dropped the content of task cells to save memory. + ContentDropped, + /// Unloaded the task completely to save memory. This disconnects the task + /// from the graph and only makes sense when the task isn't currently + /// active. + Unloaded, +} + impl Task { pub(crate) fn new_persistent( id: TaskId, @@ -481,6 +502,14 @@ impl Task { } } + pub(crate) fn is_once(&self) -> bool { + match &self.ty { + TaskType::Persistent { .. } => false, + TaskType::Root(_) => false, + TaskType::Once(_) => true, + } + } + pub(crate) fn set_root( id: TaskId, backend: &MemoryBackend, @@ -669,6 +698,7 @@ impl Task { Scheduled { ref mut event, ref mut outdated_edges, + clean, } => { let event = event.take(); let outdated_edges = *take(outdated_edges); @@ -676,6 +706,7 @@ impl Task { state.state_type = InProgress(Box::new(InProgressState { event, count_as_finished: false, + clean, outdated_edges, outdated_collectibles, new_children: Default::default(), @@ -865,7 +896,7 @@ impl Task { &self, duration: Duration, memory_usage: usize, - generation: u32, + generation: NonZeroU32, stateful: bool, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, @@ -889,6 +920,7 @@ impl Task { ref mut outdated_edges, ref mut outdated_collectibles, ref mut new_children, + clean: _, }) => { let event = event.take(); let mut outdated_edges = take(outdated_edges); @@ -953,6 +985,7 @@ impl Task { state.state_type = Scheduled { event, outdated_edges: Box::new(outdated_edges), + clean: false, }; schedule_task = true; } @@ -983,15 +1016,6 @@ impl Task { &self, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) { - self.make_dirty_internal(false, backend, turbo_tasks); - } - - fn make_dirty_internal( - &self, - force_schedule: bool, - backend: &MemoryBackend, - turbo_tasks: &dyn TurboTasksBackendApi, ) { if let TaskType::Once(_) = self.ty { // once task won't become dirty @@ -999,45 +1023,20 @@ impl Task { } let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); - let should_schedule = force_schedule - || query_root_info(&aggregation_context, ActiveQuery::default(), self.id); + let should_schedule = + query_root_info(&aggregation_context, ActiveQuery::default(), self.id); - let state = if force_schedule { - TaskMetaStateWriteGuard::Full(self.full_state_mut()) - } else { - self.state_mut() - }; - if let TaskMetaStateWriteGuard::Full(mut state) = state { + if let TaskMetaStateWriteGuard::Full(mut state) = self.state_mut() { match state.state_type { - Scheduled { .. } | InProgressDirty { .. } => { - // already dirty + Scheduled { ref mut clean, .. } => { + *clean = false; + + // already scheduled drop(state); } - Dirty { - ref mut outdated_edges, - } => { - if force_schedule { - let description = self.get_event_description(); - state.state_type = Scheduled { - event: Event::new(move || { - format!("TaskState({})::event", description()) - }), - outdated_edges: take(outdated_edges), - }; - let change_job = state.aggregation_node.apply_change( - &aggregation_context, - TaskChange { - dirty_tasks_update: vec![(self.id, -1)], - ..Default::default() - }, - ); - drop(state); - change_job.apply(&aggregation_context); - turbo_tasks.schedule(self.id); - } else { - // already dirty - drop(state); - } + Dirty { .. } | InProgressDirty { .. } => { + // already dirty + drop(state); } Done { ref mut edges, .. } => { let outdated_edges = take(edges).into_set(); @@ -1058,6 +1057,7 @@ impl Task { format!("TaskState({})::event", description()) }), outdated_edges: Box::new(outdated_edges), + clean: false, }; drop(state); change_job.apply(&aggregation_context); @@ -1090,6 +1090,7 @@ impl Task { ref mut outdated_edges, ref mut outdated_collectibles, ref mut new_children, + clean: _, }) => { let event = event.take(); let mut outdated_edges = take(outdated_edges); @@ -1138,6 +1139,76 @@ impl Task { aggregation_context.apply_queued_updates(); } + /// Called when the task need to be recomputed because a gc'ed cell was + /// read. + pub(crate) fn recompute( + &self, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) { + let _span = tracing::trace_span!("turbo_tasks::recompute", id = *self.id).entered(); + + // Events that lead to recomputation of non-pure task must not happen + assert!(self.is_pure()); + + let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); + let mut state = self.full_state_mut(); + match state.state_type { + Scheduled { .. } => { + // already scheduled + drop(state); + } + InProgressDirty { .. } | InProgress(..) => { + // already in progress + drop(state); + } + Dirty { + ref mut outdated_edges, + } => { + let description = self.get_event_description(); + state.state_type = Scheduled { + event: Event::new(move || format!("TaskState({})::event", description())), + outdated_edges: take(outdated_edges), + clean: false, + }; + let change_job = state.aggregation_node.apply_change( + &aggregation_context, + TaskChange { + dirty_tasks_update: vec![(self.id, -1)], + ..Default::default() + }, + ); + drop(state); + change_job.apply(&aggregation_context); + turbo_tasks.schedule(self.id); + } + Done { ref mut edges, .. } => { + let outdated_edges = take(edges).into_set(); + // add to dirty lists and potentially schedule + let description = self.get_event_description(); + let change_job = state.aggregation_node.apply_change( + &aggregation_context, + TaskChange { + unfinished: 1, + #[cfg(feature = "track_unfinished")] + unfinished_tasks_update: vec![(self.id, 1)], + ..Default::default() + }, + ); + state.state_type = Scheduled { + event: Event::new(move || format!("TaskState({})::event", description())), + outdated_edges: Box::new(outdated_edges), + clean: true, + }; + drop(state); + change_job.apply(&aggregation_context); + + turbo_tasks.schedule(self.id); + } + } + aggregation_context.apply_queued_updates(); + } + pub(crate) fn schedule_when_dirty_from_aggregation( &self, backend: &MemoryBackend, @@ -1153,6 +1224,7 @@ impl Task { state.state_type = Scheduled { event: Event::new(move || format!("TaskState({})::event", description())), outdated_edges: take(outdated_edges), + clean: false, }; let job = state.aggregation_node.apply_change( &aggregation_context, @@ -1191,17 +1263,6 @@ impl Task { self.make_dirty(backend, turbo_tasks) } - /// Called when the task need to be recomputed because a gc'ed cell was - /// read. - pub(crate) fn recompute( - &self, - backend: &MemoryBackend, - turbo_tasks: &dyn TurboTasksBackendApi, - ) { - let _span = tracing::trace_span!("turbo_tasks::recompute", id = *self.id).entered(); - self.make_dirty_internal(true, backend, turbo_tasks) - } - /// Access to the output cell. pub(crate) fn with_output_mut_if_available( &self, @@ -1219,21 +1280,25 @@ impl Task { &self, index: CellId, gc_queue: Option<&GcQueue>, - func: impl FnOnce(&mut Cell) -> T, + func: impl FnOnce(&mut Cell, bool) -> T, ) -> T { let mut state = self.full_state_mut(); if let Some(gc_queue) = gc_queue { let generation = gc_queue.generation(); if state.gc.on_read(generation) { - gc_queue.task_accessed(self.id); + let _ = gc_queue.task_accessed(self.id); } } + let clean = match state.state_type { + InProgress(box InProgressState { clean, .. }) => clean, + _ => false, + }; let list = state.cells.entry(index.type_id).or_default(); let i = index.index as usize; if list.len() <= i { list.resize_with(i + 1, Default::default); } - func(&mut list[i]) + func(&mut list[i], clean) } /// Access to a cell. @@ -1262,6 +1327,30 @@ impl Task { } } + /// Checks if the task is inactive. Returns false if it's still active. + pub(crate) fn potentially_become_inactive( + &self, + gc_queue: &GcQueue, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> bool { + let aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); + let active = query_root_info(&aggregation_context, ActiveQuery::default(), self.id); + if active { + return false; + } + if let TaskMetaStateWriteGuard::Full(mut state) = self.state_mut() { + if state.gc.generation.is_none() { + let generation = gc_queue.task_inactive(self.id); + state.gc.generation = Some(generation); + } + for child in state.state_type.children() { + gc_queue.task_potentially_no_longer_active(child); + } + } + true + } + pub fn is_pending(&self) -> bool { if let TaskMetaStateReadGuard::Full(state) = self.state() { !matches!(state.state_type, TaskStateType::Done { .. }) @@ -1425,6 +1514,7 @@ impl Task { state.state_type = Scheduled { event, outdated_edges: take(outdated_edges), + clean: false, }; let change_job = state.aggregation_node.apply_change( &aggregation_context, @@ -1506,57 +1596,80 @@ impl Task { aggregation_context.apply_queued_updates(); } - pub(crate) fn run_gc(&self, generation: u32) -> bool { + pub(crate) fn run_gc( + &self, + generation: NonZeroU32, + gc_queue: &GcQueue, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> GcResult { if !self.is_pure() { - return false; + return GcResult::NotPossible; } - let mut cells_to_drop = Vec::new(); + let aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); + let active = query_root_info(&aggregation_context, ActiveQuery::default(), self.id); match self.state_mut() { TaskMetaStateWriteGuard::Full(mut state) => { - if state.gc.generation > generation { - return false; + if let Some(old_gen) = state.gc.generation { + if old_gen > generation { + return GcResult::Stale; + } + } else { + return GcResult::Stale; } + state.gc.generation = None; - match &mut state.state_type { - TaskStateType::Done { stateful, edges: _ } => { - if *stateful { - return false; + if active { + let mut cells_to_drop = Vec::new(); + + match &mut state.state_type { + TaskStateType::Done { stateful, edges: _ } => { + if *stateful { + return GcResult::NotPossible; + } + } + TaskStateType::Dirty { .. } => {} + _ => { + // GC can't run in this state. We will reschedule it when the execution + // completes. + return GcResult::NotPossible; } } - TaskStateType::Dirty { .. } => {} - _ => { - // GC can't run in this state. We will reschedule it when the execution - // completes. - return false; - } - } - // shrinking memory and dropping cells - state.aggregation_node.shrink_to_fit(); - state.output.dependent_tasks.shrink_to_fit(); - state.cells.shrink_to_fit(); - for cells in state.cells.values_mut() { - cells.shrink_to_fit(); - for cell in cells.iter_mut() { - cells_to_drop.extend(cell.gc_content()); - cell.shrink_to_fit(); + // shrinking memory and dropping cells + state.aggregation_node.shrink_to_fit(); + state.output.dependent_tasks.shrink_to_fit(); + state.cells.shrink_to_fit(); + for cells in state.cells.values_mut() { + cells.shrink_to_fit(); + for cell in cells.iter_mut() { + cells_to_drop.extend(cell.gc_content()); + cell.shrink_to_fit(); + } } - } - drop(state); + drop(state); - // Dropping cells outside of the lock - drop(cells_to_drop); + gc_queue.task_gc_active(self.id); - true + // Dropping cells outside of the lock + drop(cells_to_drop); + + GcResult::ContentDropped + } else { + // Task is inactive, unload task + self.unload(state, backend, turbo_tasks); + GcResult::Unloaded + } } TaskMetaStateWriteGuard::Partial(mut state) => { state.aggregation_node.shrink_to_fit(); - false + GcResult::Unloaded } - _ => false, + TaskMetaStateWriteGuard::Unloaded(_) => GcResult::Unloaded, + TaskMetaStateWriteGuard::TemporaryFiller => unreachable!(), } } @@ -1568,8 +1681,6 @@ impl Task { } } - // TODO not used yet, but planned - #[allow(dead_code)] fn unload( &self, mut full_state: FullTaskWriteGuard<'_>, @@ -1646,6 +1757,8 @@ impl Task { None }; + aggregation_node.shrink_to_fit(); + // TODO aggregation_node let unset = false; From 5bfb689f34b758e764eee420be9786ef3f3d508f Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 15 Jul 2024 17:17:55 +0200 Subject: [PATCH 03/73] fix unloading stateful check (#8749) ### Description We need to move up the check so it prevents unloading tasks with state. ### Testing Instructions --- crates/turbo-tasks-memory/src/task.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 4d470de14d71c..8e508e42b6ac2 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -1621,22 +1621,22 @@ impl Task { } state.gc.generation = None; - if active { - let mut cells_to_drop = Vec::new(); - - match &mut state.state_type { - TaskStateType::Done { stateful, edges: _ } => { - if *stateful { - return GcResult::NotPossible; - } - } - TaskStateType::Dirty { .. } => {} - _ => { - // GC can't run in this state. We will reschedule it when the execution - // completes. + match &mut state.state_type { + TaskStateType::Done { stateful, edges: _ } => { + if *stateful { return GcResult::NotPossible; } } + TaskStateType::Dirty { .. } => {} + _ => { + // GC can't run in this state. We will reschedule it when the execution + // completes. + return GcResult::NotPossible; + } + } + + if active { + let mut cells_to_drop = Vec::new(); // shrinking memory and dropping cells state.aggregation_node.shrink_to_fit(); From eb782206888d88d4ef18be399a5014f0bce690f9 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 15 Jul 2024 18:09:43 +0200 Subject: [PATCH 04/73] upgrade deps to avoid conflict with next.js (#8750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description ### Testing Instructions --- Cargo.lock | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e76f324feae71..16dc4aabb6387 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1411,7 +1411,7 @@ dependencies = [ "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap 1.9.3", - "textwrap 0.16.0", + "textwrap 0.16.1", ] [[package]] @@ -4598,7 +4598,7 @@ dependencies = [ "cfg-if", "miette-derive 7.2.0", "owo-colors 4.0.0", - "textwrap 0.16.0", + "textwrap 0.16.1", "thiserror", "unicode-width", ] @@ -6241,9 +6241,9 @@ checksum = "4f851a03551ceefd30132e447f07f96cb7011d6b658374f3aed847333adb5559" [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -6251,14 +6251,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -9358,9 +9356,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", @@ -9642,7 +9640,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.14", + "toml_edit 0.22.15", ] [[package]] @@ -9669,9 +9667,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" dependencies = [ "indexmap 2.2.6", "serde", From e07022d066e81df0ec80d24778724bab3caff1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 16 Jul 2024 03:56:28 +0900 Subject: [PATCH 05/73] feat: Enable tree shaking in next.js (#8523) ### Description - next.js counterpart: https://github.com/vercel/next.js/pull/66689 ### Testing Instructions --- .gitattributes | 1 + .../turbopack-ecmascript/benches/analyzer.rs | 2 +- .../src/analyzer/graph.rs | 3 +- .../src/analyzer/imports.rs | 20 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 3 +- crates/turbopack-ecmascript/src/lib.rs | 8 + crates/turbopack-ecmascript/src/parse.rs | 1 - .../src/references/esm/base.rs | 3 + .../src/references/mod.rs | 9 +- .../src/tree_shake/asset.rs | 2 +- .../src/tree_shake/cjs_finder.rs | 11 - .../src/tree_shake/graph.rs | 165 +- .../src/tree_shake/mod.rs | 129 +- .../src/tree_shake/util.rs | 304 +++- .../tests/tree-shaker/analyzer/1/output.md | 24 + .../tests/tree-shaker/analyzer/2/output.md | 24 + .../tests/tree-shaker/analyzer/3/output.md | 8 + .../analyzer/amphtml-document/input.js | 34 + .../analyzer/amphtml-document/output.md | 580 +++++++ .../tree-shaker/analyzer/app-route/output.md | 15 +- .../tree-shaker/analyzer/complex/output.md | 21 +- .../analyzer/export-named/output.md | 4 +- .../tree-shaker/analyzer/failed-2/output.md | 46 +- .../tree-shaker/analyzer/failed-3/output.md | 170 +- .../analyzer/ipc-evaluate/output.md | 84 +- .../tree-shaker/analyzer/ipc-index/output.md | 170 +- .../tree-shaker/analyzer/let-bug-1/input.js | 44 + .../tree-shaker/analyzer/let-bug-1/output.md | 443 +++++ .../tree-shaker/analyzer/logger/input.js | 44 + .../tree-shaker/analyzer/logger/output.md | 443 +++++ .../analyzer/multi-export/output.md | 4 +- .../tree-shaker/analyzer/nanoid/input.js | 44 + .../tree-shaker/analyzer/nanoid/output.md | 920 ++++++++++ .../analyzer/next-response/input.js | 122 ++ .../analyzer/next-response/output.md | 1145 +++++++++++++ .../analyzer/nextjs-tracer/input.js | 214 +++ .../analyzer/nextjs-tracer/output.md | 1476 +++++++++++++++++ .../tree-shaker/analyzer/node-fetch/input.js | 9 + .../tree-shaker/analyzer/node-fetch/output.md | 262 +++ .../tree-shaker/analyzer/otel-core/input.js | 27 + .../tree-shaker/analyzer/otel-core/output.md | 333 ++++ .../analyzer/route-handler/input.js | 9 + .../analyzer/route-handler/output.md | 230 +++ .../tree-shaker/analyzer/shared-2/output.md | 72 +- .../shared-and-side-effects/output.md | 128 +- .../analyzer/shared-regression/output.md | 72 +- .../analyzer/template-pages/output.md | 489 ++++-- .../analyzer/test-config-1/output.md | 30 + .../tree-shaker/analyzer/typeof-1/input.js | 10 + .../tree-shaker/analyzer/typeof-1/output.md | 282 ++++ .../analyzer/write-order/output.md | 9 + ...e-shake_dynamic-import_input_lib_05eac0.js | 4 +- ...ake_dynamic-import_input_lib_05eac0.js.map | 16 +- ...-shake_export-namespace_input_e0a7d8._.js} | 30 +- ...ke_export-namespace_input_e0a7d8._.js.map} | 26 +- ...-shake_import-namespace_input_87afd8._.js} | 30 +- ...ke_import-namespace_input_87afd8._.js.map} | 22 +- ...hake_require-side-effect_input_fa7732._.js | 4 +- ..._require-side-effect_input_fa7732._.js.map | 20 +- ...ke_tree-shake-test-1_input_index_2951af.js | 4 +- ...ree-shake-test-1_input_index_2951af.js.map | 16 +- crates/turbopack-wasm/src/module_asset.rs | 36 +- crates/turbopack/src/module_options/mod.rs | 2 + .../module_options/module_options_context.rs | 1 + 64 files changed, 8343 insertions(+), 570 deletions(-) delete mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js} (91%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map} (89%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js} (90%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map} (89%) diff --git a/.gitattributes b/.gitattributes index 650dc002a59d5..860411fb2b3c6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ .config/ast-grep/rule-tests/__snapshots__/** linguist-generated=true crates/turbo-tasks-macros-tests/tests/**/*.stderr linguist-generated=true +crates/turbopack-ecmascript/tests/tree-shaker/analyzer/**/output.md linguist-generated=true crates/turbopack-tests/tests/snapshot/**/output/** linguist-generated=true crates/turborepo-lockfiles/fixtures/*.lock text eol=lf diff --git a/crates/turbopack-ecmascript/benches/analyzer.rs b/crates/turbopack-ecmascript/benches/analyzer.rs index 4b70575de1e98..0a94684f5ed9b 100644 --- a/crates/turbopack-ecmascript/benches/analyzer.rs +++ b/crates/turbopack-ecmascript/benches/analyzer.rs @@ -56,7 +56,7 @@ pub fn benchmark(c: &mut Criterion) { program.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); let eval_context = - EvalContext::new(&program, unresolved_mark, top_level_mark, false, None); + EvalContext::new(&program, unresolved_mark, top_level_mark, None); let var_graph = create_graph(&program, &eval_context); let input = BenchInput { diff --git a/crates/turbopack-ecmascript/src/analyzer/graph.rs b/crates/turbopack-ecmascript/src/analyzer/graph.rs index 05dd2f59e6646..8105ae870289f 100644 --- a/crates/turbopack-ecmascript/src/analyzer/graph.rs +++ b/crates/turbopack-ecmascript/src/analyzer/graph.rs @@ -270,13 +270,12 @@ impl EvalContext { module: &Program, unresolved_mark: Mark, top_level_mark: Mark, - skip_namespace: bool, source: Option>>, ) -> Self { Self { unresolved_mark, top_level_mark, - imports: ImportMap::analyze(module, skip_namespace, source), + imports: ImportMap::analyze(module, source), } } diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index 7221c0a710091..ba874d0c3ca44 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -139,8 +139,6 @@ pub(crate) struct ImportMap { pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), - /// User requested the whole module - Namespace, Exports, Part(u32), } @@ -202,16 +200,11 @@ impl ImportMap { } /// Analyze ES import - pub(super) fn analyze( - m: &Program, - skip_namespace: bool, - source: Option>>, - ) -> Self { + pub(super) fn analyze(m: &Program, source: Option>>) -> Self { let mut data = ImportMap::default(); m.visit_with(&mut Analyzer { data: &mut data, - skip_namespace, source, }); @@ -221,7 +214,6 @@ impl ImportMap { struct Analyzer<'a> { data: &'a mut ImportMap, - skip_namespace: bool, source: Option>>, } @@ -233,10 +225,6 @@ impl<'a> Analyzer<'a> { imported_symbol: ImportedSymbol, annotations: ImportAnnotations, ) -> Option { - if self.skip_namespace && matches!(imported_symbol, ImportedSymbol::Namespace) { - return None; - } - let issue_source = self .source .map(|s| IssueSource::from_swc_offsets(s, span.lo.to_usize(), span.hi.to_usize())); @@ -339,7 +327,7 @@ impl Visit for Analyzer<'_> { let i = self.ensure_reference( export.span, export.src.value.clone(), - symbol.unwrap_or(ImportedSymbol::Namespace), + symbol.unwrap_or(ImportedSymbol::Exports), annotations, ); if let Some(i) = i { @@ -455,7 +443,7 @@ fn get_import_symbol_from_import(specifier: &ImportSpecifier) -> ImportedSymbol _ => local.sym.clone(), }), ImportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ImportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ImportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } @@ -465,6 +453,6 @@ fn get_import_symbol_from_export(specifier: &ExportSpecifier) -> ImportedSymbol ImportedSymbol::Symbol(orig_name(orig)) } ExportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ExportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ExportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } diff --git a/crates/turbopack-ecmascript/src/analyzer/mod.rs b/crates/turbopack-ecmascript/src/analyzer/mod.rs index 54f229549a26b..d397d1873a2c3 100644 --- a/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -3588,8 +3588,7 @@ mod tests { let top_level_mark = Mark::new(); m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); - let eval_context = - EvalContext::new(&m, unresolved_mark, top_level_mark, false, None); + let eval_context = EvalContext::new(&m, unresolved_mark, top_level_mark, None); let mut var_graph = create_graph(&m, &eval_context); diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index 114a6d2a218ec..51fc0bc516f36 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -120,6 +120,9 @@ pub enum TreeShakingMode { ReexportsOnly, } +#[turbo_tasks::value(transparent)] +pub struct OptionTreeShaking(pub Option); + #[turbo_tasks::value(shared, serialization = "auto_for_input")] #[derive(PartialOrd, Ord, Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { @@ -139,6 +142,11 @@ pub struct EcmascriptOptions { /// If false, they will reference the whole directory. If true, they won't /// reference anything and lead to an runtime error instead. pub ignore_dynamic_requests: bool, + + /// The list of export names that should make tree shaking bail off. This is + /// required because tree shaking can split imports like `export const + /// runtime = 'edge'` as a separate module. + pub special_exports: Vc>, } #[turbo_tasks::value(serialization = "auto_for_input")] diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index 7fae1353e5cbd..f9a61d0d19643 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -432,7 +432,6 @@ async fn parse_content( &parsed_program, unresolved_mark, top_level_mark, - false, Some(source), ); diff --git a/crates/turbopack-ecmascript/src/references/esm/base.rs b/crates/turbopack-ecmascript/src/references/esm/base.rs index 5286850437a42..8852d61a52442 100644 --- a/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -96,6 +96,7 @@ pub struct EsmAssetReference { pub issue_source: Option>, pub export_name: Option>, pub import_externals: bool, + pub special_exports: Vc>, } /// A list of [EsmAssetReference]s @@ -121,6 +122,7 @@ impl EsmAssetReference { issue_source: Option>, annotations: Value, export_name: Option>, + special_exports: Vc>, import_externals: bool, ) -> Vc { Self::cell(EsmAssetReference { @@ -130,6 +132,7 @@ impl EsmAssetReference { annotations: annotations.into_value(), export_name, import_externals, + special_exports, }) } diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index e284992e9ad58..379b4e5262368 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -353,6 +353,7 @@ struct AnalysisState<'a> { // the object allocation. first_import_meta: bool, tree_shaking_mode: Option, + special_exports: Vc>, import_externals: bool, ignore_dynamic_requests: bool, } @@ -412,6 +413,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let options = raw_module.options; let compile_time_info = raw_module.compile_time_info; let options = options.await?; + let special_exports = options.special_exports; let import_externals = options.import_externals; let origin = Vc::upcast::>(module); @@ -428,7 +430,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let parsed = if let Some(part) = part { let parsed = parse(source, ty, transforms); - let split_data = split(source.ident(), source, parsed); + let split_data = split(source.ident(), source, parsed, special_exports); part_of_module(split_data, part) } else { parse(source, ty, transforms) @@ -576,7 +578,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => Some(ModulePart::exports()), - ImportedSymbol::Namespace => None, }, Some(TreeShakingMode::ReexportsOnly) => match &r.imported_symbol { ImportedSymbol::ModuleEvaluation => { @@ -586,10 +587,10 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => None, - ImportedSymbol::Namespace => None, }, None => None, }, + special_exports, import_externals, ); @@ -814,6 +815,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( first_import_meta: true, tree_shaking_mode: options.tree_shaking_mode, import_externals: options.import_externals, + special_exports: options.special_exports, ignore_dynamic_requests: options.ignore_dynamic_requests, }; @@ -1972,6 +1974,7 @@ async fn handle_free_var_reference( .map(|export| ModulePart::export(export.clone())), None => None, }, + state.special_exports, state.import_externals, ) .resolve() diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index c7b4b7c2d7168..f27d4320f048d 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -23,7 +23,7 @@ use crate::{ /// This type is used for an advanced tree shkaing. #[turbo_tasks::value] pub struct EcmascriptModulePartAsset { - pub(crate) full_module: Vc, + pub full_module: Vc, pub(crate) part: Vc, pub(crate) import_externals: bool, } diff --git a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs deleted file mode 100644 index 9cf44e8983818..0000000000000 --- a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs +++ /dev/null @@ -1,11 +0,0 @@ -use swc_core::ecma::ast::*; - -pub fn contains_cjs(m: &Program) -> bool { - if let Program::Module(m) = m { - if m.body.iter().any(|s| s.is_module_decl()) { - return false; - } - } - - true -} diff --git a/crates/turbopack-ecmascript/src/tree_shake/graph.rs b/crates/turbopack-ecmascript/src/tree_shake/graph.rs index 9531033047db0..b430e2f414008 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/graph.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/graph.rs @@ -13,11 +13,11 @@ use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ - op, ClassDecl, Decl, DefaultDecl, ExportDecl, ExportNamedSpecifier, ExportSpecifier, - Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, ImportSpecifier, - ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, Stmt, VarDecl, - VarDeclKind, VarDeclarator, + op, ClassDecl, Decl, DefaultDecl, ExportAll, ExportDecl, ExportNamedSpecifier, + ExportSpecifier, Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, + ImportSpecifier, ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, + Stmt, VarDecl, VarDeclKind, VarDeclarator, }, atoms::JsWord, utils::{find_pat_ids, private_ident, quote_ident}, @@ -26,7 +26,9 @@ use swc_core::{ use turbo_tasks::RcStr; use super::{ - util::{ids_captured_by, ids_used_by, ids_used_by_ignoring_nested}, + util::{ + collect_top_level_decls, ids_captured_by, ids_used_by, ids_used_by_ignoring_nested, Vars, + }, Key, TURBOPACK_PART_IMPORT_SOURCE, }; use crate::magic_identifier; @@ -191,6 +193,8 @@ pub(super) struct SplitModuleResult { /// Dependency between parts. pub part_deps: FxHashMap>, pub modules: Vec, + + pub star_reexports: Vec, } impl DepGraph { @@ -226,6 +230,11 @@ impl DepGraph { let mut exports = FxHashMap::default(); let mut part_deps = FxHashMap::<_, Vec<_>>::default(); + let star_reexports: Vec<_> = data + .values() + .filter_map(|v| v.content.as_module_decl()?.as_export_all()) + .cloned() + .collect(); let mut modules = vec![]; if groups.graph_ix.is_empty() { @@ -295,7 +304,7 @@ impl DepGraph { let data = data.get(dep_item).unwrap(); for var in data.var_decls.iter() { - if required_vars.remove(var) { + if required_vars.contains(var) { specifiers.push(ImportSpecifier::Named(ImportNamedSpecifier { span: DUMMY_SP, local: var.clone().into(), @@ -370,6 +379,7 @@ impl DepGraph { entrypoints: exports, part_deps, modules, + star_reexports, } } @@ -429,7 +439,7 @@ impl DepGraph { let ix = self.g.get_node(id); if let ItemId::Group(_) = id { - groups.push((vec![id.clone()], FxHashSet::default())); + groups.push((vec![id.clone()], FxHashSet::default(), 1)); global_done.insert(ix); } } @@ -447,7 +457,8 @@ impl DepGraph { global_done.extend(cycle.iter().copied()); - groups.push((ids, Default::default())); + let len = ids.len(); + groups.push((ids, FxHashSet::default(), len)); } } } @@ -482,7 +493,7 @@ impl DepGraph { .count(); if dependant_count >= 2 && count_of_startings >= 2 { - groups.push((vec![id.clone()], FxHashSet::default())); + groups.push((vec![id.clone()], FxHashSet::default(), 1)); global_done.insert(ix as u32); } } @@ -490,11 +501,15 @@ impl DepGraph { loop { let mut changed = false; - for (group, group_done) in &mut groups { - let start = &group[0]; - let start_ix = self.g.get_node(start); - changed |= - add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); + for (group, group_done, init_len) in &mut groups { + // Cycle group + + for i in 0..*init_len { + let start = &group[i]; + let start_ix = self.g.get_node(start); + changed |= + add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); + } } if !changed { @@ -557,6 +572,7 @@ impl DepGraph { unresolved_ctxt: SyntaxContext, top_level_ctxt: SyntaxContext, ) -> (Vec, FxHashMap) { + let top_level_vars = collect_top_level_decls(module); let mut exports = vec![]; let mut items = FxHashMap::default(); let mut ids = vec![]; @@ -697,21 +713,41 @@ impl DepGraph { }); { - let mut used_ids = ids_used_by_ignoring_nested( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - ); + let mut used_ids = if export.decl.is_fn_expr() { + ids_used_by_ignoring_nested( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + ids_used_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + }; + used_ids.read.remove(&default_var.to_id()); used_ids.write.insert(default_var.to_id()); - let captured_ids = - ids_captured_by(&export.decl, unresolved_ctxt, top_level_ctxt); + let mut captured_ids = if export.decl.is_fn_expr() { + ids_captured_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + Vars::default() + }; + captured_ids.read.remove(&default_var.to_id()); + let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, write_vars: used_ids.write, eventual_write_vars: captured_ids.write, var_decls: [default_var.to_id()].into_iter().collect(), - side_effects: true, content: ModuleItem::ModuleDecl(item.clone()), ..Default::default() }; @@ -741,9 +777,14 @@ impl DepGraph { &export.expr, unresolved_ctxt, top_level_ctxt, + &top_level_vars, + ); + let captured_ids = ids_captured_by( + &export.expr, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, ); - let captured_ids = - ids_captured_by(&export.expr, unresolved_ctxt, top_level_ctxt); used_ids.write.insert(default_var.to_id()); @@ -843,11 +884,7 @@ impl DepGraph { kind: ItemIdItemKind::ImportBinding(si as _), }; ids.push(id.clone()); - let local = match s { - ImportSpecifier::Named(s) => s.local.to_id(), - ImportSpecifier::Default(s) => s.local.to_id(), - ImportSpecifier::Namespace(s) => s.local.to_id(), - }; + let local = s.local().to_id(); items.insert( id, ItemData { @@ -875,7 +912,12 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&f.function, unresolved_ctxt, top_level_ctxt); + let vars = ids_used_by( + &f.function, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(f.ident.to_id()); @@ -905,19 +947,19 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt); + let mut vars = + ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt, &top_level_vars); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(c.ident.to_id()); v }; + vars.write.insert(c.ident.to_id()); items.insert( id, ItemData { - is_hoisted: true, - eventual_read_vars: vars.read, - eventual_write_vars: vars.write, - write_vars: var_decls.clone(), + read_vars: vars.read, + write_vars: vars.write, var_decls, content: ModuleItem::Stmt(Stmt::Decl(Decl::Class(c.clone()))), ..Default::default() @@ -937,13 +979,24 @@ impl DepGraph { ids.push(id.clone()); let decl_ids: Vec = find_pat_ids(&decl.name); - let vars = ids_used_by_ignoring_nested( + let vars = ids_used_by( &decl.init, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); let eventual_vars = - ids_captured_by(&decl.init, unresolved_ctxt, top_level_ctxt); + if matches!(decl.init.as_deref(), Some(Expr::Fn(..) | Expr::Arrow(..))) + { + ids_captured_by( + &decl.init, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + Vars::default() + }; let side_effects = vars.found_unresolved; @@ -972,9 +1025,14 @@ impl DepGraph { expr: box Expr::Assign(assign), .. })) => { - let mut used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let mut used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); if assign.op != op!("=") { used_ids.read.extend(used_ids.write.iter().cloned()); @@ -983,6 +1041,7 @@ impl DepGraph { &assign.left, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); used_ids.read.extend(extra_ids.read); used_ids.write.extend(extra_ids.write); @@ -1011,15 +1070,21 @@ impl DepGraph { ModuleItem::ModuleDecl( ModuleDecl::ExportDefaultDecl(..) | ModuleDecl::ExportDefaultExpr(..) - | ModuleDecl::ExportNamed(NamedExport { .. }), + | ModuleDecl::ExportNamed(NamedExport { .. }) + | ModuleDecl::ExportAll(..), ) => {} _ => { // Default to normal - let used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, @@ -1058,10 +1123,10 @@ impl DepGraph { for (local, export_name) in exports { let name = match &export_name { - Some(ModuleExportName::Ident(v)) => v.to_id(), - _ => local.clone(), + Some(ModuleExportName::Ident(v)) => v.sym.clone(), + _ => local.0.clone(), }; - let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.0.clone())); + let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.clone())); ids.push(id.clone()); items.insert( id.clone(), @@ -1078,8 +1143,8 @@ impl DepGraph { type_only: false, with: None, })), - read_vars: [name.clone()].into_iter().collect(), - export: Some(name.0), + read_vars: [local.clone()].into_iter().collect(), + export: Some(name), ..Default::default() }, ); diff --git a/crates/turbopack-ecmascript/src/tree_shake/mod.rs b/crates/turbopack-ecmascript/src/tree_shake/mod.rs index c72b11ecfc1ab..b5eac41e1d3c5 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/mod.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/mod.rs @@ -1,13 +1,16 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Write}; use anyhow::{bail, Result}; use indexmap::IndexSet; use rustc_hash::FxHashMap; use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP, GLOBALS}, - ecma::ast::{ - ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, Program, + ecma::{ + ast::{ + ExportAll, ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, Program, + }, + codegen::{text_writer::JsWriter, Emitter}, }, }; use turbo_tasks::{RcStr, ValueToString, Vc}; @@ -21,7 +24,6 @@ use crate::{analyzer::graph::EvalContext, parse::ParseResult, EcmascriptModuleAs pub mod asset; pub mod chunk_item; -mod cjs_finder; mod graph; pub mod merge; #[cfg(test)] @@ -110,6 +112,10 @@ impl Analyzer<'_> { for id in item.var_decls.iter() { let state = self.vars.entry(id.clone()).or_default(); + if state.declarator.is_none() { + state.declarator = Some(item_id.clone()); + } + if item.is_hoisted { state.last_writes.push(item_id.clone()); } else { @@ -171,7 +177,11 @@ impl Analyzer<'_> { if let Some(declarator) = &state.declarator { if declarator != item_id { // A write also depends on the declaration. - self.g.add_weak_deps(item_id, [declarator].iter().copied()); + if item.side_effects { + self.g.add_strong_deps(item_id, [declarator]); + } else { + self.g.add_weak_deps(item_id, [declarator]); + } } } } @@ -256,6 +266,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_strong_deps(item_id, state.last_writes.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A read also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // For each var in EVENTUAL_WRITE_VARS: @@ -266,6 +283,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_weak_deps(item_id, state.last_reads.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A write also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // (no state update happens, since this is only triggered by @@ -302,6 +326,7 @@ impl Analyzer<'_> { pub(crate) enum Key { ModuleEvaluation, Export(RcStr), + Exports, } /// Converts [Vc] to the index. @@ -312,9 +337,9 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result let key = match &*part { ModulePart::Evaluation => Key::ModuleEvaluation, ModulePart::Export(export) => Key::Export(export.await?.as_str().into()), + ModulePart::Exports => Key::Exports, ModulePart::Internal(part_id) => return Ok(*part_id), ModulePart::Locals - | ModulePart::Exports | ModulePart::Facade | ModulePart::RenamedExport { .. } | ModulePart::RenamedNamespace { .. } => { @@ -322,23 +347,64 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result } }; - let entrypoints = match &result { - SplitResult::Ok { entrypoints, .. } => entrypoints, - _ => bail!("split failed"), + let SplitResult::Ok { + entrypoints, + modules, + .. + } = &result + else { + bail!("split failed") }; - let part_id = match entrypoints.get(&key) { - Some(id) => *id, - None => { - bail!( - "could not find part id for module part {:?} in {:?}", - key, - entrypoints - ) + if let Some(id) = entrypoints.get(&key) { + return Ok(*id); + } + + // This is required to handle `export * from 'foo'` + if let ModulePart::Export(..) = &*part { + if let Some(&v) = entrypoints.get(&Key::Exports) { + return Ok(v); } - }; + } + + let mut dump = String::new(); + + for (idx, m) in modules.iter().enumerate() { + let ParseResult::Ok { + program, + source_map, + .. + } = &*m.await? + else { + bail!("failed to get module") + }; + + { + let mut buf = vec![]; + + { + let wr = JsWriter::new(Default::default(), "\n", &mut buf, None); - Ok(part_id) + let mut emitter = Emitter { + cfg: Default::default(), + comments: None, + cm: source_map.clone(), + wr, + }; + + emitter.emit_program(program).unwrap(); + } + let code = String::from_utf8(buf).unwrap(); + + writeln!(dump, "# Module #{idx}:\n{code}\n\n\n")?; + } + } + + bail!( + "could not find part id for module part {:?} in {:?}\n\nModule dump:\n{dump}", + key, + entrypoints + ) } #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] @@ -355,6 +421,9 @@ pub(crate) enum SplitResult { #[turbo_tasks(trace_ignore)] deps: FxHashMap>, + + #[turbo_tasks(debug_ignore, trace_ignore)] + star_reexports: Vec, }, Failed { parse_result: Vc, @@ -372,7 +441,12 @@ impl PartialEq for SplitResult { #[turbo_tasks::function] pub(super) async fn split_module(asset: Vc) -> Result> { - Ok(split(asset.source().ident(), asset.source(), asset.parse())) + Ok(split( + asset.source().ident(), + asset.source(), + asset.parse(), + asset.options().await?.special_exports, + )) } #[turbo_tasks::function] @@ -380,6 +454,7 @@ pub(super) async fn split( ident: Vc, source: Vc>, parsed: Vc, + special_exports: Vc>, ) -> Result> { let parse_result = parsed.await?; @@ -393,7 +468,7 @@ pub(super) async fn split( .. } => { // If the script file is a common js file, we cannot split the module - if cjs_finder::contains_cjs(program) { + if util::should_skip_tree_shaking(program, &special_exports.await?) { return Ok(SplitResult::Failed { parse_result: parsed, } @@ -419,6 +494,7 @@ pub(super) async fn split( entrypoints, part_deps, modules, + star_reexports, } = dep_graph.split_module(&items); assert_ne!(modules.len(), 0, "modules.len() == 0;\nModule: {module:?}",); @@ -440,7 +516,6 @@ pub(super) async fn split( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - false, Some(source), ); @@ -459,6 +534,7 @@ pub(super) async fn split( entrypoints, deps: part_deps, modules, + star_reexports, } .cell()) } @@ -483,6 +559,7 @@ pub(super) async fn part_of_module( modules, entrypoints, deps, + star_reexports, .. } => { debug_assert_ne!(modules.len(), 0, "modules.len() == 0"); @@ -557,7 +634,6 @@ pub(super) async fn part_of_module( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); return Ok(ParseResult::Ok { @@ -624,12 +700,15 @@ pub(super) async fn part_of_module( ))); } + module.body.extend(star_reexports.iter().map(|export_all| { + ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) + })); + let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); return Ok(ParseResult::Ok { diff --git a/crates/turbopack-ecmascript/src/tree_shake/util.rs b/crates/turbopack-ecmascript/src/tree_shake/util.rs index 79224046c7dd7..050f021e0c65e 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/util.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/util.rs @@ -1,17 +1,22 @@ use std::hash::BuildHasherDefault; use indexmap::IndexSet; -use rustc_hash::FxHasher; +use rustc_hash::{FxHashSet, FxHasher}; use swc_core::{ common::SyntaxContext, ecma::{ ast::{ - AssignTarget, BlockStmtOrExpr, Constructor, ExportNamedSpecifier, ExportSpecifier, - Expr, Function, Id, Ident, MemberExpr, MemberProp, NamedExport, Pat, PropName, + ArrowExpr, AssignPatProp, AssignTarget, ClassDecl, ClassExpr, Constructor, DefaultDecl, + ExportDefaultDecl, ExportNamedSpecifier, ExportSpecifier, Expr, FnDecl, FnExpr, + Function, Id, Ident, ImportSpecifier, MemberExpr, MemberProp, NamedExport, Param, Pat, + Prop, PropName, VarDeclarator, *, }, visit::{noop_visit_type, Visit, VisitWith}, }, }; +use turbo_tasks::RcStr; + +use crate::TURBOPACK_HELPER; #[derive(Debug, Default, Clone, Copy)] enum Mode { @@ -27,10 +32,11 @@ struct Target { } /// A visitor which collects variables which are read or written. -#[derive(Default)] -pub(crate) struct IdentUsageCollector { +pub(crate) struct IdentUsageCollector<'a> { unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, + vars: Vars, is_nested: bool, @@ -39,7 +45,7 @@ pub(crate) struct IdentUsageCollector { mode: Option, } -impl IdentUsageCollector { +impl IdentUsageCollector<'_> { fn with_nested(&mut self, f: impl FnOnce(&mut Self)) { if !self.target.eventual { return; @@ -58,19 +64,13 @@ impl IdentUsageCollector { } } -impl Visit for IdentUsageCollector { +impl Visit for IdentUsageCollector<'_> { fn visit_assign_target(&mut self, n: &AssignTarget) { self.with_mode(Some(Mode::Write), |this| { n.visit_children_with(this); }) } - fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) { - self.with_nested(|this| { - n.visit_children_with(this); - }) - } - fn visit_constructor(&mut self, n: &Constructor) { self.with_nested(|this| { n.visit_children_with(this); @@ -114,6 +114,7 @@ impl Visit for IdentUsageCollector { if n.span.ctxt != self.unresolved && n.span.ctxt != self.top_level && n.span.ctxt != SyntaxContext::empty() + && !self.top_level_vars.contains(&n.to_id()) { return; } @@ -168,6 +169,16 @@ impl Visit for IdentUsageCollector { } } + fn visit_prop(&mut self, n: &Prop) { + match n { + Prop::Shorthand(v) => { + self.with_mode(None, |c| c.visit_ident(v)); + } + + _ => n.visit_children_with(self), + } + } + noop_visit_type!(); } @@ -186,18 +197,26 @@ pub(crate) struct Vars { /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_captured_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_captured_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: false, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -207,18 +226,26 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_used_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -228,23 +255,256 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by_ignoring_nested( +pub(crate) fn ids_used_by_ignoring_nested<'a, N>( n: &N, unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, ) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: false, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars } + +pub struct TopLevelBindingCollector { + bindings: FxHashSet, + is_pat_decl: bool, +} + +impl TopLevelBindingCollector { + fn add(&mut self, i: &Ident) { + self.bindings.insert(i.to_id()); + } +} + +impl Visit for TopLevelBindingCollector { + noop_visit_type!(); + + fn visit_arrow_expr(&mut self, _: &ArrowExpr) {} + + fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) { + node.value.visit_with(self); + + if self.is_pat_decl { + self.add(&node.key); + } + } + + fn visit_class_decl(&mut self, node: &ClassDecl) { + self.add(&node.ident); + } + + fn visit_expr(&mut self, _: &Expr) {} + + fn visit_export_default_decl(&mut self, e: &ExportDefaultDecl) { + match &e.decl { + DefaultDecl::Class(ClassExpr { + ident: Some(ident), .. + }) => { + self.add(ident); + } + DefaultDecl::Fn(FnExpr { + ident: Some(ident), + function: f, + }) if f.body.is_some() => { + self.add(ident); + } + _ => {} + } + } + + fn visit_fn_decl(&mut self, node: &FnDecl) { + self.add(&node.ident); + } + + fn visit_import_specifier(&mut self, node: &ImportSpecifier) { + match node { + ImportSpecifier::Named(s) => self.add(&s.local), + ImportSpecifier::Default(s) => { + self.add(&s.local); + } + ImportSpecifier::Namespace(s) => { + self.add(&s.local); + } + } + } + + fn visit_param(&mut self, node: &Param) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.visit_children_with(self); + self.is_pat_decl = old; + } + + fn visit_pat(&mut self, node: &Pat) { + node.visit_children_with(self); + + if self.is_pat_decl { + if let Pat::Ident(i) = node { + self.add(&i.id) + } + } + } + + fn visit_var_declarator(&mut self, node: &VarDeclarator) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.name.visit_with(self); + + self.is_pat_decl = false; + node.init.visit_with(self); + self.is_pat_decl = old; + } +} + +/// Collects binding identifiers. +pub fn collect_top_level_decls(n: &N) -> FxHashSet +where + N: VisitWith, +{ + let mut v = TopLevelBindingCollector { + bindings: Default::default(), + is_pat_decl: false, + }; + n.visit_with(&mut v); + v.bindings +} + +pub fn should_skip_tree_shaking(m: &Program, special_exports: &[RcStr]) -> bool { + if let Program::Module(m) = m { + for item in m.body.iter() { + match item { + // Skip turbopack helpers. + ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { + with, specifiers, .. + })) => { + if let Some(with) = with.as_deref().and_then(|v| v.as_import_with()) { + for item in with.values.iter() { + if item.key.sym == *TURBOPACK_HELPER { + // Skip tree shaking if the import is from turbopack-helper + return true; + } + } + } + + // TODO(PACK-3150): Tree shaking has a bug related to ModuleExportName::Str + for s in specifiers.iter() { + if let ImportSpecifier::Named(is) = s { + if matches!(is.imported, Some(ModuleExportName::Str(..))) { + return true; + } + } + } + } + + // Tree shaking has a bug related to ModuleExportName::Str + ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport { + src: Some(..), + specifiers, + .. + })) => { + for s in specifiers { + if let ExportSpecifier::Named(es) = s { + if matches!(es.orig, ModuleExportName::Str(..)) + || matches!(es.exported, Some(ModuleExportName::Str(..))) + { + return true; + } + } + } + } + + // Skip sever actions + ModuleItem::Stmt(Stmt::Expr(ExprStmt { + expr: box Expr::Lit(Lit::Str(Str { value, .. })), + .. + })) => { + if value == "use server" { + return true; + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Var(box VarDecl { decls, .. }), + .. + })) => { + for decl in decls { + if let Pat::Ident(name) = &decl.name { + if special_exports.iter().any(|s| **s == *name.sym) { + return true; + } + } + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Fn(f), + .. + })) => { + if special_exports.iter().any(|s| **s == *f.ident.sym) { + return true; + } + } + + _ => {} + } + } + + let mut visitor = UseServerFinder::default(); + m.visit_with(&mut visitor); + if visitor.abort { + return true; + } + + for item in m.body.iter() { + if item.is_module_decl() { + return false; + } + } + } + + true +} + +#[derive(Default)] +struct UseServerFinder { + abort: bool, +} + +impl Visit for UseServerFinder { + fn visit_expr_stmt(&mut self, e: &ExprStmt) { + e.visit_children_with(self); + + if let Expr::Lit(Lit::Str(Str { value, .. })) = &*e.expr { + if value == "use server" { + self.abort = true; + } + } + } + + fn visit_stmt(&mut self, n: &Stmt) { + if self.abort { + return; + } + + n.visit_children_with(self); + } + + noop_visit_type!(); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md index 66a2680795ce9..430e2925c75f8 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,11 +334,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -362,9 +368,11 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; + N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -375,6 +383,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -448,6 +457,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -468,6 +480,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -547,6 +562,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -649,6 +667,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; import { upper } from "module"; function internal() { @@ -670,6 +691,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md index d121155292e1d..6285bac299b2a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md @@ -292,11 +292,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; ``` # Phase 4 ```mermaid @@ -352,11 +355,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; Item15 --> Item1; Item15 --> Item2; Item15 --> Item11; @@ -381,12 +387,14 @@ graph TD N0 --> N6; N1 --> N10; N1 --> N9; + N1 --> N5; N2 --> N9; N2 --> N5; N3 --> N6; N4 --> N6; N4 --> N8; N4 --> N2; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -397,6 +405,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -452,6 +461,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -491,6 +503,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 2 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -570,6 +585,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -651,6 +669,9 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -695,6 +716,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md index eefa42f0d0b7a..710e711c322fa 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md @@ -563,6 +563,7 @@ export { c2_2 }; ``` ## Part 4 ```js +function d1() {} function d2() {} function c1_1() { return c1_2(); @@ -573,6 +574,9 @@ function c1_2() { function c1_3() { return c1_1(d2); } +export { d1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { d2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -589,6 +593,7 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { ``` ## Part 5 ```js +function d3() {} function c2_1() { return c2_2(d3); } @@ -598,6 +603,9 @@ function c2_2() { function c2_3() { return c2_1(); } +export { d3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { c2_1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js new file mode 100644 index 0000000000000..fd849eeea7373 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js @@ -0,0 +1,34 @@ +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; +import Document, { Html, Head, Main, NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +export default MyDocument; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md new file mode 100644 index 0000000000000..2c7f199106f26 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md @@ -0,0 +1,580 @@ +# Items + +Count: 14 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsx` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsxs` + +## Item 4: Stmt 0, `ImportBinding(2)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_Fragment` + +## Item 5: Stmt 1, `ImportOfModule` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 1, `ImportBinding(0)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Document` + +## Item 7: Stmt 1, `ImportBinding(1)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Html` + +## Item 8: Stmt 1, `ImportBinding(2)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Head` + +## Item 9: Stmt 1, `ImportBinding(3)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Main` + +## Item 10: Stmt 1, `ImportBinding(4)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `NextScript` + +## Item 11: Stmt 2, `Normal` + +```js +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} + +``` + +- Declares: `MyDocument` +- Reads: `Document`, `_jsxs`, `_Fragment`, `_jsx`, `Html`, `Head`, `Main`, `NextScript` +- Write: `Document`, `MyDocument` + +## Item 12: Stmt 3, `Normal` + +```js +export default MyDocument; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `MyDocument` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item12; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #5), "default"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(1, ImportOfModule)]"]; + N4["Items: [ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(0, ImportBinding(2)), ItemId(1, ImportBinding(0)), ItemId(1, ImportBinding(1)), ItemId(1, ImportBinding(2)), ItemId(1, ImportBinding(3)), ItemId(1, ImportBinding(4)), ItemId(2, Normal), ItemId(3, Normal)]"]; + N0 --> N2; + N0 --> N3; + N0 --> N4; + N1 --> N4; + N3 --> N2; + N4 --> N2; + N4 --> N3; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import "react/jsx-runtime"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import 'next/document'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { jsx as _jsx } from "react/jsx-runtime"; +import { jsxs as _jsxs } from "react/jsx-runtime"; +import { Fragment as _Fragment } from "react/jsx-runtime"; +import Document from 'next/document'; +import { Html } from 'next/document'; +import { Head } from 'next/document'; +import { Main } from 'next/document'; +import { NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +const __TURBOPACK__default__export__ = MyDocument; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import "react/jsx-runtime"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import 'next/document'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { jsx as _jsx } from "react/jsx-runtime"; +import { jsxs as _jsxs } from "react/jsx-runtime"; +import { Fragment as _Fragment } from "react/jsx-runtime"; +import Document from 'next/document'; +import { Html } from 'next/document'; +import { Head } from 'next/document'; +import { Main } from 'next/document'; +import { NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +const __TURBOPACK__default__export__ = MyDocument; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md index b797be2842de7..aebdcef2eb057 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md @@ -103,7 +103,7 @@ const routeModule = new AppRouteRouteModule({ - Side effects - Declares: `routeModule` - Reads: `AppRouteRouteModule`, `RouteKind`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `routeModule`, `RouteKind`, `userland` ## Item 10: Stmt 5, `VarDeclarator(0)` @@ -142,6 +142,7 @@ function patchFetch() { - Declares: `patchFetch` - Reads (eventual): `_patchFetch`, `serverHooks`, `staticGenerationAsyncStorage` - Write: `patchFetch` +- Write (eventual): `serverHooks`, `staticGenerationAsyncStorage` # Phase 1 ```mermaid @@ -282,6 +283,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; ``` # Phase 4 ```mermaid @@ -335,6 +338,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; Item13 --> Item1; Item13 --> Item2; Item13 --> Item3; @@ -368,6 +373,8 @@ graph TD N4 --> N12; N6 --> N11; N6 --> N12; + N6 --> N4; + N6 --> N3; N8 --> N7; N9 --> N7; N9 --> N8; @@ -477,6 +484,12 @@ import "__TURBOPACK_PART__" assert { import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { patchFetch as patchFetch }; import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; function patchFetch() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md index 7929d55a7d44b..f48a2d388ce11 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md @@ -281,10 +281,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; ``` # Phase 4 ```mermaid @@ -338,10 +341,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; Item14 --> Item3; Item14 --> Item6; Item14 --> Item9; @@ -371,9 +377,10 @@ graph TD N3 --> N13; N4 --> N13; N4 --> N11; + N4 --> N6; N5 --> N11; - N5 --> N12; N5 --> N6; + N5 --> N12; N7 --> N6; N8 --> N7; N8 --> N6; @@ -463,6 +470,9 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; export { getChimera }; function getChimera() { return cat + dog; @@ -477,12 +487,12 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; import { dog } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; function getDog() { return dog; } @@ -714,6 +724,9 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { getChimera }; function getChimera() { return cat + dog; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md index a19d842625785..9a3b2657607ee 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md @@ -41,6 +41,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 3 ```mermaid @@ -51,6 +52,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 4 ```mermaid @@ -61,8 +63,8 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item3 --> Item1; Item4 --> Item2; + Item3 --> Item1; ``` # Final ```mermaid diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md index 361e8588ef2c0..a08a73695d2e2 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md @@ -465,9 +465,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; ``` # Phase 4 ```mermaid @@ -536,9 +538,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; Item20 --> Item1; Item20 --> Item2; Item20 --> Item3; @@ -555,9 +559,9 @@ graph TD N5["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch")), ItemId(9, Normal)]"]; N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs")), ItemId(11, Normal)]"]; N7["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses")), ItemId(12, Normal)]"]; - N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(14, Normal)]"]; + N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(0, ImportBinding(0)), ItemId(14, Normal)]"]; N9["Items: [ItemId(0, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N10["Items: [ItemId(10, Normal)]"]; + N10["Items: [ItemId(0, ImportBinding(0)), ItemId(10, Normal)]"]; N11["Items: [ItemId(13, Normal)]"]; N2 --> N3; N2 --> N10; @@ -566,6 +570,8 @@ graph TD N5 --> N10; N8 --> N11; N8 --> N9; + N8 --> N10; + N9 --> N10; N10 --> N11; N10 --> N9; N11 --> N9; @@ -782,10 +788,14 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; export { createPostponedAbortSignal }; +import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -796,6 +806,9 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -803,6 +816,9 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -818,9 +834,10 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -830,6 +847,9 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1071,10 +1091,14 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; export { createPostponedAbortSignal }; +import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -1085,6 +1109,9 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1092,6 +1119,9 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -1107,9 +1137,10 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -1119,6 +1150,9 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md index 5220a3ffac6a3..7bf955069a52f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,7 +1638,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1614,29 +1647,38 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; + N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; + N0 --> N9; N0 --> N6; - N0 --> N2; N1 --> N6; + N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N8; + N6 --> N9; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N8; + N7 --> N9; N7 --> N6; + N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N7; + N9 --> N6; ``` # Entrypoints @@ -1668,22 +1710,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1738,6 +1777,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1771,7 +1813,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1806,7 +1848,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1831,6 +1873,9 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -1992,6 +2037,43 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { createConnection } from "node:net"; +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js @@ -2007,22 +2089,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2097,13 +2176,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2149,6 +2228,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2374,6 +2456,28 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + ``` ## Merged (module eval) ```js @@ -2389,13 +2493,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md index adbe2ec572da3..aefe991402113 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md @@ -140,10 +140,10 @@ export const run = async (moduleFactory)=>{ ``` +- Side effects - Declares: `run` -- Reads (eventual): `ipc`, `queue` -- Write: `run` -- Write (eventual): `ipc`, `queue` +- Reads: `ipc`, `queue` +- Write: `run`, `ipc`, `queue` # Phase 1 ```mermaid @@ -171,6 +171,9 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item5 --> Item1; Item7 --> Item5; ``` # Phase 3 @@ -186,9 +189,10 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; ``` # Phase 4 ```mermaid @@ -203,16 +207,24 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; Item6 --> Item1; + Item6 --> Item5; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("run", #2), "run")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("run", #2), "run"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; + N0 --> N2; + N0 --> N3; + N1 --> N3; + N3 --> N2; ``` # Entrypoints @@ -229,13 +241,33 @@ graph TD # Modules (dev) ## Part 0 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; -import "./index"; ``` ## Part 1 ```js +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { run }; + +``` +## Part 2 +```js +import "./index"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -346,7 +378,12 @@ export { run } from "__TURBOPACK_VAR__" assert { ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; ``` @@ -365,13 +402,33 @@ import "./index"; # Modules (prod) ## Part 0 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; -import "./index"; ``` ## Part 1 ```js +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { run }; + +``` +## Part 2 +```js +import "./index"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -482,7 +539,12 @@ export { run } from "__TURBOPACK_VAR__" assert { ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md index 5220a3ffac6a3..7bf955069a52f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,7 +1638,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1614,29 +1647,38 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; + N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; + N0 --> N9; N0 --> N6; - N0 --> N2; N1 --> N6; + N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N8; + N6 --> N9; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N8; + N7 --> N9; N7 --> N6; + N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N7; + N9 --> N6; ``` # Entrypoints @@ -1668,22 +1710,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1738,6 +1777,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1771,7 +1813,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1806,7 +1848,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1831,6 +1873,9 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -1992,6 +2037,43 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { createConnection } from "node:net"; +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js @@ -2007,22 +2089,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2097,13 +2176,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2149,6 +2228,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2374,6 +2456,28 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + ``` ## Merged (module eval) ```js @@ -2389,13 +2493,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js new file mode 100644 index 0000000000000..2f8e8f3d19740 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md new file mode 100644 index 0000000000000..0f1d3e9cf0aa1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md @@ -0,0 +1,443 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; + N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; + N3["Items: [ItemId(0, VarDeclarator(0))]"]; + N4["Items: [ItemId(1, VarDeclarator(0))]"]; + N5["Items: [ItemId(2, VarDeclarator(0))]"]; + N1 --> N3; + N1 --> N5; + N1 --> N4; + N2 --> N3; + N2 --> N4; + N2 --> N5; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "wrapClientComponentLoader", + ): 1, + Export( + "getClientComponentLoaderMetrics", + ): 2, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "wrapClientComponentLoader", + ): 1, + Export( + "getClientComponentLoaderMetrics", + ): 2, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js new file mode 100644 index 0000000000000..831bb0474831b --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md new file mode 100644 index 0000000000000..3a6bcaccb0dcd --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md @@ -0,0 +1,443 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; + N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; + N3["Items: [ItemId(0, VarDeclarator(0))]"]; + N4["Items: [ItemId(1, VarDeclarator(0))]"]; + N5["Items: [ItemId(2, VarDeclarator(0))]"]; + N1 --> N3; + N1 --> N5; + N1 --> N4; + N2 --> N3; + N2 --> N4; + N2 --> N5; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "wrapClientComponentLoader", + ): 1, + Export( + "getClientComponentLoaderMetrics", + ): 2, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "wrapClientComponentLoader", + ): 1, + Export( + "getClientComponentLoaderMetrics", + ): 2, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md index add30fe1a5e6a..9652d7f774d98 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md @@ -45,6 +45,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 3 @@ -58,6 +59,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 4 @@ -71,8 +73,8 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item5 --> Item2; Item4 --> Item1; + Item5 --> Item2; ``` # Final ```mermaid diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js new file mode 100644 index 0000000000000..bf12a2b2e4066 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js @@ -0,0 +1,44 @@ +import crypto from 'crypto' +import { urlAlphabet } from './url-alphabet/index.js' +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} +let random = bytes => { + fillPool((bytes -= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} +let customRandom = (alphabet, size, getRandom) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * size) / alphabet.length) + return () => { + let id = '' + while (true) { + let bytes = getRandom(step) + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) +let nanoid = (size = 21) => { + fillPool((size -= 0)) + let id = '' + for (let i = poolOffset - size; i < poolOffset; i++) { + id += urlAlphabet[pool[i] & 63] + } + return id +} +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md new file mode 100644 index 0000000000000..44516e5f4f8a7 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md @@ -0,0 +1,920 @@ +# Items + +Count: 18 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Declares: `crypto` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Declares: `urlAlphabet` + +## Item 5: Stmt 2, `VarDeclarator(0)` + +```js +const POOL_SIZE_MULTIPLIER = 128; + +``` + +- Declares: `POOL_SIZE_MULTIPLIER` +- Write: `POOL_SIZE_MULTIPLIER` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +let pool, poolOffset; + +``` + +- Declares: `pool` +- Write: `pool` + +## Item 7: Stmt 3, `VarDeclarator(1)` + +```js +let pool, poolOffset; + +``` + +- Declares: `poolOffset` +- Write: `poolOffset` + +## Item 8: Stmt 4, `VarDeclarator(0)` + +```js +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; + +``` + +- Side effects +- Declares: `fillPool` +- Reads: `pool`, `POOL_SIZE_MULTIPLIER`, `crypto`, `poolOffset` +- Write: `fillPool`, `pool`, `crypto`, `poolOffset` + +## Item 9: Stmt 5, `VarDeclarator(0)` + +```js +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; + +``` + +- Declares: `random` +- Reads: `fillPool`, `pool`, `poolOffset` +- Write: `random`, `pool` + +## Item 10: Stmt 6, `VarDeclarator(0)` + +```js +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; + +``` + +- Side effects +- Declares: `customRandom` +- Write: `customRandom` + +## Item 11: Stmt 7, `VarDeclarator(0)` + +```js +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); + +``` + +- Declares: `customAlphabet` +- Reads: `customRandom`, `random` +- Write: `customAlphabet` + +## Item 12: Stmt 8, `VarDeclarator(0)` + +```js +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; + +``` + +- Declares: `nanoid` +- Reads: `fillPool`, `poolOffset`, `urlAlphabet`, `pool` +- Write: `nanoid`, `urlAlphabet`, `pool` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item8; + Item13 --> Item10; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("nanoid", #2), "nanoid"))]"]; + N2["Items: [ItemId(Export(("customAlphabet", #2), "customAlphabet")), ItemId(7, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("customRandom", #2), "customRandom"))]"]; + N4["Items: [ItemId(Export(("urlAlphabet", #2), "urlAlphabet")), ItemId(1, ImportBinding(0))]"]; + N5["Items: [ItemId(Export(("random", #2), "random"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, ImportOfModule)]"]; + N8["Items: [ItemId(3, VarDeclarator(0))]"]; + N9["Items: [ItemId(3, VarDeclarator(1))]"]; + N10["Items: [ItemId(0, ImportBinding(0)), ItemId(2, VarDeclarator(0)), ItemId(4, VarDeclarator(0))]"]; + N11["Items: [ItemId(5, VarDeclarator(0))]"]; + N12["Items: [ItemId(6, VarDeclarator(0))]"]; + N13["Items: [ItemId(1, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N0 --> N6; + N0 --> N7; + N0 --> N10; + N0 --> N12; + N1 --> N13; + N2 --> N12; + N2 --> N11; + N3 --> N12; + N4 --> N13; + N5 --> N11; + N7 --> N6; + N10 --> N8; + N10 --> N9; + N10 --> N6; + N10 --> N7; + N11 --> N10; + N11 --> N8; + N11 --> N9; + N12 --> N6; + N12 --> N7; + N12 --> N10; + N13 --> N10; + N13 --> N9; + N13 --> N11; + N13 --> N8; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "customAlphabet", + ): 2, + Export( + "customRandom", + ): 3, + Export( + "urlAlphabet", + ): 4, + Export( + "random", + ): 5, + Export( + "nanoid", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 2 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { customAlphabet as customAlphabet }; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { customRandom as customRandom }; + +``` +## Part 4 +```js +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { urlAlphabet as urlAlphabet }; +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 6 +```js +import 'crypto'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import './url-alphabet/index.js'; + +``` +## Part 8 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import crypto from 'crypto'; +const POOL_SIZE_MULTIPLIER = 128; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { urlAlphabet } from './url-alphabet/index.js'; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "customAlphabet", + ): 2, + Export( + "customRandom", + ): 3, + Export( + "urlAlphabet", + ): 4, + Export( + "random", + ): 5, + Export( + "nanoid", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 2 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { customAlphabet as customAlphabet }; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { customRandom as customRandom }; + +``` +## Part 4 +```js +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { urlAlphabet as urlAlphabet }; +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 6 +```js +import 'crypto'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import './url-alphabet/index.js'; + +``` +## Part 8 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import crypto from 'crypto'; +const POOL_SIZE_MULTIPLIER = 128; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { urlAlphabet } from './url-alphabet/index.js'; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js new file mode 100644 index 0000000000000..355cd43370ea1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js @@ -0,0 +1,122 @@ +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +const INTERNALS = Symbol('internal response'); +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +/** + * This class extends the [Web `Response` API](https://developer.mozilla.org/docs/Web/API/Response) with additional convenience methods. + * + * Read more: [Next.js Docs: `NextResponse`](https://nextjs.org/docs/app/api-reference/functions/next-response) + */ export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + // rest of props come from Response + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +//# sourceMappingURL=response.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md new file mode 100644 index 0000000000000..22e0b2e3ef8c9 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md @@ -0,0 +1,1145 @@ +# Items + +Count: 17 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Declares: `stringifyCookie` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Declares: `NextURL` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `toNodeOutgoingHttpHeaders` + +## Item 7: Stmt 2, `ImportBinding(1)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `validateURL` + +## Item 8: Stmt 3, `ImportOfModule` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Side effects + +## Item 9: Stmt 3, `ImportBinding(0)` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Declares: `ReflectAdapter` + +## Item 10: Stmt 4, `ImportOfModule` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Side effects + +## Item 11: Stmt 4, `ImportBinding(0)` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Declares: `ResponseCookies` + +## Item 12: Stmt 5, `VarDeclarator(0)` + +```js +const INTERNALS = Symbol('internal response'); + +``` + +- Side effects +- Declares: `INTERNALS` +- Write: `INTERNALS` + +## Item 13: Stmt 6, `VarDeclarator(0)` + +```js +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); + +``` + +- Side effects +- Declares: `REDIRECTS` +- Write: `REDIRECTS` + +## Item 14: Stmt 7, `Normal` + +```js +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} + +``` + +- Hoisted +- Declares: `handleMiddlewareField` +- Write: `handleMiddlewareField` + +## Item 15: Stmt 8, `Normal` + +```js +export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +``` + +- Declares: `NextResponse` +- Reads: `ResponseCookies`, `stringifyCookie`, `handleMiddlewareField`, `ReflectAdapter`, `INTERNALS`, `NextURL`, `toNodeOutgoingHttpHeaders`, `NextResponse`, `REDIRECTS`, `validateURL` +- Write: `ReflectAdapter`, `REDIRECTS`, `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("NextResponse", #2), "NextResponse")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(2, ImportBinding(1)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(7, Normal), ItemId(8, Normal)]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(1, ImportOfModule)]"]; + N4["Items: [ItemId(2, ImportOfModule)]"]; + N5["Items: [ItemId(3, ImportOfModule)]"]; + N6["Items: [ItemId(4, ImportOfModule)]"]; + N7["Items: [ItemId(5, VarDeclarator(0))]"]; + N8["Items: [ItemId(6, VarDeclarator(0))]"]; + N0 --> N2; + N0 --> N3; + N0 --> N4; + N0 --> N5; + N0 --> N6; + N0 --> N7; + N0 --> N8; + N1 --> N7; + N1 --> N8; + N3 --> N2; + N4 --> N2; + N4 --> N3; + N5 --> N2; + N5 --> N3; + N5 --> N4; + N6 --> N2; + N6 --> N3; + N6 --> N4; + N6 --> N5; + N7 --> N2; + N7 --> N3; + N7 --> N4; + N7 --> N5; + N7 --> N6; + N8 --> N2; + N8 --> N3; + N8 --> N4; + N8 --> N5; + N8 --> N6; + N8 --> N7; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "NextResponse", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { NextResponse }; +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders } from '../utils'; +import { validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import '../next-url'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import '../utils'; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import './adapters/reflect'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './cookies'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "NextResponse", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { NextResponse }; +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders } from '../utils'; +import { validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import '../next-url'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import '../utils'; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import './adapters/reflect'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './cookies'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js new file mode 100644 index 0000000000000..3fafa47598599 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js @@ -0,0 +1,214 @@ +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; +let api; +// we want to allow users to use their own version of @opentelemetry/api if they +// want to, so we try to require it first, and if it fails we fall back to the +// version that is bundled with Next.js +// this is because @opentelemetry/api has to be synced with the version of +// @opentelemetry/tracing that is used, and we don't want to force users to use +// the version that is bundled with Next.js. +// the API is ~stable, so this should be fine +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +/** we use this map to propagate attributes from nested spans to the top span */ const rootSpanAttributesStore = new Map(); +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + /** + * Returns an instance to the trace with configured name. + * Since wrap / trace can be defined in any place prior to actual trace subscriber initialization, + * This should be lazily evaluated. + */ getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + // Active span is already set, too late to propagate. + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + // coerce options form overload + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + // Trying to get active scoped span to assign parent. If option specifies parent span manually, will try to use it. + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + // If there's error make sure it throws + return result.then((res)=>{ + span.end(); + // Need to pass down the promise result, + // it could be react stream response with error { error, stream } + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { getTracer, SpanStatusCode, SpanKind }; + +//# sourceMappingURL=tracer.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md new file mode 100644 index 0000000000000..463c3196a4ad6 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md @@ -0,0 +1,1476 @@ +# Items + +Count: 23 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `LogSpanAllowList` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `NextVanillaSpanAllowlist` + +## Item 4: Stmt 1, `VarDeclarator(0)` + +```js +let api; + +``` + +- Declares: `api` +- Write: `api` + +## Item 5: Stmt 2, `Normal` + +```js +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` + +- Side effects +- Write: `api` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; + +``` + +- Declares: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` +- Reads: `api` +- Write: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` + +## Item 7: Stmt 4, `VarDeclarator(0)` + +```js +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; + +``` + +- Declares: `isPromise` +- Write: `isPromise` + +## Item 8: Stmt 5, `Normal` + +```js +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} + +``` + +- Declares: `BubbledError` +- Write: `BubbledError` + +## Item 9: Stmt 6, `Normal` + +```js +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} + +``` + +- Hoisted +- Declares: `isBubbledError` +- Reads (eventual): `BubbledError` +- Write: `isBubbledError` + +## Item 10: Stmt 7, `VarDeclarator(0)` + +```js +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; + +``` + +- Declares: `closeSpanWithError` +- Reads: `isBubbledError`, `SpanStatusCode` +- Write: `closeSpanWithError`, `SpanStatusCode` + +## Item 11: Stmt 8, `VarDeclarator(0)` + +```js +const rootSpanAttributesStore = new Map(); + +``` + +- Side effects +- Declares: `rootSpanAttributesStore` +- Write: `rootSpanAttributesStore` + +## Item 12: Stmt 9, `VarDeclarator(0)` + +```js +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); + +``` + +- Declares: `rootSpanIdKey` +- Reads: `api` +- Write: `rootSpanIdKey`, `api` + +## Item 13: Stmt 10, `VarDeclarator(0)` + +```js +let lastSpanId = 0; + +``` + +- Declares: `lastSpanId` +- Write: `lastSpanId` + +## Item 14: Stmt 11, `VarDeclarator(0)` + +```js +const getSpanId = ()=>lastSpanId++; + +``` + +- Declares: `getSpanId` +- Reads: `lastSpanId` +- Write: `getSpanId` + +## Item 15: Stmt 12, `VarDeclarator(0)` + +```js +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; + +``` + +- Declares: `clientTraceDataSetter` +- Write: `clientTraceDataSetter` + +## Item 16: Stmt 13, `Normal` + +```js +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} + +``` + +- Declares: `NextTracerImpl` +- Reads: `trace`, `context`, `propagation`, `clientTraceDataSetter`, `NextVanillaSpanAllowlist`, `ROOT_CONTEXT`, `getSpanId`, `rootSpanIdKey`, `rootSpanAttributesStore`, `LogSpanAllowList`, `closeSpanWithError`, `isPromise` +- Write: `trace`, `context`, `propagation`, `NextVanillaSpanAllowlist`, `rootSpanAttributesStore`, `LogSpanAllowList`, `NextTracerImpl` + +## Item 17: Stmt 14, `VarDeclarator(0)` + +```js +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); + +``` + +- Declares: `getTracer` +- Reads: `NextTracerImpl` +- Write: `getTracer` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; + Item18 --> Item1; + Item18 --> Item5; + Item18 --> Item11; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("BubbledError", #2), "BubbledError"))]"]; + N2["Items: [ItemId(Export(("isBubbledError", #2), "isBubbledError"))]"]; + N3["Items: [ItemId(Export(("getTracer", #2), "getTracer")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(4, VarDeclarator(0)), ItemId(9, VarDeclarator(0)), ItemId(10, VarDeclarator(0)), ItemId(11, VarDeclarator(0)), ItemId(12, VarDeclarator(0)), ItemId(13, Normal), ItemId(14, VarDeclarator(0))]"]; + N4["Items: [ItemId(Export(("SpanStatusCode", #2), "SpanStatusCode"))]"]; + N5["Items: [ItemId(Export(("SpanKind", #2), "SpanKind"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, VarDeclarator(0))]"]; + N8["Items: [ItemId(2, Normal)]"]; + N9["Items: [ItemId(3, VarDeclarator(0))]"]; + N10["Items: [ItemId(5, Normal)]"]; + N11["Items: [ItemId(6, Normal)]"]; + N12["Items: [ItemId(7, VarDeclarator(0))]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N0 --> N6; + N0 --> N8; + N0 --> N13; + N1 --> N10; + N2 --> N11; + N3 --> N8; + N3 --> N7; + N3 --> N9; + N3 --> N13; + N3 --> N12; + N4 --> N12; + N4 --> N9; + N5 --> N9; + N8 --> N7; + N8 --> N6; + N9 --> N8; + N9 --> N7; + N11 --> N10; + N12 --> N11; + N12 --> N9; + N13 --> N6; + N13 --> N8; + N13 --> N10; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "isBubbledError", + ): 2, + Export( + "SpanKind", + ): 5, + Export( + "SpanStatusCode", + ): 4, + Export( + "BubbledError", + ): 1, + Export( + "getTracer", + ): 3, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { BubbledError }; + +``` +## Part 2 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { isBubbledError }; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { getTracer as getTracer }; +import { LogSpanAllowList } from './constants'; +import { NextVanillaSpanAllowlist } from './constants'; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 5 +```js +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanKind as SpanKind }; + +``` +## Part 6 +```js +import './constants'; + +``` +## Part 7 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "isBubbledError", + ): 2, + Export( + "SpanKind", + ): 5, + Export( + "SpanStatusCode", + ): 4, + Export( + "BubbledError", + ): 1, + Export( + "getTracer", + ): 3, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { BubbledError }; + +``` +## Part 2 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { isBubbledError }; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { getTracer as getTracer }; +import { LogSpanAllowList } from './constants'; +import { NextVanillaSpanAllowlist } from './constants'; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 5 +```js +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanKind as SpanKind }; + +``` +## Part 6 +```js +import './constants'; + +``` +## Part 7 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js new file mode 100644 index 0000000000000..dbdeaab4b2c2a --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js @@ -0,0 +1,9 @@ +import Stream from 'node:stream'; + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +function fetch(){ + +} + +export default fetch; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md new file mode 100644 index 0000000000000..135b4158e41d0 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md @@ -0,0 +1,262 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Declares: `Stream` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +``` + +- Declares: `streamDestructionSupported` +- Reads: `Stream` +- Write: `streamDestructionSupported`, `Stream` + +## Item 4: Stmt 2, `Normal` + +```js +function fetch() {} + +``` + +- Hoisted +- Declares: `fetch` +- Write: `fetch` + +## Item 5: Stmt 3, `Normal` + +```js +export default fetch; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `fetch` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; + Item6 --> Item1; + Item6 --> Item5; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #4), "default"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(2, Normal), ItemId(3, Normal)]"]; + N0 --> N2; + N0 --> N3; + N1 --> N3; + N3 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import 'node:stream'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function fetch() {} +const __TURBOPACK__default__export__ = fetch; +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import 'node:stream'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function fetch() {} +const __TURBOPACK__default__export__ = fetch; +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js new file mode 100644 index 0000000000000..0d99a1926bc63 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { DEFAULT_ENVIRONMENT, parseEnvironment, } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +/** + * Gets the environment variables + */ +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md new file mode 100644 index 0000000000000..4db54d1c99408 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md @@ -0,0 +1,333 @@ +# Items + +Count: 10 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `DEFAULT_ENVIRONMENT` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `parseEnvironment` + +## Item 4: Stmt 1, `ImportOfModule` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Side effects + +## Item 5: Stmt 1, `ImportBinding(0)` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Declares: `_globalThis` + +## Item 6: Stmt 2, `Normal` + +```js +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} + +``` + +- Hoisted +- Declares: `getEnv` +- Reads (eventual): `parseEnvironment`, `_globalThis`, `DEFAULT_ENVIRONMENT` +- Write: `getEnv` + +## Item 7: Stmt 3, `Normal` + +```js +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} + +``` + +- Hoisted +- Declares: `getEnvWithoutDefaults` +- Reads (eventual): `parseEnvironment`, `_globalThis` +- Write: `getEnvWithoutDefaults` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; + Item8 --> Item1; + Item8 --> Item2; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("getEnv", #2), "getEnv")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(2, Normal)]"]; + N2["Items: [ItemId(Export(("getEnvWithoutDefaults", #2), "getEnvWithoutDefaults")), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(3, Normal)]"]; + N1 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getEnv", + ): 1, + Export( + "getEnvWithoutDefaults", + ): 2, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import '../../utils/environment'; +import './globalThis'; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { getEnv }; +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { getEnvWithoutDefaults }; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import '../../utils/environment'; +import './globalThis'; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getEnv", + ): 1, + Export( + "getEnvWithoutDefaults", + ): 2, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import '../../utils/environment'; +import './globalThis'; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { getEnv }; +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { getEnvWithoutDefaults }; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import '../../utils/environment'; +import './globalThis'; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js new file mode 100644 index 0000000000000..3fa42f80742e1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js @@ -0,0 +1,9 @@ +import { NextResponse } from "next/server"; + +export const GET = (req) => { + return NextResponse.json({ + pathname: req.nextUrl.pathname, + }); +}; + +export const runtime = "edge"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md new file mode 100644 index 0000000000000..2307f5511fcdd --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md @@ -0,0 +1,230 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +export const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; + +``` + +- Declares: `GET` +- Reads: `NextResponse` +- Write: `GET`, `NextResponse` + +## Item 4: Stmt 2, `VarDeclarator(0)` + +```js +export const runtime = "edge"; + +``` + +- Declares: `runtime` +- Write: `runtime` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; + Item5 --> Item1; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("runtime", #2), "runtime")), ItemId(2, VarDeclarator(0))]"]; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "runtime", + ): 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import "next/server"; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from "next/server"; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { runtime }; +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "next/server"; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "runtime", + ): 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import "next/server"; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from "next/server"; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { runtime }; +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "next/server"; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md index ac5007085d28d..58d4e9bf57df7 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `shared`, `random`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -216,19 +219,21 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("a", #2), "a"))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N7; + N2 --> N9; + N3 --> N9; N3 --> N7; N5 --> N4; N6 --> N5; @@ -239,6 +244,7 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; + N9 --> N7; ``` # Entrypoints @@ -286,21 +292,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -377,6 +379,20 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js @@ -438,21 +454,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -529,6 +541,20 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md index c20663c4e6941..d20024f8ad715 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md @@ -66,7 +66,7 @@ const shared = { - Declares: `shared` - Reads: `value`, `value2`, `value3` -- Write: `shared` +- Write: `shared`, `value`, `value2`, `value3` ## Item 7: Stmt 6, `Normal` @@ -90,7 +90,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 9: Stmt 8, `VarDeclarator(0)` @@ -104,7 +104,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -163,7 +163,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -205,7 +208,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -247,7 +253,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; Item10 --> Item1; @@ -260,8 +269,8 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(6, Normal)]"]; - N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(7, VarDeclarator(0))]"]; + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("a", #2), "a"))]"]; N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(8, VarDeclarator(0))]"]; N3["Items: [ItemId(0, Normal)]"]; N4["Items: [ItemId(1, VarDeclarator(0))]"]; @@ -269,14 +278,18 @@ graph TD N6["Items: [ItemId(3, Normal)]"]; N7["Items: [ItemId(4, VarDeclarator(0))]"]; N8["Items: [ItemId(5, VarDeclarator(0))]"]; + N9["Items: [ItemId(6, Normal)]"]; + N10["Items: [ItemId(7, VarDeclarator(0))]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N6; N0 --> N7; - N0 --> N8; - N1 --> N8; + N0 --> N9; + N1 --> N10; + N2 --> N10; N2 --> N8; + N2 --> N9; N4 --> N3; N5 --> N3; N5 --> N4; @@ -290,6 +303,14 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N7; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N6; + N9 --> N7; + N10 --> N8; + N10 --> N9; ``` # Entrypoints @@ -324,33 +345,31 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; "module evaluation"; -console.log(shared); ``` ## Part 1 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; export { b }; const b = { shared, @@ -446,8 +465,11 @@ export { shared } from "__TURBOPACK_VAR__" assert { }; ``` -## Merged (module eval) +## Part 9 ```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; @@ -463,11 +485,47 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +console.log(shared); + +``` +## Part 10 +```js import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -console.log(shared); ``` # Entrypoints @@ -512,21 +570,17 @@ console.log(shared); ``` ## Part 1 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -624,6 +678,20 @@ export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md index ac5007085d28d..58d4e9bf57df7 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `shared`, `random`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -216,19 +219,21 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("a", #2), "a"))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N7; + N2 --> N9; + N3 --> N9; N3 --> N7; N5 --> N4; N6 --> N5; @@ -239,6 +244,7 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; + N9 --> N7; ``` # Entrypoints @@ -286,21 +292,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -377,6 +379,20 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js @@ -438,21 +454,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -529,6 +541,20 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md index 7b1d2a8064a9b..0f5de8624b5b6 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md @@ -266,7 +266,7 @@ export const routeModule = new PagesRouteModule({ - Declares: `routeModule` - Reads: `PagesRouteModule`, `RouteKind`, `App`, `Document`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `routeModule`, `RouteKind`, `App`, `Document`, `userland` # Phase 1 ```mermaid @@ -438,6 +438,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -551,6 +563,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -664,6 +688,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -682,23 +718,22 @@ graph TD Item25 --> Item5; Item25 --> Item6; Item25 --> Item13; - Item26 --> Item13; ``` # Final ```mermaid graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; - N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; - N5["Items: [ItemId(Export(("config", #2), "config")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; - N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; - N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; - N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; - N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; - N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; - N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps"))]"]; + N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths"))]"]; + N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps"))]"]; + N5["Items: [ItemId(Export(("config", #2), "config"))]"]; + N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals"))]"]; + N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps"))]"]; + N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths"))]"]; + N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams"))]"]; + N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps"))]"]; + N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps"))]"]; N12["Items: [ItemId(Export(("routeModule", #2), "routeModule")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(17, VarDeclarator(0))]"]; N13["Items: [ItemId(0, ImportOfModule)]"]; N14["Items: [ItemId(1, ImportOfModule)]"]; @@ -707,6 +742,16 @@ graph TD N17["Items: [ItemId(4, ImportOfModule)]"]; N18["Items: [ItemId(5, ImportOfModule)]"]; N19["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(6, Normal)]"]; + N20["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; + N21["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N22["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; + N23["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; + N24["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; + N25["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; + N26["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; + N27["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; + N28["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; + N29["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N0 --> N13; N0 --> N14; N0 --> N15; @@ -715,17 +760,27 @@ graph TD N0 --> N18; N0 --> N19; N1 --> N19; - N2 --> N19; - N3 --> N19; - N4 --> N19; - N5 --> N19; - N6 --> N19; - N7 --> N19; - N8 --> N19; - N9 --> N19; - N10 --> N19; - N11 --> N19; + N2 --> N20; + N3 --> N21; + N4 --> N22; + N5 --> N23; + N6 --> N24; + N7 --> N25; + N8 --> N26; + N9 --> N27; + N10 --> N28; + N11 --> N29; + N12 --> N29; N12 --> N19; + N12 --> N20; + N12 --> N21; + N12 --> N22; + N12 --> N23; + N12 --> N24; + N12 --> N25; + N12 --> N26; + N12 --> N27; + N12 --> N28; N14 --> N13; N15 --> N13; N15 --> N14; @@ -741,12 +796,22 @@ graph TD N18 --> N15; N18 --> N16; N18 --> N17; + N19 --> N29; N19 --> N13; N19 --> N14; N19 --> N15; N19 --> N16; N19 --> N17; N19 --> N18; + N20 --> N29; + N21 --> N29; + N22 --> N29; + N23 --> N29; + N24 --> N29; + N25 --> N29; + N26 --> N29; + N27 --> N29; + N28 --> N29; ``` # Entrypoints @@ -830,209 +895,119 @@ export { __TURBOPACK__default__export__ as default }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 }; export { getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 }; export { getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 4 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 }; export { getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 5 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 }; export { config }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { config } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 6 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 }; export { reportWebVitals }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 7 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 }; export { unstable_getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; export { unstable_getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 }; export { unstable_getStaticParams }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 10 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 }; export { unstable_getServerProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 11 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 }; export { unstable_getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 19 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; export { routeModule }; import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; import { RouteKind } from '../../server/future/route-kind'; @@ -1150,6 +1125,9 @@ import 'VAR_USERLAND'; ``` ## Part 19 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 13 }; @@ -1181,6 +1159,193 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticProps = hoist(userland, 'getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const config = hoist(userland, 'config'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { config } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 29 +```js +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md index 867b54c937d69..03979660b799e 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,11 +334,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -362,9 +368,11 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; + N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -375,6 +383,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -448,6 +457,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -468,6 +480,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -547,6 +562,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -649,6 +667,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; import { upper } from "module"; function internal() { @@ -670,6 +691,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -753,6 +777,9 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; export { external1 }; function internal() { @@ -798,6 +825,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; export { external1 }; function internal() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js new file mode 100644 index 0000000000000..fd7505a005999 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js @@ -0,0 +1,10 @@ +import { NextResponse } from 'next/server' +import { ClientComponent } from '../../ClientComponent' +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent' + +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent, + }) +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md new file mode 100644 index 0000000000000..c6c40bc8c59e7 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md @@ -0,0 +1,282 @@ +# Items + +Count: 9 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Declares: `ClientComponent` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Declares: `MyModuleClientComponent` + +## Item 7: Stmt 3, `Normal` + +```js +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} + +``` + +- Hoisted +- Declares: `GET` +- Reads (eventual): `NextResponse`, `ClientComponent`, `MyModuleClientComponent` +- Write: `GET` +- Write (eventual): `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; + Item8 --> Item1; + Item8 --> Item2; + Item8 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule), ItemId(2, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "GET", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from 'next/server'; +import { ClientComponent } from '../../ClientComponent'; +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "GET", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from 'next/server'; +import { ClientComponent } from '../../ClientComponent'; +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Merged (module eval) +```js +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md index 052eb476d8e5f..c674594a34ad8 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md @@ -171,6 +171,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; ``` # Phase 4 @@ -207,6 +208,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; Item8 --> Item3; Item8 --> Item4; @@ -233,6 +235,7 @@ graph TD N1 --> N9; N1 --> N4; N2 --> N9; + N2 --> N4; N2 --> N1; N3 --> N8; N5 --> N4; @@ -299,6 +302,9 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; @@ -465,6 +471,9 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; export { func }; function func() { order.push("d"); diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js index b496ad7226a0b..c719e831a0c35 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map index 8771340104287..76543693cb889 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG,qOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js similarity index 91% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js index d6d4fa4d32efa..61beca3561f02 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -150,12 +150,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; @@ -197,32 +199,16 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; ; -})()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { -"use strict"; - -__turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] -}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -"__TURBOPACK__ecmascript__hoisting__location__"; -; -; - })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__, - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ + "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__, + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; @@ -260,4 +246,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map index 20adfc3eda1b6..08028c332a04d 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map @@ -20,18 +20,16 @@ {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 165, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 177, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 198, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 219, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, - {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 162, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 167, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 184, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 200, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 215, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 220, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 239, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 244, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js similarity index 90% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js index 281bddcb7f575..0e8d24b6eaeed 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; @@ -188,36 +190,20 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; ; -})()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { -"use strict"; - -__turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] -}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -"__TURBOPACK__ecmascript__hoisting__location__"; -; -; - })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; "module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__.cat); +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__.cat); ; })()), @@ -233,4 +219,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map index a64d074b155f2..bd930bbd92dfd 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map @@ -18,16 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAI,GAAG"}}, - {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 226, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 231, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,8NAAI,GAAG"}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 217, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js index b829c74cc07a9..7bad58454328f 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map index 729da17d345fd..3156e34ae11ad 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map @@ -18,14 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG,6OAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 211, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, + {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js index 00dd5c50b44f6..388520019ef8a 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map index 21f0e7a600376..f088827fe8299 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG,gPAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-wasm/src/module_asset.rs b/crates/turbopack-wasm/src/module_asset.rs index c357e7abaf597..da3381b6923e4 100644 --- a/crates/turbopack-wasm/src/module_asset.rs +++ b/crates/turbopack-wasm/src/module_asset.rs @@ -19,7 +19,6 @@ use turbopack_ecmascript::{ EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, references::async_module::OptionAsyncModule, - EcmascriptModuleAsset, }; use crate::{ @@ -62,24 +61,43 @@ impl WebAssemblyModuleAsset { } #[turbo_tasks::function] - async fn loader(&self) -> Result> { - let query = &*self.source.ident().query().await?; + async fn loader_as_module(self: Vc) -> Result>> { + let this = self.await?; + let query = &*this.source.ident().query().await?; let loader_source = if query == "?module" { - compiling_loader_source(self.source) + compiling_loader_source(this.source) } else { - instantiating_loader_source(self.source) + instantiating_loader_source(this.source) }; - let module = self.asset_context.process( + let module = this.asset_context.process( loader_source, Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(self.source, self.asset_context)), + "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(this.source, this.asset_context)), }))), ).module(); + Ok(module) + } + #[turbo_tasks::function] + async fn loader_as_resolve_origin(self: Vc) -> Result>> { + let module = self.loader_as_module(); + + let Some(esm_asset) = Vc::try_resolve_sidecast::>(module).await? + else { + bail!("WASM loader was not processed into an EcmascriptModuleAsset"); + }; + + Ok(esm_asset) + } + + #[turbo_tasks::function] + async fn loader(self: Vc) -> Result>> { + let module = self.loader_as_module(); + let Some(esm_asset) = - Vc::try_resolve_downcast_type::(module).await? + Vc::try_resolve_sidecast::>(module).await? else { bail!("WASM loader was not processed into an EcmascriptModuleAsset"); }; @@ -156,7 +174,7 @@ impl ResolveOrigin for WebAssemblyModuleAsset { #[turbo_tasks::function] fn get_inner_asset(self: Vc, request: Vc) -> Vc { - self.loader().get_inner_asset(request) + self.loader_as_resolve_origin().get_inner_asset(request) } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index 3eedd7243df0b..6e2570c972361 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -78,6 +78,7 @@ impl ModuleOptions { execution_context, ref rules, esm_url_rewrite_behavior, + special_exports, import_externals, ignore_dynamic_requests, use_swc_css, @@ -122,6 +123,7 @@ impl ModuleOptions { tree_shaking_mode, url_rewrite_behavior: esm_url_rewrite_behavior, import_externals, + special_exports, ignore_dynamic_requests, refresh, ..Default::default() diff --git a/crates/turbopack/src/module_options/module_options_context.rs b/crates/turbopack/src/module_options/module_options_context.rs index 0b4121f69cc6a..41cab2b11815a 100644 --- a/crates/turbopack/src/module_options/module_options_context.rs +++ b/crates/turbopack/src/module_options/module_options_context.rs @@ -141,6 +141,7 @@ pub struct ModuleOptionsContext { pub placeholder_for_future_extensions: (), pub tree_shaking_mode: Option, pub esm_url_rewrite_behavior: Option, + pub special_exports: Vc>, /// References to externals from ESM imports should use `import()` and make /// async modules. pub import_externals: bool, From 99119e25be0f8df7a49a86e78516778b89a805fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 16 Jul 2024 04:06:59 +0900 Subject: [PATCH 06/73] Revert "feat: Enable tree shaking in next.js" (#8752) Reverts vercel/turbo#8523 We need to revert this due to some changes in turbopack code --- .gitattributes | 1 - .../turbopack-ecmascript/benches/analyzer.rs | 2 +- .../src/analyzer/graph.rs | 3 +- .../src/analyzer/imports.rs | 20 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 3 +- crates/turbopack-ecmascript/src/lib.rs | 8 - crates/turbopack-ecmascript/src/parse.rs | 1 + .../src/references/esm/base.rs | 3 - .../src/references/mod.rs | 9 +- .../src/tree_shake/asset.rs | 2 +- .../src/tree_shake/cjs_finder.rs | 11 + .../src/tree_shake/graph.rs | 165 +- .../src/tree_shake/mod.rs | 129 +- .../src/tree_shake/util.rs | 304 +--- .../tests/tree-shaker/analyzer/1/output.md | 24 - .../tests/tree-shaker/analyzer/2/output.md | 24 - .../tests/tree-shaker/analyzer/3/output.md | 8 - .../analyzer/amphtml-document/input.js | 34 - .../analyzer/amphtml-document/output.md | 580 ------- .../tree-shaker/analyzer/app-route/output.md | 15 +- .../tree-shaker/analyzer/complex/output.md | 21 +- .../analyzer/export-named/output.md | 4 +- .../tree-shaker/analyzer/failed-2/output.md | 46 +- .../tree-shaker/analyzer/failed-3/output.md | 170 +- .../analyzer/ipc-evaluate/output.md | 84 +- .../tree-shaker/analyzer/ipc-index/output.md | 170 +- .../tree-shaker/analyzer/let-bug-1/input.js | 44 - .../tree-shaker/analyzer/let-bug-1/output.md | 443 ----- .../tree-shaker/analyzer/logger/input.js | 44 - .../tree-shaker/analyzer/logger/output.md | 443 ----- .../analyzer/multi-export/output.md | 4 +- .../tree-shaker/analyzer/nanoid/input.js | 44 - .../tree-shaker/analyzer/nanoid/output.md | 920 ---------- .../analyzer/next-response/input.js | 122 -- .../analyzer/next-response/output.md | 1145 ------------- .../analyzer/nextjs-tracer/input.js | 214 --- .../analyzer/nextjs-tracer/output.md | 1476 ----------------- .../tree-shaker/analyzer/node-fetch/input.js | 9 - .../tree-shaker/analyzer/node-fetch/output.md | 262 --- .../tree-shaker/analyzer/otel-core/input.js | 27 - .../tree-shaker/analyzer/otel-core/output.md | 333 ---- .../analyzer/route-handler/input.js | 9 - .../analyzer/route-handler/output.md | 230 --- .../tree-shaker/analyzer/shared-2/output.md | 72 +- .../shared-and-side-effects/output.md | 128 +- .../analyzer/shared-regression/output.md | 72 +- .../analyzer/template-pages/output.md | 489 ++---- .../analyzer/test-config-1/output.md | 30 - .../tree-shaker/analyzer/typeof-1/input.js | 10 - .../tree-shaker/analyzer/typeof-1/output.md | 282 ---- .../analyzer/write-order/output.md | 9 - ...e-shake_dynamic-import_input_lib_05eac0.js | 4 +- ...ake_dynamic-import_input_lib_05eac0.js.map | 16 +- ...-shake_export-namespace_input_b4b68a._.js} | 30 +- ...ke_export-namespace_input_b4b68a._.js.map} | 26 +- ...-shake_import-namespace_input_ee0515._.js} | 30 +- ...ke_import-namespace_input_ee0515._.js.map} | 22 +- ...hake_require-side-effect_input_fa7732._.js | 4 +- ..._require-side-effect_input_fa7732._.js.map | 20 +- ...ke_tree-shake-test-1_input_index_2951af.js | 4 +- ...ree-shake-test-1_input_index_2951af.js.map | 16 +- crates/turbopack-wasm/src/module_asset.rs | 36 +- crates/turbopack/src/module_options/mod.rs | 2 - .../module_options/module_options_context.rs | 1 - 64 files changed, 570 insertions(+), 8343 deletions(-) create mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js} (91%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map} (89%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js} (90%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map} (89%) diff --git a/.gitattributes b/.gitattributes index 860411fb2b3c6..650dc002a59d5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ .config/ast-grep/rule-tests/__snapshots__/** linguist-generated=true crates/turbo-tasks-macros-tests/tests/**/*.stderr linguist-generated=true -crates/turbopack-ecmascript/tests/tree-shaker/analyzer/**/output.md linguist-generated=true crates/turbopack-tests/tests/snapshot/**/output/** linguist-generated=true crates/turborepo-lockfiles/fixtures/*.lock text eol=lf diff --git a/crates/turbopack-ecmascript/benches/analyzer.rs b/crates/turbopack-ecmascript/benches/analyzer.rs index 0a94684f5ed9b..4b70575de1e98 100644 --- a/crates/turbopack-ecmascript/benches/analyzer.rs +++ b/crates/turbopack-ecmascript/benches/analyzer.rs @@ -56,7 +56,7 @@ pub fn benchmark(c: &mut Criterion) { program.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); let eval_context = - EvalContext::new(&program, unresolved_mark, top_level_mark, None); + EvalContext::new(&program, unresolved_mark, top_level_mark, false, None); let var_graph = create_graph(&program, &eval_context); let input = BenchInput { diff --git a/crates/turbopack-ecmascript/src/analyzer/graph.rs b/crates/turbopack-ecmascript/src/analyzer/graph.rs index 8105ae870289f..05dd2f59e6646 100644 --- a/crates/turbopack-ecmascript/src/analyzer/graph.rs +++ b/crates/turbopack-ecmascript/src/analyzer/graph.rs @@ -270,12 +270,13 @@ impl EvalContext { module: &Program, unresolved_mark: Mark, top_level_mark: Mark, + skip_namespace: bool, source: Option>>, ) -> Self { Self { unresolved_mark, top_level_mark, - imports: ImportMap::analyze(module, source), + imports: ImportMap::analyze(module, skip_namespace, source), } } diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index ba874d0c3ca44..7221c0a710091 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -139,6 +139,8 @@ pub(crate) struct ImportMap { pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), + /// User requested the whole module + Namespace, Exports, Part(u32), } @@ -200,11 +202,16 @@ impl ImportMap { } /// Analyze ES import - pub(super) fn analyze(m: &Program, source: Option>>) -> Self { + pub(super) fn analyze( + m: &Program, + skip_namespace: bool, + source: Option>>, + ) -> Self { let mut data = ImportMap::default(); m.visit_with(&mut Analyzer { data: &mut data, + skip_namespace, source, }); @@ -214,6 +221,7 @@ impl ImportMap { struct Analyzer<'a> { data: &'a mut ImportMap, + skip_namespace: bool, source: Option>>, } @@ -225,6 +233,10 @@ impl<'a> Analyzer<'a> { imported_symbol: ImportedSymbol, annotations: ImportAnnotations, ) -> Option { + if self.skip_namespace && matches!(imported_symbol, ImportedSymbol::Namespace) { + return None; + } + let issue_source = self .source .map(|s| IssueSource::from_swc_offsets(s, span.lo.to_usize(), span.hi.to_usize())); @@ -327,7 +339,7 @@ impl Visit for Analyzer<'_> { let i = self.ensure_reference( export.span, export.src.value.clone(), - symbol.unwrap_or(ImportedSymbol::Exports), + symbol.unwrap_or(ImportedSymbol::Namespace), annotations, ); if let Some(i) = i { @@ -443,7 +455,7 @@ fn get_import_symbol_from_import(specifier: &ImportSpecifier) -> ImportedSymbol _ => local.sym.clone(), }), ImportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ImportSpecifier::Namespace(..) => ImportedSymbol::Exports, + ImportSpecifier::Namespace(..) => ImportedSymbol::Namespace, } } @@ -453,6 +465,6 @@ fn get_import_symbol_from_export(specifier: &ExportSpecifier) -> ImportedSymbol ImportedSymbol::Symbol(orig_name(orig)) } ExportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ExportSpecifier::Namespace(..) => ImportedSymbol::Exports, + ExportSpecifier::Namespace(..) => ImportedSymbol::Namespace, } } diff --git a/crates/turbopack-ecmascript/src/analyzer/mod.rs b/crates/turbopack-ecmascript/src/analyzer/mod.rs index d397d1873a2c3..54f229549a26b 100644 --- a/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -3588,7 +3588,8 @@ mod tests { let top_level_mark = Mark::new(); m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); - let eval_context = EvalContext::new(&m, unresolved_mark, top_level_mark, None); + let eval_context = + EvalContext::new(&m, unresolved_mark, top_level_mark, false, None); let mut var_graph = create_graph(&m, &eval_context); diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index 51fc0bc516f36..114a6d2a218ec 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -120,9 +120,6 @@ pub enum TreeShakingMode { ReexportsOnly, } -#[turbo_tasks::value(transparent)] -pub struct OptionTreeShaking(pub Option); - #[turbo_tasks::value(shared, serialization = "auto_for_input")] #[derive(PartialOrd, Ord, Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { @@ -142,11 +139,6 @@ pub struct EcmascriptOptions { /// If false, they will reference the whole directory. If true, they won't /// reference anything and lead to an runtime error instead. pub ignore_dynamic_requests: bool, - - /// The list of export names that should make tree shaking bail off. This is - /// required because tree shaking can split imports like `export const - /// runtime = 'edge'` as a separate module. - pub special_exports: Vc>, } #[turbo_tasks::value(serialization = "auto_for_input")] diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index f9a61d0d19643..7fae1353e5cbd 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -432,6 +432,7 @@ async fn parse_content( &parsed_program, unresolved_mark, top_level_mark, + false, Some(source), ); diff --git a/crates/turbopack-ecmascript/src/references/esm/base.rs b/crates/turbopack-ecmascript/src/references/esm/base.rs index 8852d61a52442..5286850437a42 100644 --- a/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -96,7 +96,6 @@ pub struct EsmAssetReference { pub issue_source: Option>, pub export_name: Option>, pub import_externals: bool, - pub special_exports: Vc>, } /// A list of [EsmAssetReference]s @@ -122,7 +121,6 @@ impl EsmAssetReference { issue_source: Option>, annotations: Value, export_name: Option>, - special_exports: Vc>, import_externals: bool, ) -> Vc { Self::cell(EsmAssetReference { @@ -132,7 +130,6 @@ impl EsmAssetReference { annotations: annotations.into_value(), export_name, import_externals, - special_exports, }) } diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index 379b4e5262368..e284992e9ad58 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -353,7 +353,6 @@ struct AnalysisState<'a> { // the object allocation. first_import_meta: bool, tree_shaking_mode: Option, - special_exports: Vc>, import_externals: bool, ignore_dynamic_requests: bool, } @@ -413,7 +412,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( let options = raw_module.options; let compile_time_info = raw_module.compile_time_info; let options = options.await?; - let special_exports = options.special_exports; let import_externals = options.import_externals; let origin = Vc::upcast::>(module); @@ -430,7 +428,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let parsed = if let Some(part) = part { let parsed = parse(source, ty, transforms); - let split_data = split(source.ident(), source, parsed, special_exports); + let split_data = split(source.ident(), source, parsed); part_of_module(split_data, part) } else { parse(source, ty, transforms) @@ -578,6 +576,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => Some(ModulePart::exports()), + ImportedSymbol::Namespace => None, }, Some(TreeShakingMode::ReexportsOnly) => match &r.imported_symbol { ImportedSymbol::ModuleEvaluation => { @@ -587,10 +586,10 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => None, + ImportedSymbol::Namespace => None, }, None => None, }, - special_exports, import_externals, ); @@ -815,7 +814,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( first_import_meta: true, tree_shaking_mode: options.tree_shaking_mode, import_externals: options.import_externals, - special_exports: options.special_exports, ignore_dynamic_requests: options.ignore_dynamic_requests, }; @@ -1974,7 +1972,6 @@ async fn handle_free_var_reference( .map(|export| ModulePart::export(export.clone())), None => None, }, - state.special_exports, state.import_externals, ) .resolve() diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index f27d4320f048d..c7b4b7c2d7168 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -23,7 +23,7 @@ use crate::{ /// This type is used for an advanced tree shkaing. #[turbo_tasks::value] pub struct EcmascriptModulePartAsset { - pub full_module: Vc, + pub(crate) full_module: Vc, pub(crate) part: Vc, pub(crate) import_externals: bool, } diff --git a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs new file mode 100644 index 0000000000000..9cf44e8983818 --- /dev/null +++ b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs @@ -0,0 +1,11 @@ +use swc_core::ecma::ast::*; + +pub fn contains_cjs(m: &Program) -> bool { + if let Program::Module(m) = m { + if m.body.iter().any(|s| s.is_module_decl()) { + return false; + } + } + + true +} diff --git a/crates/turbopack-ecmascript/src/tree_shake/graph.rs b/crates/turbopack-ecmascript/src/tree_shake/graph.rs index b430e2f414008..9531033047db0 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/graph.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/graph.rs @@ -13,11 +13,11 @@ use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ - op, ClassDecl, Decl, DefaultDecl, ExportAll, ExportDecl, ExportNamedSpecifier, - ExportSpecifier, Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, - ImportSpecifier, ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, - ModuleExportName, ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, - Stmt, VarDecl, VarDeclKind, VarDeclarator, + op, ClassDecl, Decl, DefaultDecl, ExportDecl, ExportNamedSpecifier, ExportSpecifier, + Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, ImportSpecifier, + ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleExportName, + ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, Stmt, VarDecl, + VarDeclKind, VarDeclarator, }, atoms::JsWord, utils::{find_pat_ids, private_ident, quote_ident}, @@ -26,9 +26,7 @@ use swc_core::{ use turbo_tasks::RcStr; use super::{ - util::{ - collect_top_level_decls, ids_captured_by, ids_used_by, ids_used_by_ignoring_nested, Vars, - }, + util::{ids_captured_by, ids_used_by, ids_used_by_ignoring_nested}, Key, TURBOPACK_PART_IMPORT_SOURCE, }; use crate::magic_identifier; @@ -193,8 +191,6 @@ pub(super) struct SplitModuleResult { /// Dependency between parts. pub part_deps: FxHashMap>, pub modules: Vec, - - pub star_reexports: Vec, } impl DepGraph { @@ -230,11 +226,6 @@ impl DepGraph { let mut exports = FxHashMap::default(); let mut part_deps = FxHashMap::<_, Vec<_>>::default(); - let star_reexports: Vec<_> = data - .values() - .filter_map(|v| v.content.as_module_decl()?.as_export_all()) - .cloned() - .collect(); let mut modules = vec![]; if groups.graph_ix.is_empty() { @@ -304,7 +295,7 @@ impl DepGraph { let data = data.get(dep_item).unwrap(); for var in data.var_decls.iter() { - if required_vars.contains(var) { + if required_vars.remove(var) { specifiers.push(ImportSpecifier::Named(ImportNamedSpecifier { span: DUMMY_SP, local: var.clone().into(), @@ -379,7 +370,6 @@ impl DepGraph { entrypoints: exports, part_deps, modules, - star_reexports, } } @@ -439,7 +429,7 @@ impl DepGraph { let ix = self.g.get_node(id); if let ItemId::Group(_) = id { - groups.push((vec![id.clone()], FxHashSet::default(), 1)); + groups.push((vec![id.clone()], FxHashSet::default())); global_done.insert(ix); } } @@ -457,8 +447,7 @@ impl DepGraph { global_done.extend(cycle.iter().copied()); - let len = ids.len(); - groups.push((ids, FxHashSet::default(), len)); + groups.push((ids, Default::default())); } } } @@ -493,7 +482,7 @@ impl DepGraph { .count(); if dependant_count >= 2 && count_of_startings >= 2 { - groups.push((vec![id.clone()], FxHashSet::default(), 1)); + groups.push((vec![id.clone()], FxHashSet::default())); global_done.insert(ix as u32); } } @@ -501,15 +490,11 @@ impl DepGraph { loop { let mut changed = false; - for (group, group_done, init_len) in &mut groups { - // Cycle group - - for i in 0..*init_len { - let start = &group[i]; - let start_ix = self.g.get_node(start); - changed |= - add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); - } + for (group, group_done) in &mut groups { + let start = &group[0]; + let start_ix = self.g.get_node(start); + changed |= + add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); } if !changed { @@ -572,7 +557,6 @@ impl DepGraph { unresolved_ctxt: SyntaxContext, top_level_ctxt: SyntaxContext, ) -> (Vec, FxHashMap) { - let top_level_vars = collect_top_level_decls(module); let mut exports = vec![]; let mut items = FxHashMap::default(); let mut ids = vec![]; @@ -713,41 +697,21 @@ impl DepGraph { }); { - let mut used_ids = if export.decl.is_fn_expr() { - ids_used_by_ignoring_nested( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - ids_used_by( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - }; - used_ids.read.remove(&default_var.to_id()); + let mut used_ids = ids_used_by_ignoring_nested( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + ); used_ids.write.insert(default_var.to_id()); - let mut captured_ids = if export.decl.is_fn_expr() { - ids_captured_by( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - Vars::default() - }; - captured_ids.read.remove(&default_var.to_id()); - + let captured_ids = + ids_captured_by(&export.decl, unresolved_ctxt, top_level_ctxt); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, write_vars: used_ids.write, eventual_write_vars: captured_ids.write, var_decls: [default_var.to_id()].into_iter().collect(), + side_effects: true, content: ModuleItem::ModuleDecl(item.clone()), ..Default::default() }; @@ -777,14 +741,9 @@ impl DepGraph { &export.expr, unresolved_ctxt, top_level_ctxt, - &top_level_vars, - ); - let captured_ids = ids_captured_by( - &export.expr, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, ); + let captured_ids = + ids_captured_by(&export.expr, unresolved_ctxt, top_level_ctxt); used_ids.write.insert(default_var.to_id()); @@ -884,7 +843,11 @@ impl DepGraph { kind: ItemIdItemKind::ImportBinding(si as _), }; ids.push(id.clone()); - let local = s.local().to_id(); + let local = match s { + ImportSpecifier::Named(s) => s.local.to_id(), + ImportSpecifier::Default(s) => s.local.to_id(), + ImportSpecifier::Namespace(s) => s.local.to_id(), + }; items.insert( id, ItemData { @@ -912,12 +875,7 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by( - &f.function, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); + let vars = ids_used_by(&f.function, unresolved_ctxt, top_level_ctxt); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(f.ident.to_id()); @@ -947,19 +905,19 @@ impl DepGraph { }; ids.push(id.clone()); - let mut vars = - ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let vars = ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(c.ident.to_id()); v }; - vars.write.insert(c.ident.to_id()); items.insert( id, ItemData { - read_vars: vars.read, - write_vars: vars.write, + is_hoisted: true, + eventual_read_vars: vars.read, + eventual_write_vars: vars.write, + write_vars: var_decls.clone(), var_decls, content: ModuleItem::Stmt(Stmt::Decl(Decl::Class(c.clone()))), ..Default::default() @@ -979,24 +937,13 @@ impl DepGraph { ids.push(id.clone()); let decl_ids: Vec = find_pat_ids(&decl.name); - let vars = ids_used_by( + let vars = ids_used_by_ignoring_nested( &decl.init, unresolved_ctxt, top_level_ctxt, - &top_level_vars, ); let eventual_vars = - if matches!(decl.init.as_deref(), Some(Expr::Fn(..) | Expr::Arrow(..))) - { - ids_captured_by( - &decl.init, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - Vars::default() - }; + ids_captured_by(&decl.init, unresolved_ctxt, top_level_ctxt); let side_effects = vars.found_unresolved; @@ -1025,14 +972,9 @@ impl DepGraph { expr: box Expr::Assign(assign), .. })) => { - let mut used_ids = ids_used_by_ignoring_nested( - item, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); - let captured_ids = - ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let mut used_ids = + ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); + let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); if assign.op != op!("=") { used_ids.read.extend(used_ids.write.iter().cloned()); @@ -1041,7 +983,6 @@ impl DepGraph { &assign.left, unresolved_ctxt, top_level_ctxt, - &top_level_vars, ); used_ids.read.extend(extra_ids.read); used_ids.write.extend(extra_ids.write); @@ -1070,21 +1011,15 @@ impl DepGraph { ModuleItem::ModuleDecl( ModuleDecl::ExportDefaultDecl(..) | ModuleDecl::ExportDefaultExpr(..) - | ModuleDecl::ExportNamed(NamedExport { .. }) - | ModuleDecl::ExportAll(..), + | ModuleDecl::ExportNamed(NamedExport { .. }), ) => {} _ => { // Default to normal - let used_ids = ids_used_by_ignoring_nested( - item, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); - let captured_ids = - ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let used_ids = + ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); + let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, @@ -1123,10 +1058,10 @@ impl DepGraph { for (local, export_name) in exports { let name = match &export_name { - Some(ModuleExportName::Ident(v)) => v.sym.clone(), - _ => local.0.clone(), + Some(ModuleExportName::Ident(v)) => v.to_id(), + _ => local.clone(), }; - let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.clone())); + let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.0.clone())); ids.push(id.clone()); items.insert( id.clone(), @@ -1143,8 +1078,8 @@ impl DepGraph { type_only: false, with: None, })), - read_vars: [local.clone()].into_iter().collect(), - export: Some(name), + read_vars: [name.clone()].into_iter().collect(), + export: Some(name.0), ..Default::default() }, ); diff --git a/crates/turbopack-ecmascript/src/tree_shake/mod.rs b/crates/turbopack-ecmascript/src/tree_shake/mod.rs index b5eac41e1d3c5..c72b11ecfc1ab 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/mod.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/mod.rs @@ -1,16 +1,13 @@ -use std::{borrow::Cow, fmt::Write}; +use std::borrow::Cow; use anyhow::{bail, Result}; use indexmap::IndexSet; use rustc_hash::FxHashMap; use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP, GLOBALS}, - ecma::{ - ast::{ - ExportAll, ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, - ModuleExportName, ModuleItem, NamedExport, Program, - }, - codegen::{text_writer::JsWriter, Emitter}, + ecma::ast::{ + ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, ModuleExportName, + ModuleItem, NamedExport, Program, }, }; use turbo_tasks::{RcStr, ValueToString, Vc}; @@ -24,6 +21,7 @@ use crate::{analyzer::graph::EvalContext, parse::ParseResult, EcmascriptModuleAs pub mod asset; pub mod chunk_item; +mod cjs_finder; mod graph; pub mod merge; #[cfg(test)] @@ -112,10 +110,6 @@ impl Analyzer<'_> { for id in item.var_decls.iter() { let state = self.vars.entry(id.clone()).or_default(); - if state.declarator.is_none() { - state.declarator = Some(item_id.clone()); - } - if item.is_hoisted { state.last_writes.push(item_id.clone()); } else { @@ -177,11 +171,7 @@ impl Analyzer<'_> { if let Some(declarator) = &state.declarator { if declarator != item_id { // A write also depends on the declaration. - if item.side_effects { - self.g.add_strong_deps(item_id, [declarator]); - } else { - self.g.add_weak_deps(item_id, [declarator]); - } + self.g.add_weak_deps(item_id, [declarator].iter().copied()); } } } @@ -266,13 +256,6 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_strong_deps(item_id, state.last_writes.iter()); - - if let Some(declarator) = &state.declarator { - if declarator != item_id { - // A read also depends on the declaration. - self.g.add_strong_deps(item_id, [declarator]); - } - } } // For each var in EVENTUAL_WRITE_VARS: @@ -283,13 +266,6 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_weak_deps(item_id, state.last_reads.iter()); - - if let Some(declarator) = &state.declarator { - if declarator != item_id { - // A write also depends on the declaration. - self.g.add_strong_deps(item_id, [declarator]); - } - } } // (no state update happens, since this is only triggered by @@ -326,7 +302,6 @@ impl Analyzer<'_> { pub(crate) enum Key { ModuleEvaluation, Export(RcStr), - Exports, } /// Converts [Vc] to the index. @@ -337,9 +312,9 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result let key = match &*part { ModulePart::Evaluation => Key::ModuleEvaluation, ModulePart::Export(export) => Key::Export(export.await?.as_str().into()), - ModulePart::Exports => Key::Exports, ModulePart::Internal(part_id) => return Ok(*part_id), ModulePart::Locals + | ModulePart::Exports | ModulePart::Facade | ModulePart::RenamedExport { .. } | ModulePart::RenamedNamespace { .. } => { @@ -347,64 +322,23 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result } }; - let SplitResult::Ok { - entrypoints, - modules, - .. - } = &result - else { - bail!("split failed") + let entrypoints = match &result { + SplitResult::Ok { entrypoints, .. } => entrypoints, + _ => bail!("split failed"), }; - if let Some(id) = entrypoints.get(&key) { - return Ok(*id); - } - - // This is required to handle `export * from 'foo'` - if let ModulePart::Export(..) = &*part { - if let Some(&v) = entrypoints.get(&Key::Exports) { - return Ok(v); + let part_id = match entrypoints.get(&key) { + Some(id) => *id, + None => { + bail!( + "could not find part id for module part {:?} in {:?}", + key, + entrypoints + ) } - } - - let mut dump = String::new(); - - for (idx, m) in modules.iter().enumerate() { - let ParseResult::Ok { - program, - source_map, - .. - } = &*m.await? - else { - bail!("failed to get module") - }; - - { - let mut buf = vec![]; - - { - let wr = JsWriter::new(Default::default(), "\n", &mut buf, None); - - let mut emitter = Emitter { - cfg: Default::default(), - comments: None, - cm: source_map.clone(), - wr, - }; - - emitter.emit_program(program).unwrap(); - } - let code = String::from_utf8(buf).unwrap(); - - writeln!(dump, "# Module #{idx}:\n{code}\n\n\n")?; - } - } + }; - bail!( - "could not find part id for module part {:?} in {:?}\n\nModule dump:\n{dump}", - key, - entrypoints - ) + Ok(part_id) } #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] @@ -421,9 +355,6 @@ pub(crate) enum SplitResult { #[turbo_tasks(trace_ignore)] deps: FxHashMap>, - - #[turbo_tasks(debug_ignore, trace_ignore)] - star_reexports: Vec, }, Failed { parse_result: Vc, @@ -441,12 +372,7 @@ impl PartialEq for SplitResult { #[turbo_tasks::function] pub(super) async fn split_module(asset: Vc) -> Result> { - Ok(split( - asset.source().ident(), - asset.source(), - asset.parse(), - asset.options().await?.special_exports, - )) + Ok(split(asset.source().ident(), asset.source(), asset.parse())) } #[turbo_tasks::function] @@ -454,7 +380,6 @@ pub(super) async fn split( ident: Vc, source: Vc>, parsed: Vc, - special_exports: Vc>, ) -> Result> { let parse_result = parsed.await?; @@ -468,7 +393,7 @@ pub(super) async fn split( .. } => { // If the script file is a common js file, we cannot split the module - if util::should_skip_tree_shaking(program, &special_exports.await?) { + if cjs_finder::contains_cjs(program) { return Ok(SplitResult::Failed { parse_result: parsed, } @@ -494,7 +419,6 @@ pub(super) async fn split( entrypoints, part_deps, modules, - star_reexports, } = dep_graph.split_module(&items); assert_ne!(modules.len(), 0, "modules.len() == 0;\nModule: {module:?}",); @@ -516,6 +440,7 @@ pub(super) async fn split( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + false, Some(source), ); @@ -534,7 +459,6 @@ pub(super) async fn split( entrypoints, deps: part_deps, modules, - star_reexports, } .cell()) } @@ -559,7 +483,6 @@ pub(super) async fn part_of_module( modules, entrypoints, deps, - star_reexports, .. } => { debug_assert_ne!(modules.len(), 0, "modules.len() == 0"); @@ -634,6 +557,7 @@ pub(super) async fn part_of_module( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + true, None, ); return Ok(ParseResult::Ok { @@ -700,15 +624,12 @@ pub(super) async fn part_of_module( ))); } - module.body.extend(star_reexports.iter().map(|export_all| { - ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) - })); - let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + true, None, ); return Ok(ParseResult::Ok { diff --git a/crates/turbopack-ecmascript/src/tree_shake/util.rs b/crates/turbopack-ecmascript/src/tree_shake/util.rs index 050f021e0c65e..79224046c7dd7 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/util.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/util.rs @@ -1,22 +1,17 @@ use std::hash::BuildHasherDefault; use indexmap::IndexSet; -use rustc_hash::{FxHashSet, FxHasher}; +use rustc_hash::FxHasher; use swc_core::{ common::SyntaxContext, ecma::{ ast::{ - ArrowExpr, AssignPatProp, AssignTarget, ClassDecl, ClassExpr, Constructor, DefaultDecl, - ExportDefaultDecl, ExportNamedSpecifier, ExportSpecifier, Expr, FnDecl, FnExpr, - Function, Id, Ident, ImportSpecifier, MemberExpr, MemberProp, NamedExport, Param, Pat, - Prop, PropName, VarDeclarator, *, + AssignTarget, BlockStmtOrExpr, Constructor, ExportNamedSpecifier, ExportSpecifier, + Expr, Function, Id, Ident, MemberExpr, MemberProp, NamedExport, Pat, PropName, }, visit::{noop_visit_type, Visit, VisitWith}, }, }; -use turbo_tasks::RcStr; - -use crate::TURBOPACK_HELPER; #[derive(Debug, Default, Clone, Copy)] enum Mode { @@ -32,11 +27,10 @@ struct Target { } /// A visitor which collects variables which are read or written. -pub(crate) struct IdentUsageCollector<'a> { +#[derive(Default)] +pub(crate) struct IdentUsageCollector { unresolved: SyntaxContext, top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, - vars: Vars, is_nested: bool, @@ -45,7 +39,7 @@ pub(crate) struct IdentUsageCollector<'a> { mode: Option, } -impl IdentUsageCollector<'_> { +impl IdentUsageCollector { fn with_nested(&mut self, f: impl FnOnce(&mut Self)) { if !self.target.eventual { return; @@ -64,13 +58,19 @@ impl IdentUsageCollector<'_> { } } -impl Visit for IdentUsageCollector<'_> { +impl Visit for IdentUsageCollector { fn visit_assign_target(&mut self, n: &AssignTarget) { self.with_mode(Some(Mode::Write), |this| { n.visit_children_with(this); }) } + fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) { + self.with_nested(|this| { + n.visit_children_with(this); + }) + } + fn visit_constructor(&mut self, n: &Constructor) { self.with_nested(|this| { n.visit_children_with(this); @@ -114,7 +114,6 @@ impl Visit for IdentUsageCollector<'_> { if n.span.ctxt != self.unresolved && n.span.ctxt != self.top_level && n.span.ctxt != SyntaxContext::empty() - && !self.top_level_vars.contains(&n.to_id()) { return; } @@ -169,16 +168,6 @@ impl Visit for IdentUsageCollector<'_> { } } - fn visit_prop(&mut self, n: &Prop) { - match n { - Prop::Shorthand(v) => { - self.with_mode(None, |c| c.visit_ident(v)); - } - - _ => n.visit_children_with(self), - } - } - noop_visit_type!(); } @@ -197,26 +186,18 @@ pub(crate) struct Vars { /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_captured_by<'a, N>( - n: &N, - unresolved: SyntaxContext, - top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, -) -> Vars +pub(crate) fn ids_captured_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: false, eventual: true, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars @@ -226,26 +207,18 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by<'a, N>( - n: &N, - unresolved: SyntaxContext, - top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, -) -> Vars +pub(crate) fn ids_used_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: true, eventual: true, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars @@ -255,256 +228,23 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by_ignoring_nested<'a, N>( +pub(crate) fn ids_used_by_ignoring_nested( n: &N, unresolved: SyntaxContext, top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, ) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: true, eventual: false, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars } - -pub struct TopLevelBindingCollector { - bindings: FxHashSet, - is_pat_decl: bool, -} - -impl TopLevelBindingCollector { - fn add(&mut self, i: &Ident) { - self.bindings.insert(i.to_id()); - } -} - -impl Visit for TopLevelBindingCollector { - noop_visit_type!(); - - fn visit_arrow_expr(&mut self, _: &ArrowExpr) {} - - fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) { - node.value.visit_with(self); - - if self.is_pat_decl { - self.add(&node.key); - } - } - - fn visit_class_decl(&mut self, node: &ClassDecl) { - self.add(&node.ident); - } - - fn visit_expr(&mut self, _: &Expr) {} - - fn visit_export_default_decl(&mut self, e: &ExportDefaultDecl) { - match &e.decl { - DefaultDecl::Class(ClassExpr { - ident: Some(ident), .. - }) => { - self.add(ident); - } - DefaultDecl::Fn(FnExpr { - ident: Some(ident), - function: f, - }) if f.body.is_some() => { - self.add(ident); - } - _ => {} - } - } - - fn visit_fn_decl(&mut self, node: &FnDecl) { - self.add(&node.ident); - } - - fn visit_import_specifier(&mut self, node: &ImportSpecifier) { - match node { - ImportSpecifier::Named(s) => self.add(&s.local), - ImportSpecifier::Default(s) => { - self.add(&s.local); - } - ImportSpecifier::Namespace(s) => { - self.add(&s.local); - } - } - } - - fn visit_param(&mut self, node: &Param) { - let old = self.is_pat_decl; - self.is_pat_decl = true; - node.visit_children_with(self); - self.is_pat_decl = old; - } - - fn visit_pat(&mut self, node: &Pat) { - node.visit_children_with(self); - - if self.is_pat_decl { - if let Pat::Ident(i) = node { - self.add(&i.id) - } - } - } - - fn visit_var_declarator(&mut self, node: &VarDeclarator) { - let old = self.is_pat_decl; - self.is_pat_decl = true; - node.name.visit_with(self); - - self.is_pat_decl = false; - node.init.visit_with(self); - self.is_pat_decl = old; - } -} - -/// Collects binding identifiers. -pub fn collect_top_level_decls(n: &N) -> FxHashSet -where - N: VisitWith, -{ - let mut v = TopLevelBindingCollector { - bindings: Default::default(), - is_pat_decl: false, - }; - n.visit_with(&mut v); - v.bindings -} - -pub fn should_skip_tree_shaking(m: &Program, special_exports: &[RcStr]) -> bool { - if let Program::Module(m) = m { - for item in m.body.iter() { - match item { - // Skip turbopack helpers. - ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - with, specifiers, .. - })) => { - if let Some(with) = with.as_deref().and_then(|v| v.as_import_with()) { - for item in with.values.iter() { - if item.key.sym == *TURBOPACK_HELPER { - // Skip tree shaking if the import is from turbopack-helper - return true; - } - } - } - - // TODO(PACK-3150): Tree shaking has a bug related to ModuleExportName::Str - for s in specifiers.iter() { - if let ImportSpecifier::Named(is) = s { - if matches!(is.imported, Some(ModuleExportName::Str(..))) { - return true; - } - } - } - } - - // Tree shaking has a bug related to ModuleExportName::Str - ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport { - src: Some(..), - specifiers, - .. - })) => { - for s in specifiers { - if let ExportSpecifier::Named(es) = s { - if matches!(es.orig, ModuleExportName::Str(..)) - || matches!(es.exported, Some(ModuleExportName::Str(..))) - { - return true; - } - } - } - } - - // Skip sever actions - ModuleItem::Stmt(Stmt::Expr(ExprStmt { - expr: box Expr::Lit(Lit::Str(Str { value, .. })), - .. - })) => { - if value == "use server" { - return true; - } - } - - // Skip special reexports that are recognized by next.js - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - decl: Decl::Var(box VarDecl { decls, .. }), - .. - })) => { - for decl in decls { - if let Pat::Ident(name) = &decl.name { - if special_exports.iter().any(|s| **s == *name.sym) { - return true; - } - } - } - } - - // Skip special reexports that are recognized by next.js - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - decl: Decl::Fn(f), - .. - })) => { - if special_exports.iter().any(|s| **s == *f.ident.sym) { - return true; - } - } - - _ => {} - } - } - - let mut visitor = UseServerFinder::default(); - m.visit_with(&mut visitor); - if visitor.abort { - return true; - } - - for item in m.body.iter() { - if item.is_module_decl() { - return false; - } - } - } - - true -} - -#[derive(Default)] -struct UseServerFinder { - abort: bool, -} - -impl Visit for UseServerFinder { - fn visit_expr_stmt(&mut self, e: &ExprStmt) { - e.visit_children_with(self); - - if let Expr::Lit(Lit::Str(Str { value, .. })) = &*e.expr { - if value == "use server" { - self.abort = true; - } - } - } - - fn visit_stmt(&mut self, n: &Stmt) { - if self.abort { - return; - } - - n.visit_children_with(self); - } - - noop_visit_type!(); -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md index 430e2925c75f8..66a2680795ce9 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md @@ -274,14 +274,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -334,14 +331,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -368,11 +362,9 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; - N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -383,7 +375,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -457,9 +448,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -480,9 +468,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -562,9 +547,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -667,9 +649,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; import { upper } from "module"; function internal() { @@ -691,9 +670,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md index 6285bac299b2a..d121155292e1d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md @@ -292,14 +292,11 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; - Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; - Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; - Item14 --> Item5; ``` # Phase 4 ```mermaid @@ -355,14 +352,11 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; - Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; - Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; - Item14 --> Item5; Item15 --> Item1; Item15 --> Item2; Item15 --> Item11; @@ -387,14 +381,12 @@ graph TD N0 --> N6; N1 --> N10; N1 --> N9; - N1 --> N5; N2 --> N9; N2 --> N5; N3 --> N6; N4 --> N6; N4 --> N8; N4 --> N2; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -405,7 +397,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -461,9 +452,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -503,9 +491,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 2 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -585,9 +570,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -669,9 +651,6 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -716,9 +695,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md index 710e711c322fa..eefa42f0d0b7a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md @@ -563,7 +563,6 @@ export { c2_2 }; ``` ## Part 4 ```js -function d1() {} function d2() {} function c1_1() { return c1_2(); @@ -574,9 +573,6 @@ function c1_2() { function c1_3() { return c1_1(d2); } -export { d1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { d2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -593,7 +589,6 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { ``` ## Part 5 ```js -function d3() {} function c2_1() { return c2_2(d3); } @@ -603,9 +598,6 @@ function c2_2() { function c2_3() { return c2_1(); } -export { d3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { c2_1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js deleted file mode 100644 index fd849eeea7373..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js +++ /dev/null @@ -1,34 +0,0 @@ -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; -import Document, { Html, Head, Main, NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -export default MyDocument; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md deleted file mode 100644 index 2c7f199106f26..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md +++ /dev/null @@ -1,580 +0,0 @@ -# Items - -Count: 14 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_jsx` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_jsxs` - -## Item 4: Stmt 0, `ImportBinding(2)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_Fragment` - -## Item 5: Stmt 1, `ImportOfModule` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 1, `ImportBinding(0)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Document` - -## Item 7: Stmt 1, `ImportBinding(1)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Html` - -## Item 8: Stmt 1, `ImportBinding(2)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Head` - -## Item 9: Stmt 1, `ImportBinding(3)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Main` - -## Item 10: Stmt 1, `ImportBinding(4)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `NextScript` - -## Item 11: Stmt 2, `Normal` - -```js -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} - -``` - -- Declares: `MyDocument` -- Reads: `Document`, `_jsxs`, `_Fragment`, `_jsx`, `Html`, `Head`, `Main`, `NextScript` -- Write: `Document`, `MyDocument` - -## Item 12: Stmt 3, `Normal` - -```js -export default MyDocument; - -``` - -- Side effects -- Declares: `__TURBOPACK__default__export__` -- Reads: `MyDocument` -- Write: `__TURBOPACK__default__export__` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item12; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #5), "default"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(1, ImportOfModule)]"]; - N4["Items: [ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(0, ImportBinding(2)), ItemId(1, ImportBinding(0)), ItemId(1, ImportBinding(1)), ItemId(1, ImportBinding(2)), ItemId(1, ImportBinding(3)), ItemId(1, ImportBinding(4)), ItemId(2, Normal), ItemId(3, Normal)]"]; - N0 --> N2; - N0 --> N3; - N0 --> N4; - N1 --> N4; - N3 --> N2; - N4 --> N2; - N4 --> N3; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import "react/jsx-runtime"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import 'next/document'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { jsx as _jsx } from "react/jsx-runtime"; -import { jsxs as _jsxs } from "react/jsx-runtime"; -import { Fragment as _Fragment } from "react/jsx-runtime"; -import Document from 'next/document'; -import { Html } from 'next/document'; -import { Head } from 'next/document'; -import { Main } from 'next/document'; -import { NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -const __TURBOPACK__default__export__ = MyDocument; -export { _jsx } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _jsxs } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _Fragment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Html } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Head } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Main } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextScript } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyDocument } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import "react/jsx-runtime"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import 'next/document'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { jsx as _jsx } from "react/jsx-runtime"; -import { jsxs as _jsxs } from "react/jsx-runtime"; -import { Fragment as _Fragment } from "react/jsx-runtime"; -import Document from 'next/document'; -import { Html } from 'next/document'; -import { Head } from 'next/document'; -import { Main } from 'next/document'; -import { NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -const __TURBOPACK__default__export__ = MyDocument; -export { _jsx } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _jsxs } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _Fragment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Html } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Head } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Main } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextScript } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyDocument } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md index aebdcef2eb057..b797be2842de7 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md @@ -103,7 +103,7 @@ const routeModule = new AppRouteRouteModule({ - Side effects - Declares: `routeModule` - Reads: `AppRouteRouteModule`, `RouteKind`, `userland` -- Write: `routeModule`, `RouteKind`, `userland` +- Write: `routeModule`, `RouteKind` ## Item 10: Stmt 5, `VarDeclarator(0)` @@ -142,7 +142,6 @@ function patchFetch() { - Declares: `patchFetch` - Reads (eventual): `_patchFetch`, `serverHooks`, `staticGenerationAsyncStorage` - Write: `patchFetch` -- Write (eventual): `serverHooks`, `staticGenerationAsyncStorage` # Phase 1 ```mermaid @@ -283,8 +282,6 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; - Item12 -.-> Item17; - Item12 -.-> Item16; ``` # Phase 4 ```mermaid @@ -338,8 +335,6 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; - Item12 -.-> Item17; - Item12 -.-> Item16; Item13 --> Item1; Item13 --> Item2; Item13 --> Item3; @@ -373,8 +368,6 @@ graph TD N4 --> N12; N6 --> N11; N6 --> N12; - N6 --> N4; - N6 --> N3; N8 --> N7; N9 --> N7; N9 --> N8; @@ -484,12 +477,6 @@ import "__TURBOPACK_PART__" assert { import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { patchFetch as patchFetch }; import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; function patchFetch() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md index f48a2d388ce11..7929d55a7d44b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md @@ -281,13 +281,10 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; - Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; - Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; - Item13 --> Item1; ``` # Phase 4 ```mermaid @@ -341,13 +338,10 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; - Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; - Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; - Item13 --> Item1; Item14 --> Item3; Item14 --> Item6; Item14 --> Item9; @@ -377,10 +371,9 @@ graph TD N3 --> N13; N4 --> N13; N4 --> N11; - N4 --> N6; N5 --> N11; - N5 --> N6; N5 --> N12; + N5 --> N6; N7 --> N6; N8 --> N7; N8 --> N6; @@ -470,9 +463,6 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; export { getChimera }; function getChimera() { return cat + dog; @@ -487,12 +477,12 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; function getDog() { return dog; } @@ -724,9 +714,6 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { getChimera }; function getChimera() { return cat + dog; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md index 9a3b2657607ee..a19d842625785 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md @@ -41,7 +41,6 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; ``` # Phase 3 ```mermaid @@ -52,7 +51,6 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; ``` # Phase 4 ```mermaid @@ -63,8 +61,8 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; Item3 --> Item1; + Item4 --> Item2; ``` # Final ```mermaid diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md index a08a73695d2e2..361e8588ef2c0 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md @@ -465,11 +465,9 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; - Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; - Item19 --> Item5; ``` # Phase 4 ```mermaid @@ -538,11 +536,9 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; - Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; - Item19 --> Item5; Item20 --> Item1; Item20 --> Item2; Item20 --> Item3; @@ -559,9 +555,9 @@ graph TD N5["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch")), ItemId(9, Normal)]"]; N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs")), ItemId(11, Normal)]"]; N7["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses")), ItemId(12, Normal)]"]; - N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(0, ImportBinding(0)), ItemId(14, Normal)]"]; + N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(14, Normal)]"]; N9["Items: [ItemId(0, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(10, Normal)]"]; + N10["Items: [ItemId(10, Normal)]"]; N11["Items: [ItemId(13, Normal)]"]; N2 --> N3; N2 --> N10; @@ -570,8 +566,6 @@ graph TD N5 --> N10; N8 --> N11; N8 --> N9; - N8 --> N10; - N9 --> N10; N10 --> N11; N10 --> N9; N11 --> N9; @@ -788,14 +782,10 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; export { createPostponedAbortSignal }; -import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -806,9 +796,6 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -816,9 +803,6 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -834,10 +818,9 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -847,9 +830,6 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1091,14 +1071,10 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; export { createPostponedAbortSignal }; -import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -1109,9 +1085,6 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1119,9 +1092,6 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -1137,10 +1107,9 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -1150,9 +1119,6 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md index 7bf955069a52f..5220a3ffac6a3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads: `IPC` -- Write: `IPC` +- Reads (eventual): `IPC` +- Write (eventual): `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,7 +274,6 @@ const improveConsole = (name, stream, addStack)=>{ ``` -- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -535,25 +534,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -851,7 +840,6 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -910,25 +898,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1226,12 +1204,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1289,25 +1267,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1605,19 +1573,18 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; - Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1638,7 +1605,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1647,38 +1614,29 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; - N0 --> N9; N0 --> N6; + N0 --> N2; N1 --> N6; - N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N9; + N6 --> N8; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N9; + N7 --> N8; N7 --> N6; - N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N7; - N9 --> N6; ``` # Entrypoints @@ -1710,19 +1668,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1777,9 +1738,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1813,7 +1771,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1848,7 +1806,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1873,9 +1831,6 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -2037,43 +1992,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js @@ -2089,19 +2007,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2176,13 +2097,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2228,9 +2149,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2456,28 +2374,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); - ``` ## Merged (module eval) ```js @@ -2493,13 +2389,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md index aefe991402113..adbe2ec572da3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md @@ -140,10 +140,10 @@ export const run = async (moduleFactory)=>{ ``` -- Side effects - Declares: `run` -- Reads: `ipc`, `queue` -- Write: `run`, `ipc`, `queue` +- Reads (eventual): `ipc`, `queue` +- Write: `run` +- Write (eventual): `ipc`, `queue` # Phase 1 ```mermaid @@ -171,9 +171,6 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item5 --> Item1; Item7 --> Item5; ``` # Phase 3 @@ -189,10 +186,9 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; ``` # Phase 4 ```mermaid @@ -207,24 +203,16 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; Item6 --> Item1; - Item6 --> Item5; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("run", #2), "run"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; - N0 --> N2; - N0 --> N3; - N1 --> N3; - N3 --> N2; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("run", #2), "run")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; ``` # Entrypoints @@ -241,33 +229,13 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; "module evaluation"; +import "./index"; ``` ## Part 1 ```js -import { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { run }; - -``` -## Part 2 -```js -import "./index"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -378,12 +346,7 @@ export { run } from "__TURBOPACK_VAR__" assert { ``` ## Merged (module eval) ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; +import "./index"; "module evaluation"; ``` @@ -402,33 +365,13 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; "module evaluation"; +import "./index"; ``` ## Part 1 ```js -import { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { run }; - -``` -## Part 2 -```js -import "./index"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -539,12 +482,7 @@ export { run } from "__TURBOPACK_VAR__" assert { ``` ## Merged (module eval) ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; +import "./index"; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md index 7bf955069a52f..5220a3ffac6a3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads: `IPC` -- Write: `IPC` +- Reads (eventual): `IPC` +- Write (eventual): `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,7 +274,6 @@ const improveConsole = (name, stream, addStack)=>{ ``` -- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -535,25 +534,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -851,7 +840,6 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -910,25 +898,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1226,12 +1204,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1289,25 +1267,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1605,19 +1573,18 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; - Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1638,7 +1605,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1647,38 +1614,29 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; - N0 --> N9; N0 --> N6; + N0 --> N2; N1 --> N6; - N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N9; + N6 --> N8; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N9; + N7 --> N8; N7 --> N6; - N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N7; - N9 --> N6; ``` # Entrypoints @@ -1710,19 +1668,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1777,9 +1738,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1813,7 +1771,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1848,7 +1806,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1873,9 +1831,6 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -2037,43 +1992,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js @@ -2089,19 +2007,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2176,13 +2097,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2228,9 +2149,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2456,28 +2374,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); - ``` ## Merged (module eval) ```js @@ -2493,13 +2389,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js deleted file mode 100644 index 2f8e8f3d19740..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js +++ /dev/null @@ -1,44 +0,0 @@ -let clientComponentLoadStart = 0; -let clientComponentLoadTimes = 0; -let clientComponentLoadCount = 0; -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md deleted file mode 100644 index 0f1d3e9cf0aa1..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md +++ /dev/null @@ -1,443 +0,0 @@ -# Items - -Count: 8 - -## Item 1: Stmt 0, `VarDeclarator(0)` - -```js -let clientComponentLoadStart = 0; - -``` - -- Declares: `clientComponentLoadStart` -- Write: `clientComponentLoadStart` - -## Item 2: Stmt 1, `VarDeclarator(0)` - -```js -let clientComponentLoadTimes = 0; - -``` - -- Declares: `clientComponentLoadTimes` -- Write: `clientComponentLoadTimes` - -## Item 3: Stmt 2, `VarDeclarator(0)` - -```js -let clientComponentLoadCount = 0; - -``` - -- Declares: `clientComponentLoadCount` -- Write: `clientComponentLoadCount` - -## Item 4: Stmt 3, `Normal` - -```js -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} - -``` - -- Hoisted -- Declares: `wrapClientComponentLoader` -- Reads (eventual): `clientComponentLoadStart` -- Write: `wrapClientComponentLoader` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` - -## Item 5: Stmt 4, `Normal` - -```js -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} - -``` - -- Hoisted -- Declares: `getClientComponentLoaderMetrics` -- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` -- Write: `getClientComponentLoaderMetrics` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; - N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N4["Items: [ItemId(1, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N1 --> N3; - N1 --> N5; - N1 --> N4; - N2 --> N3; - N2 --> N4; - N2 --> N5; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "wrapClientComponentLoader", - ): 1, - Export( - "getClientComponentLoaderMetrics", - ): 2, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "wrapClientComponentLoader", - ): 1, - Export( - "getClientComponentLoaderMetrics", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js deleted file mode 100644 index 831bb0474831b..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js +++ /dev/null @@ -1,44 +0,0 @@ -let clientComponentLoadStart = 0; -let clientComponentLoadTimes = 0; -let clientComponentLoadCount = 0; -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md deleted file mode 100644 index 3a6bcaccb0dcd..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md +++ /dev/null @@ -1,443 +0,0 @@ -# Items - -Count: 8 - -## Item 1: Stmt 0, `VarDeclarator(0)` - -```js -let clientComponentLoadStart = 0; - -``` - -- Declares: `clientComponentLoadStart` -- Write: `clientComponentLoadStart` - -## Item 2: Stmt 1, `VarDeclarator(0)` - -```js -let clientComponentLoadTimes = 0; - -``` - -- Declares: `clientComponentLoadTimes` -- Write: `clientComponentLoadTimes` - -## Item 3: Stmt 2, `VarDeclarator(0)` - -```js -let clientComponentLoadCount = 0; - -``` - -- Declares: `clientComponentLoadCount` -- Write: `clientComponentLoadCount` - -## Item 4: Stmt 3, `Normal` - -```js -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} - -``` - -- Hoisted -- Declares: `wrapClientComponentLoader` -- Reads (eventual): `clientComponentLoadStart` -- Write: `wrapClientComponentLoader` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` - -## Item 5: Stmt 4, `Normal` - -```js -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} - -``` - -- Hoisted -- Declares: `getClientComponentLoaderMetrics` -- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` -- Write: `getClientComponentLoaderMetrics` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; - N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N4["Items: [ItemId(1, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N1 --> N3; - N1 --> N5; - N1 --> N4; - N2 --> N3; - N2 --> N4; - N2 --> N5; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "wrapClientComponentLoader", - ): 1, - Export( - "getClientComponentLoaderMetrics", - ): 2, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "wrapClientComponentLoader", - ): 1, - Export( - "getClientComponentLoaderMetrics", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md index 9652d7f774d98..add30fe1a5e6a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md @@ -45,7 +45,6 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; ``` # Phase 3 @@ -59,7 +58,6 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; ``` # Phase 4 @@ -73,8 +71,8 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; + Item4 --> Item1; ``` # Final ```mermaid diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js deleted file mode 100644 index bf12a2b2e4066..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js +++ /dev/null @@ -1,44 +0,0 @@ -import crypto from 'crypto' -import { urlAlphabet } from './url-alphabet/index.js' -const POOL_SIZE_MULTIPLIER = 128 -let pool, poolOffset -let fillPool = bytes => { - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) - crypto.randomFillSync(pool) - poolOffset = 0 - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool) - poolOffset = 0 - } - poolOffset += bytes -} -let random = bytes => { - fillPool((bytes -= 0)) - return pool.subarray(poolOffset - bytes, poolOffset) -} -let customRandom = (alphabet, size, getRandom) => { - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 - let step = Math.ceil((1.6 * mask * size) / alphabet.length) - return () => { - let id = '' - while (true) { - let bytes = getRandom(step) - let i = step - while (i--) { - id += alphabet[bytes[i] & mask] || '' - if (id.length === size) return id - } - } - } -} -let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) -let nanoid = (size = 21) => { - fillPool((size -= 0)) - let id = '' - for (let i = poolOffset - size; i < poolOffset; i++) { - id += urlAlphabet[pool[i] & 63] - } - return id -} -export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md deleted file mode 100644 index 44516e5f4f8a7..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md +++ /dev/null @@ -1,920 +0,0 @@ -# Items - -Count: 18 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import crypto from 'crypto'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import crypto from 'crypto'; - -``` - -- Hoisted -- Declares: `crypto` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { urlAlphabet } from './url-alphabet/index.js'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { urlAlphabet } from './url-alphabet/index.js'; - -``` - -- Hoisted -- Declares: `urlAlphabet` - -## Item 5: Stmt 2, `VarDeclarator(0)` - -```js -const POOL_SIZE_MULTIPLIER = 128; - -``` - -- Declares: `POOL_SIZE_MULTIPLIER` -- Write: `POOL_SIZE_MULTIPLIER` - -## Item 6: Stmt 3, `VarDeclarator(0)` - -```js -let pool, poolOffset; - -``` - -- Declares: `pool` -- Write: `pool` - -## Item 7: Stmt 3, `VarDeclarator(1)` - -```js -let pool, poolOffset; - -``` - -- Declares: `poolOffset` -- Write: `poolOffset` - -## Item 8: Stmt 4, `VarDeclarator(0)` - -```js -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; - -``` - -- Side effects -- Declares: `fillPool` -- Reads: `pool`, `POOL_SIZE_MULTIPLIER`, `crypto`, `poolOffset` -- Write: `fillPool`, `pool`, `crypto`, `poolOffset` - -## Item 9: Stmt 5, `VarDeclarator(0)` - -```js -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; - -``` - -- Declares: `random` -- Reads: `fillPool`, `pool`, `poolOffset` -- Write: `random`, `pool` - -## Item 10: Stmt 6, `VarDeclarator(0)` - -```js -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; - -``` - -- Side effects -- Declares: `customRandom` -- Write: `customRandom` - -## Item 11: Stmt 7, `VarDeclarator(0)` - -```js -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); - -``` - -- Declares: `customAlphabet` -- Reads: `customRandom`, `random` -- Write: `customAlphabet` - -## Item 12: Stmt 8, `VarDeclarator(0)` - -```js -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; - -``` - -- Declares: `nanoid` -- Reads: `fillPool`, `poolOffset`, `urlAlphabet`, `pool` -- Write: `nanoid`, `urlAlphabet`, `pool` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item8; - Item13 --> Item10; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("nanoid", #2), "nanoid"))]"]; - N2["Items: [ItemId(Export(("customAlphabet", #2), "customAlphabet")), ItemId(7, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("customRandom", #2), "customRandom"))]"]; - N4["Items: [ItemId(Export(("urlAlphabet", #2), "urlAlphabet")), ItemId(1, ImportBinding(0))]"]; - N5["Items: [ItemId(Export(("random", #2), "random"))]"]; - N6["Items: [ItemId(0, ImportOfModule)]"]; - N7["Items: [ItemId(1, ImportOfModule)]"]; - N8["Items: [ItemId(3, VarDeclarator(0))]"]; - N9["Items: [ItemId(3, VarDeclarator(1))]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(2, VarDeclarator(0)), ItemId(4, VarDeclarator(0))]"]; - N11["Items: [ItemId(5, VarDeclarator(0))]"]; - N12["Items: [ItemId(6, VarDeclarator(0))]"]; - N13["Items: [ItemId(1, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N0 --> N6; - N0 --> N7; - N0 --> N10; - N0 --> N12; - N1 --> N13; - N2 --> N12; - N2 --> N11; - N3 --> N12; - N4 --> N13; - N5 --> N11; - N7 --> N6; - N10 --> N8; - N10 --> N9; - N10 --> N6; - N10 --> N7; - N11 --> N10; - N11 --> N8; - N11 --> N9; - N12 --> N6; - N12 --> N7; - N12 --> N10; - N13 --> N10; - N13 --> N9; - N13 --> N11; - N13 --> N8; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "customAlphabet", - ): 2, - Export( - "customRandom", - ): 3, - Export( - "urlAlphabet", - ): 4, - Export( - "random", - ): 5, - Export( - "nanoid", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { nanoid as nanoid }; - -``` -## Part 2 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { customAlphabet as customAlphabet }; -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); -export { customAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { customRandom as customRandom }; - -``` -## Part 4 -```js -import { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { urlAlphabet as urlAlphabet }; -import { urlAlphabet } from './url-alphabet/index.js'; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { random as random }; - -``` -## Part 6 -```js -import 'crypto'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import './url-alphabet/index.js'; - -``` -## Part 8 -```js -let pool; -export { pool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -let poolOffset; -export { poolOffset } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import crypto from 'crypto'; -const POOL_SIZE_MULTIPLIER = 128; -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; -export { crypto } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { fillPool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; -export { random } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; -export { customRandom } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { urlAlphabet } from './url-alphabet/index.js'; -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { nanoid } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "customAlphabet", - ): 2, - Export( - "customRandom", - ): 3, - Export( - "urlAlphabet", - ): 4, - Export( - "random", - ): 5, - Export( - "nanoid", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { nanoid as nanoid }; - -``` -## Part 2 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { customAlphabet as customAlphabet }; -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); -export { customAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { customRandom as customRandom }; - -``` -## Part 4 -```js -import { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { urlAlphabet as urlAlphabet }; -import { urlAlphabet } from './url-alphabet/index.js'; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { random as random }; - -``` -## Part 6 -```js -import 'crypto'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import './url-alphabet/index.js'; - -``` -## Part 8 -```js -let pool; -export { pool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -let poolOffset; -export { poolOffset } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import crypto from 'crypto'; -const POOL_SIZE_MULTIPLIER = 128; -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; -export { crypto } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { fillPool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; -export { random } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; -export { customRandom } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { urlAlphabet } from './url-alphabet/index.js'; -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { nanoid } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js deleted file mode 100644 index 355cd43370ea1..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js +++ /dev/null @@ -1,122 +0,0 @@ -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -const INTERNALS = Symbol('internal response'); -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -/** - * This class extends the [Web `Response` API](https://developer.mozilla.org/docs/Web/API/Response) with additional convenience methods. - * - * Read more: [Next.js Docs: `NextResponse`](https://nextjs.org/docs/app/api-reference/functions/next-response) - */ export class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - // rest of props come from Response - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} - -//# sourceMappingURL=response.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md deleted file mode 100644 index 22e0b2e3ef8c9..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md +++ /dev/null @@ -1,1145 +0,0 @@ -# Items - -Count: 17 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { stringifyCookie } from '../../web/spec-extension/cookies'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { stringifyCookie } from '../../web/spec-extension/cookies'; - -``` - -- Hoisted -- Declares: `stringifyCookie` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { NextURL } from '../next-url'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { NextURL } from '../next-url'; - -``` - -- Hoisted -- Declares: `NextURL` - -## Item 5: Stmt 2, `ImportOfModule` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 2, `ImportBinding(0)` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Declares: `toNodeOutgoingHttpHeaders` - -## Item 7: Stmt 2, `ImportBinding(1)` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Declares: `validateURL` - -## Item 8: Stmt 3, `ImportOfModule` - -```js -import { ReflectAdapter } from './adapters/reflect'; - -``` - -- Hoisted -- Side effects - -## Item 9: Stmt 3, `ImportBinding(0)` - -```js -import { ReflectAdapter } from './adapters/reflect'; - -``` - -- Hoisted -- Declares: `ReflectAdapter` - -## Item 10: Stmt 4, `ImportOfModule` - -```js -import { ResponseCookies } from './cookies'; - -``` - -- Hoisted -- Side effects - -## Item 11: Stmt 4, `ImportBinding(0)` - -```js -import { ResponseCookies } from './cookies'; - -``` - -- Hoisted -- Declares: `ResponseCookies` - -## Item 12: Stmt 5, `VarDeclarator(0)` - -```js -const INTERNALS = Symbol('internal response'); - -``` - -- Side effects -- Declares: `INTERNALS` -- Write: `INTERNALS` - -## Item 13: Stmt 6, `VarDeclarator(0)` - -```js -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); - -``` - -- Side effects -- Declares: `REDIRECTS` -- Write: `REDIRECTS` - -## Item 14: Stmt 7, `Normal` - -```js -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} - -``` - -- Hoisted -- Declares: `handleMiddlewareField` -- Write: `handleMiddlewareField` - -## Item 15: Stmt 8, `Normal` - -```js -export class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} - -``` - -- Declares: `NextResponse` -- Reads: `ResponseCookies`, `stringifyCookie`, `handleMiddlewareField`, `ReflectAdapter`, `INTERNALS`, `NextURL`, `toNodeOutgoingHttpHeaders`, `NextResponse`, `REDIRECTS`, `validateURL` -- Write: `ReflectAdapter`, `REDIRECTS`, `NextResponse` - -# Phase 1 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; - Item16 --> Item1; - Item16 --> Item2; - Item16 --> Item3; - Item16 --> Item4; - Item16 --> Item5; - Item16 --> Item12; - Item16 --> Item13; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("NextResponse", #2), "NextResponse")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(2, ImportBinding(1)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(7, Normal), ItemId(8, Normal)]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(1, ImportOfModule)]"]; - N4["Items: [ItemId(2, ImportOfModule)]"]; - N5["Items: [ItemId(3, ImportOfModule)]"]; - N6["Items: [ItemId(4, ImportOfModule)]"]; - N7["Items: [ItemId(5, VarDeclarator(0))]"]; - N8["Items: [ItemId(6, VarDeclarator(0))]"]; - N0 --> N2; - N0 --> N3; - N0 --> N4; - N0 --> N5; - N0 --> N6; - N0 --> N7; - N0 --> N8; - N1 --> N7; - N1 --> N8; - N3 --> N2; - N4 --> N2; - N4 --> N3; - N5 --> N2; - N5 --> N3; - N5 --> N4; - N6 --> N2; - N6 --> N3; - N6 --> N4; - N6 --> N5; - N7 --> N2; - N7 --> N3; - N7 --> N4; - N7 --> N5; - N7 --> N6; - N8 --> N2; - N8 --> N3; - N8 --> N4; - N8 --> N5; - N8 --> N6; - N8 --> N7; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "NextResponse", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { INTERNALS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { REDIRECTS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -export { NextResponse }; -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders } from '../utils'; -import { validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} -export { stringifyCookie } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { validateURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ResponseCookies } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import '../../web/spec-extension/cookies'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import '../next-url'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import '../utils'; - -``` -## Part 5 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import './adapters/reflect'; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import './cookies'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -const INTERNALS = Symbol('internal response'); -export { INTERNALS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -export { REDIRECTS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "NextResponse", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { INTERNALS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { REDIRECTS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -export { NextResponse }; -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders } from '../utils'; -import { validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} -export { stringifyCookie } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { validateURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ResponseCookies } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import '../../web/spec-extension/cookies'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import '../next-url'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import '../utils'; - -``` -## Part 5 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import './adapters/reflect'; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import './cookies'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -const INTERNALS = Symbol('internal response'); -export { INTERNALS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -export { REDIRECTS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js deleted file mode 100644 index 3fafa47598599..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js +++ /dev/null @@ -1,214 +0,0 @@ -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; -let api; -// we want to allow users to use their own version of @opentelemetry/api if they -// want to, so we try to require it first, and if it fails we fall back to the -// version that is bundled with Next.js -// this is because @opentelemetry/api has to be synced with the version of -// @opentelemetry/tracing that is used, and we don't want to force users to use -// the version that is bundled with Next.js. -// the API is ~stable, so this should be fine -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -export class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -/** we use this map to propagate attributes from nested spans to the top span */ const rootSpanAttributesStore = new Map(); -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - /** - * Returns an instance to the trace with configured name. - * Since wrap / trace can be defined in any place prior to actual trace subscriber initialization, - * This should be lazily evaluated. - */ getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - // Active span is already set, too late to propagate. - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - // coerce options form overload - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - // Trying to get active scoped span to assign parent. If option specifies parent span manually, will try to use it. - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - // If there's error make sure it throws - return result.then((res)=>{ - span.end(); - // Need to pass down the promise result, - // it could be react stream response with error { error, stream } - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { getTracer, SpanStatusCode, SpanKind }; - -//# sourceMappingURL=tracer.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md deleted file mode 100644 index 463c3196a4ad6..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md +++ /dev/null @@ -1,1476 +0,0 @@ -# Items - -Count: 23 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Declares: `LogSpanAllowList` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Declares: `NextVanillaSpanAllowlist` - -## Item 4: Stmt 1, `VarDeclarator(0)` - -```js -let api; - -``` - -- Declares: `api` -- Write: `api` - -## Item 5: Stmt 2, `Normal` - -```js -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` - -- Side effects -- Write: `api` - -## Item 6: Stmt 3, `VarDeclarator(0)` - -```js -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; - -``` - -- Declares: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` -- Reads: `api` -- Write: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` - -## Item 7: Stmt 4, `VarDeclarator(0)` - -```js -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; - -``` - -- Declares: `isPromise` -- Write: `isPromise` - -## Item 8: Stmt 5, `Normal` - -```js -export class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} - -``` - -- Declares: `BubbledError` -- Write: `BubbledError` - -## Item 9: Stmt 6, `Normal` - -```js -export function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} - -``` - -- Hoisted -- Declares: `isBubbledError` -- Reads (eventual): `BubbledError` -- Write: `isBubbledError` - -## Item 10: Stmt 7, `VarDeclarator(0)` - -```js -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; - -``` - -- Declares: `closeSpanWithError` -- Reads: `isBubbledError`, `SpanStatusCode` -- Write: `closeSpanWithError`, `SpanStatusCode` - -## Item 11: Stmt 8, `VarDeclarator(0)` - -```js -const rootSpanAttributesStore = new Map(); - -``` - -- Side effects -- Declares: `rootSpanAttributesStore` -- Write: `rootSpanAttributesStore` - -## Item 12: Stmt 9, `VarDeclarator(0)` - -```js -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); - -``` - -- Declares: `rootSpanIdKey` -- Reads: `api` -- Write: `rootSpanIdKey`, `api` - -## Item 13: Stmt 10, `VarDeclarator(0)` - -```js -let lastSpanId = 0; - -``` - -- Declares: `lastSpanId` -- Write: `lastSpanId` - -## Item 14: Stmt 11, `VarDeclarator(0)` - -```js -const getSpanId = ()=>lastSpanId++; - -``` - -- Declares: `getSpanId` -- Reads: `lastSpanId` -- Write: `getSpanId` - -## Item 15: Stmt 12, `VarDeclarator(0)` - -```js -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; - -``` - -- Declares: `clientTraceDataSetter` -- Write: `clientTraceDataSetter` - -## Item 16: Stmt 13, `Normal` - -```js -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} - -``` - -- Declares: `NextTracerImpl` -- Reads: `trace`, `context`, `propagation`, `clientTraceDataSetter`, `NextVanillaSpanAllowlist`, `ROOT_CONTEXT`, `getSpanId`, `rootSpanIdKey`, `rootSpanAttributesStore`, `LogSpanAllowList`, `closeSpanWithError`, `isPromise` -- Write: `trace`, `context`, `propagation`, `NextVanillaSpanAllowlist`, `rootSpanAttributesStore`, `LogSpanAllowList`, `NextTracerImpl` - -## Item 17: Stmt 14, `VarDeclarator(0)` - -```js -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); - -``` - -- Declares: `getTracer` -- Reads: `NextTracerImpl` -- Write: `getTracer` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; - Item9 --> Item8; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; - Item9 --> Item8; - Item18 --> Item1; - Item18 --> Item5; - Item18 --> Item11; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("BubbledError", #2), "BubbledError"))]"]; - N2["Items: [ItemId(Export(("isBubbledError", #2), "isBubbledError"))]"]; - N3["Items: [ItemId(Export(("getTracer", #2), "getTracer")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(4, VarDeclarator(0)), ItemId(9, VarDeclarator(0)), ItemId(10, VarDeclarator(0)), ItemId(11, VarDeclarator(0)), ItemId(12, VarDeclarator(0)), ItemId(13, Normal), ItemId(14, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("SpanStatusCode", #2), "SpanStatusCode"))]"]; - N5["Items: [ItemId(Export(("SpanKind", #2), "SpanKind"))]"]; - N6["Items: [ItemId(0, ImportOfModule)]"]; - N7["Items: [ItemId(1, VarDeclarator(0))]"]; - N8["Items: [ItemId(2, Normal)]"]; - N9["Items: [ItemId(3, VarDeclarator(0))]"]; - N10["Items: [ItemId(5, Normal)]"]; - N11["Items: [ItemId(6, Normal)]"]; - N12["Items: [ItemId(7, VarDeclarator(0))]"]; - N13["Items: [ItemId(8, VarDeclarator(0))]"]; - N0 --> N6; - N0 --> N8; - N0 --> N13; - N1 --> N10; - N2 --> N11; - N3 --> N8; - N3 --> N7; - N3 --> N9; - N3 --> N13; - N3 --> N12; - N4 --> N12; - N4 --> N9; - N5 --> N9; - N8 --> N7; - N8 --> N6; - N9 --> N8; - N9 --> N7; - N11 --> N10; - N12 --> N11; - N12 --> N9; - N13 --> N6; - N13 --> N8; - N13 --> N10; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "isBubbledError", - ): 2, - Export( - "SpanKind", - ): 5, - Export( - "SpanStatusCode", - ): 4, - Export( - "BubbledError", - ): 1, - Export( - "getTracer", - ): 3, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { BubbledError }; - -``` -## Part 2 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { isBubbledError }; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import { closeSpanWithError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { getTracer as getTracer }; -import { LogSpanAllowList } from './constants'; -import { NextVanillaSpanAllowlist } from './constants'; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { isPromise } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { lastSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getTracer } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanStatusCode as SpanStatusCode }; - -``` -## Part 5 -```js -import { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanKind as SpanKind }; - -``` -## Part 6 -```js -import './constants'; - -``` -## Part 7 -```js -let api; -export { api } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` -## Part 9 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -export { context } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { propagation } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { trace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export { BubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -export { isBubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -const rootSpanAttributesStore = new Map(); -export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "isBubbledError", - ): 2, - Export( - "SpanKind", - ): 5, - Export( - "SpanStatusCode", - ): 4, - Export( - "BubbledError", - ): 1, - Export( - "getTracer", - ): 3, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { BubbledError }; - -``` -## Part 2 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { isBubbledError }; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import { closeSpanWithError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { getTracer as getTracer }; -import { LogSpanAllowList } from './constants'; -import { NextVanillaSpanAllowlist } from './constants'; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { isPromise } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { lastSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getTracer } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanStatusCode as SpanStatusCode }; - -``` -## Part 5 -```js -import { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanKind as SpanKind }; - -``` -## Part 6 -```js -import './constants'; - -``` -## Part 7 -```js -let api; -export { api } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` -## Part 9 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -export { context } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { propagation } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { trace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export { BubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -export { isBubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -const rootSpanAttributesStore = new Map(); -export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js deleted file mode 100644 index dbdeaab4b2c2a..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js +++ /dev/null @@ -1,9 +0,0 @@ -import Stream from 'node:stream'; - -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; - -function fetch(){ - -} - -export default fetch; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md deleted file mode 100644 index 135b4158e41d0..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md +++ /dev/null @@ -1,262 +0,0 @@ -# Items - -Count: 7 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import Stream from 'node:stream'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import Stream from 'node:stream'; - -``` - -- Hoisted -- Declares: `Stream` - -## Item 3: Stmt 1, `VarDeclarator(0)` - -```js -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; - -``` - -- Declares: `streamDestructionSupported` -- Reads: `Stream` -- Write: `streamDestructionSupported`, `Stream` - -## Item 4: Stmt 2, `Normal` - -```js -function fetch() {} - -``` - -- Hoisted -- Declares: `fetch` -- Write: `fetch` - -## Item 5: Stmt 3, `Normal` - -```js -export default fetch; - -``` - -- Side effects -- Declares: `__TURBOPACK__default__export__` -- Reads: `fetch` -- Write: `__TURBOPACK__default__export__` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; - Item6 --> Item1; - Item6 --> Item5; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #4), "default"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(2, Normal), ItemId(3, Normal)]"]; - N0 --> N2; - N0 --> N3; - N1 --> N3; - N3 --> N2; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import 'node:stream'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -function fetch() {} -const __TURBOPACK__default__export__ = fetch; -export { fetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import 'node:stream'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -function fetch() {} -const __TURBOPACK__default__export__ = fetch; -export { fetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js deleted file mode 100644 index 0d99a1926bc63..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { DEFAULT_ENVIRONMENT, parseEnvironment, } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -/** - * Gets the environment variables - */ -export function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md deleted file mode 100644 index 4db54d1c99408..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md +++ /dev/null @@ -1,333 +0,0 @@ -# Items - -Count: 10 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Declares: `DEFAULT_ENVIRONMENT` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Declares: `parseEnvironment` - -## Item 4: Stmt 1, `ImportOfModule` - -```js -import { _globalThis } from './globalThis'; - -``` - -- Hoisted -- Side effects - -## Item 5: Stmt 1, `ImportBinding(0)` - -```js -import { _globalThis } from './globalThis'; - -``` - -- Hoisted -- Declares: `_globalThis` - -## Item 6: Stmt 2, `Normal` - -```js -export function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} - -``` - -- Hoisted -- Declares: `getEnv` -- Reads (eventual): `parseEnvironment`, `_globalThis`, `DEFAULT_ENVIRONMENT` -- Write: `getEnv` - -## Item 7: Stmt 3, `Normal` - -```js -export function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} - -``` - -- Hoisted -- Declares: `getEnvWithoutDefaults` -- Reads (eventual): `parseEnvironment`, `_globalThis` -- Write: `getEnvWithoutDefaults` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; - Item6 --> Item4; - Item6 --> Item5; - Item6 --> Item3; - Item7 --> Item4; - Item7 --> Item5; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; - Item6 --> Item4; - Item6 --> Item5; - Item6 --> Item3; - Item7 --> Item4; - Item7 --> Item5; - Item8 --> Item1; - Item8 --> Item2; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("getEnv", #2), "getEnv")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(2, Normal)]"]; - N2["Items: [ItemId(Export(("getEnvWithoutDefaults", #2), "getEnvWithoutDefaults")), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(3, Normal)]"]; - N1 --> N2; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getEnv", - ): 1, - Export( - "getEnvWithoutDefaults", - ): 2, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import '../../utils/environment'; -import './globalThis'; - -``` -## Part 1 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -export { getEnv }; -import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnv } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { getEnvWithoutDefaults }; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import '../../utils/environment'; -import './globalThis'; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getEnv", - ): 1, - Export( - "getEnvWithoutDefaults", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import '../../utils/environment'; -import './globalThis'; - -``` -## Part 1 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -export { getEnv }; -import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnv } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { getEnvWithoutDefaults }; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import '../../utils/environment'; -import './globalThis'; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js deleted file mode 100644 index 3fa42f80742e1..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js +++ /dev/null @@ -1,9 +0,0 @@ -import { NextResponse } from "next/server"; - -export const GET = (req) => { - return NextResponse.json({ - pathname: req.nextUrl.pathname, - }); -}; - -export const runtime = "edge"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md deleted file mode 100644 index 2307f5511fcdd..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md +++ /dev/null @@ -1,230 +0,0 @@ -# Items - -Count: 7 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { NextResponse } from "next/server"; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { NextResponse } from "next/server"; - -``` - -- Hoisted -- Declares: `NextResponse` - -## Item 3: Stmt 1, `VarDeclarator(0)` - -```js -export const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; - -``` - -- Declares: `GET` -- Reads: `NextResponse` -- Write: `GET`, `NextResponse` - -## Item 4: Stmt 2, `VarDeclarator(0)` - -```js -export const runtime = "edge"; - -``` - -- Declares: `runtime` -- Write: `runtime` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; - Item5 --> Item1; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("runtime", #2), "runtime")), ItemId(2, VarDeclarator(0))]"]; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "runtime", - ): 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import "next/server"; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from "next/server"; -const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { runtime }; -const runtime = "edge"; -export { runtime } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "next/server"; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "runtime", - ): 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import "next/server"; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from "next/server"; -const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { runtime }; -const runtime = "edge"; -export { runtime } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "next/server"; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md index 58d4e9bf57df7..ac5007085d28d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `random`, `order` +- Write: `shared`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -134,7 +134,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -169,7 +168,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -204,7 +202,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -219,21 +216,19 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a"))]"]; + N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; - N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N9; - N3 --> N9; + N2 --> N7; N3 --> N7; N5 --> N4; N6 --> N5; @@ -244,7 +239,6 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; - N9 --> N7; ``` # Entrypoints @@ -292,17 +286,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -379,20 +377,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js @@ -454,17 +438,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -541,20 +529,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md index d20024f8ad715..c20663c4e6941 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md @@ -66,7 +66,7 @@ const shared = { - Declares: `shared` - Reads: `value`, `value2`, `value3` -- Write: `shared`, `value`, `value2`, `value3` +- Write: `shared` ## Item 7: Stmt 6, `Normal` @@ -90,7 +90,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 9: Stmt 8, `VarDeclarator(0)` @@ -104,7 +104,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -163,10 +163,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -208,10 +205,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -253,10 +247,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; Item10 --> Item1; @@ -269,8 +260,8 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("a", #2), "a"))]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(6, Normal)]"]; + N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(7, VarDeclarator(0))]"]; N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(8, VarDeclarator(0))]"]; N3["Items: [ItemId(0, Normal)]"]; N4["Items: [ItemId(1, VarDeclarator(0))]"]; @@ -278,18 +269,14 @@ graph TD N6["Items: [ItemId(3, Normal)]"]; N7["Items: [ItemId(4, VarDeclarator(0))]"]; N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N9["Items: [ItemId(6, Normal)]"]; - N10["Items: [ItemId(7, VarDeclarator(0))]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N6; N0 --> N7; - N0 --> N9; - N1 --> N10; - N2 --> N10; + N0 --> N8; + N1 --> N8; N2 --> N8; - N2 --> N9; N4 --> N3; N5 --> N3; N5 --> N4; @@ -303,14 +290,6 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N7; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N6; - N9 --> N7; - N10 --> N8; - N10 --> N9; ``` # Entrypoints @@ -345,31 +324,33 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; "module evaluation"; +console.log(shared); ``` ## Part 1 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; export { b }; const b = { shared, @@ -465,11 +446,8 @@ export { shared } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 9 +## Merged (module eval) ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; @@ -485,47 +463,11 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -console.log(shared); - -``` -## Part 10 -```js import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +console.log(shared); ``` # Entrypoints @@ -570,17 +512,21 @@ console.log(shared); ``` ## Part 1 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -678,20 +624,6 @@ export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md index 58d4e9bf57df7..ac5007085d28d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `random`, `order` +- Write: `shared`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -134,7 +134,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -169,7 +168,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -204,7 +202,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -219,21 +216,19 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a"))]"]; + N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; - N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N9; - N3 --> N9; + N2 --> N7; N3 --> N7; N5 --> N4; N6 --> N5; @@ -244,7 +239,6 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; - N9 --> N7; ``` # Entrypoints @@ -292,17 +286,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -379,20 +377,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js @@ -454,17 +438,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -541,20 +529,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md index 0f5de8624b5b6..7b1d2a8064a9b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md @@ -266,7 +266,7 @@ export const routeModule = new PagesRouteModule({ - Declares: `routeModule` - Reads: `PagesRouteModule`, `RouteKind`, `App`, `Document`, `userland` -- Write: `routeModule`, `RouteKind`, `App`, `Document`, `userland` +- Write: `routeModule`, `RouteKind` # Phase 1 ```mermaid @@ -438,18 +438,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -563,18 +551,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -688,18 +664,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -718,22 +682,23 @@ graph TD Item25 --> Item5; Item25 --> Item6; Item25 --> Item13; + Item26 --> Item13; ``` # Final ```mermaid graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; - N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps"))]"]; - N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths"))]"]; - N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps"))]"]; - N5["Items: [ItemId(Export(("config", #2), "config"))]"]; - N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals"))]"]; - N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps"))]"]; - N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths"))]"]; - N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams"))]"]; - N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps"))]"]; - N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps"))]"]; + N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("config", #2), "config")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; + N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; + N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; + N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; + N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N12["Items: [ItemId(Export(("routeModule", #2), "routeModule")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(17, VarDeclarator(0))]"]; N13["Items: [ItemId(0, ImportOfModule)]"]; N14["Items: [ItemId(1, ImportOfModule)]"]; @@ -742,16 +707,6 @@ graph TD N17["Items: [ItemId(4, ImportOfModule)]"]; N18["Items: [ItemId(5, ImportOfModule)]"]; N19["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(6, Normal)]"]; - N20["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; - N21["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N22["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; - N23["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; - N24["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; - N25["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; - N26["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; - N27["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; - N28["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; - N29["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N0 --> N13; N0 --> N14; N0 --> N15; @@ -760,27 +715,17 @@ graph TD N0 --> N18; N0 --> N19; N1 --> N19; - N2 --> N20; - N3 --> N21; - N4 --> N22; - N5 --> N23; - N6 --> N24; - N7 --> N25; - N8 --> N26; - N9 --> N27; - N10 --> N28; - N11 --> N29; - N12 --> N29; + N2 --> N19; + N3 --> N19; + N4 --> N19; + N5 --> N19; + N6 --> N19; + N7 --> N19; + N8 --> N19; + N9 --> N19; + N10 --> N19; + N11 --> N19; N12 --> N19; - N12 --> N20; - N12 --> N21; - N12 --> N22; - N12 --> N23; - N12 --> N24; - N12 --> N25; - N12 --> N26; - N12 --> N27; - N12 --> N28; N14 --> N13; N15 --> N13; N15 --> N14; @@ -796,22 +741,12 @@ graph TD N18 --> N15; N18 --> N16; N18 --> N17; - N19 --> N29; N19 --> N13; N19 --> N14; N19 --> N15; N19 --> N16; N19 --> N17; N19 --> N18; - N20 --> N29; - N21 --> N29; - N22 --> N29; - N23 --> N29; - N24 --> N29; - N25 --> N29; - N26 --> N29; - N27 --> N29; - N28 --> N29; ``` # Entrypoints @@ -895,119 +830,209 @@ export { __TURBOPACK__default__export__ as default }; ``` ## Part 2 ```js -import { getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 20 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getStaticProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticProps = hoist(userland, 'getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import { getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 21 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getStaticPaths }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 4 ```js -import { getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 22 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getServerSideProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 5 ```js -import { config } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 23 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { config }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const config = hoist(userland, 'config'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { config } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 6 ```js -import { reportWebVitals } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 24 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { reportWebVitals }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 7 ```js -import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 25 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 8 ```js -import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 26 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticPaths }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 9 ```js -import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 27 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticParams }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 10 ```js -import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 28 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getServerProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 11 ```js -import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getServerSideProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 12 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 19 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 20 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 21 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 22 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 23 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 24 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 25 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 26 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 27 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 28 -}; export { routeModule }; import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; import { RouteKind } from '../../server/future/route-kind'; @@ -1125,9 +1150,6 @@ import 'VAR_USERLAND'; ``` ## Part 19 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 13 }; @@ -1159,193 +1181,6 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 20 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 21 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 22 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 23 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { config } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 24 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 25 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 26 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 27 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 28 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 29 -```js -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md index 03979660b799e..867b54c937d69 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md @@ -274,14 +274,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -334,14 +331,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -368,11 +362,9 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; - N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -383,7 +375,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -457,9 +448,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -480,9 +468,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -562,9 +547,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -667,9 +649,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; import { upper } from "module"; function internal() { @@ -691,9 +670,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -777,9 +753,6 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; export { external1 }; function internal() { @@ -825,9 +798,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; export { external1 }; function internal() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js deleted file mode 100644 index fd7505a005999..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js +++ /dev/null @@ -1,10 +0,0 @@ -import { NextResponse } from 'next/server' -import { ClientComponent } from '../../ClientComponent' -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent' - -export function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent, - }) -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md deleted file mode 100644 index c6c40bc8c59e7..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md +++ /dev/null @@ -1,282 +0,0 @@ -# Items - -Count: 9 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { NextResponse } from 'next/server'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { NextResponse } from 'next/server'; - -``` - -- Hoisted -- Declares: `NextResponse` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { ClientComponent } from '../../ClientComponent'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { ClientComponent } from '../../ClientComponent'; - -``` - -- Hoisted -- Declares: `ClientComponent` - -## Item 5: Stmt 2, `ImportOfModule` - -```js -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 2, `ImportBinding(0)` - -```js -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; - -``` - -- Hoisted -- Declares: `MyModuleClientComponent` - -## Item 7: Stmt 3, `Normal` - -```js -export function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} - -``` - -- Hoisted -- Declares: `GET` -- Reads (eventual): `NextResponse`, `ClientComponent`, `MyModuleClientComponent` -- Write: `GET` -- Write (eventual): `NextResponse` - -# Phase 1 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; - Item7 --> Item4; - Item7 --> Item5; - Item7 --> Item6; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; - Item7 --> Item4; - Item7 --> Item5; - Item7 --> Item6; - Item8 --> Item1; - Item8 --> Item2; - Item8 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule), ItemId(2, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "GET", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from 'next/server'; -import { ClientComponent } from '../../ClientComponent'; -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; -function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "GET", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from 'next/server'; -import { ClientComponent } from '../../ClientComponent'; -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; -function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Merged (module eval) -```js -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md index c674594a34ad8..052eb476d8e5f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md @@ -171,7 +171,6 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; - Item2 --> Item1; Item2 -.-> Item9; ``` # Phase 4 @@ -208,7 +207,6 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; - Item2 --> Item1; Item2 -.-> Item9; Item8 --> Item3; Item8 --> Item4; @@ -235,7 +233,6 @@ graph TD N1 --> N9; N1 --> N4; N2 --> N9; - N2 --> N4; N2 --> N1; N3 --> N8; N5 --> N4; @@ -302,9 +299,6 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; @@ -471,9 +465,6 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; export { func }; function func() { order.push("d"); diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js index c719e831a0c35..b496ad7226a0b 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map index 76543693cb889..8771340104287 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG,qOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js similarity index 91% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js index 61beca3561f02..d6d4fa4d32efa 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -150,14 +150,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; @@ -200,18 +198,34 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__, - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__, + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; ; })()), @@ -246,4 +260,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map index 08028c332a04d..20adfc3eda1b6 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map @@ -20,16 +20,18 @@ {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 162, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 167, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 184, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 200, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 215, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 220, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, - {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 239, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 244, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 165, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 177, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 198, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 219, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js similarity index 90% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js index 0e8d24b6eaeed..281bddcb7f575 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; @@ -191,19 +189,35 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; "module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__.cat); +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__.cat); ; })()), @@ -219,4 +233,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map index bd930bbd92dfd..a64d074b155f2 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map @@ -18,14 +18,16 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,8NAAI,GAAG"}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 217, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAI,GAAG"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 226, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 231, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js index 7bad58454328f..b829c74cc07a9 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map index 3156e34ae11ad..729da17d345fd 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map @@ -18,14 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG,6OAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 211, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, - {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, + {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js index 388520019ef8a..00dd5c50b44f6 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map index f088827fe8299..21f0e7a600376 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG,gPAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-wasm/src/module_asset.rs b/crates/turbopack-wasm/src/module_asset.rs index da3381b6923e4..c357e7abaf597 100644 --- a/crates/turbopack-wasm/src/module_asset.rs +++ b/crates/turbopack-wasm/src/module_asset.rs @@ -19,6 +19,7 @@ use turbopack_ecmascript::{ EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, references::async_module::OptionAsyncModule, + EcmascriptModuleAsset, }; use crate::{ @@ -61,43 +62,24 @@ impl WebAssemblyModuleAsset { } #[turbo_tasks::function] - async fn loader_as_module(self: Vc) -> Result>> { - let this = self.await?; - let query = &*this.source.ident().query().await?; + async fn loader(&self) -> Result> { + let query = &*self.source.ident().query().await?; let loader_source = if query == "?module" { - compiling_loader_source(this.source) + compiling_loader_source(self.source) } else { - instantiating_loader_source(this.source) + instantiating_loader_source(self.source) }; - let module = this.asset_context.process( + let module = self.asset_context.process( loader_source, Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(this.source, this.asset_context)), + "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(self.source, self.asset_context)), }))), ).module(); - Ok(module) - } - #[turbo_tasks::function] - async fn loader_as_resolve_origin(self: Vc) -> Result>> { - let module = self.loader_as_module(); - - let Some(esm_asset) = Vc::try_resolve_sidecast::>(module).await? - else { - bail!("WASM loader was not processed into an EcmascriptModuleAsset"); - }; - - Ok(esm_asset) - } - - #[turbo_tasks::function] - async fn loader(self: Vc) -> Result>> { - let module = self.loader_as_module(); - let Some(esm_asset) = - Vc::try_resolve_sidecast::>(module).await? + Vc::try_resolve_downcast_type::(module).await? else { bail!("WASM loader was not processed into an EcmascriptModuleAsset"); }; @@ -174,7 +156,7 @@ impl ResolveOrigin for WebAssemblyModuleAsset { #[turbo_tasks::function] fn get_inner_asset(self: Vc, request: Vc) -> Vc { - self.loader_as_resolve_origin().get_inner_asset(request) + self.loader().get_inner_asset(request) } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index 6e2570c972361..3eedd7243df0b 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -78,7 +78,6 @@ impl ModuleOptions { execution_context, ref rules, esm_url_rewrite_behavior, - special_exports, import_externals, ignore_dynamic_requests, use_swc_css, @@ -123,7 +122,6 @@ impl ModuleOptions { tree_shaking_mode, url_rewrite_behavior: esm_url_rewrite_behavior, import_externals, - special_exports, ignore_dynamic_requests, refresh, ..Default::default() diff --git a/crates/turbopack/src/module_options/module_options_context.rs b/crates/turbopack/src/module_options/module_options_context.rs index 41cab2b11815a..0b4121f69cc6a 100644 --- a/crates/turbopack/src/module_options/module_options_context.rs +++ b/crates/turbopack/src/module_options/module_options_context.rs @@ -141,7 +141,6 @@ pub struct ModuleOptionsContext { pub placeholder_for_future_extensions: (), pub tree_shaking_mode: Option, pub esm_url_rewrite_behavior: Option, - pub special_exports: Vc>, /// References to externals from ESM imports should use `import()` and make /// async modules. pub import_externals: bool, From e5af35276fc4b6878a76594f54c09c01b7b101a5 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:42:32 +0200 Subject: [PATCH 07/73] Update Turbopack members in labeler (#8767) - Add @LichuAcu , @arlyon and myself to the Turbopack team and the triage-exclusion list - @dimitropoulos was already in the Turborepo list but not in the triage-exclusion list --- .github/turbo-orchestrator.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/turbo-orchestrator.yml b/.github/turbo-orchestrator.yml index f64fc845abcd7..fda47420cf68d 100644 --- a/.github/turbo-orchestrator.yml +++ b/.github/turbo-orchestrator.yml @@ -41,7 +41,7 @@ labeler: # created-by - label: "created-by: turbopack" when: - isPRAuthorMatch: "^(bgw|ForsakenHarmony|kdy1|kwonoj|padmaia|sokra|wbinnssmith)$" + isPRAuthorMatch: "^(arlyon|bgw|ForsakenHarmony|kdy1|LichuAcu|mischnic|padmaia|sokra|wbinnssmith)$" - label: "created-by: turborepo" when: isPRAuthorMatch: "^(anthonyshew|dimitropoulos|tknickman|mehulkar|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" @@ -49,7 +49,7 @@ labeler: # needs: triage when not any of the turbopack or turborepo team - label: "needs: triage" when: - isNotPRAuthorMatch: "^(bgw|ForsakenHarmony|kdy1|kwonoj|padmaia|sokra|wbinnssmith|anthonyshew|tknickman|mehulkar|chris-olszewski|NicholasLYang|arlyon|Zertsov|paulogdm|codybrouwers)$" + isNotPRAuthorMatch: "^(arlyon|bgw|ForsakenHarmony|kdy1|LichuAcu|mischnic|padmaia|sokra|wbinnssmith|anthonyshew|dimitropoulos|tknickman|mehulkar|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" # areas - label: "area: ci" From 6060256c62c1317f664d8267b1d97075300e189f Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:07:42 +0200 Subject: [PATCH 08/73] Use fs and vm for async chunk loading in Node (#8722) ### Description Use `fs` and `vm` when loading chunks asynchronously in Node, to not block the thread while reading large chunks Closes PACK-411 ### Testing Instructions Using the `test/e2e/app-dir/dynamic/` Next.js tests --- .../js/src/nodejs/runtime.ts | 48 +++++++++++++++---- .../output/[turbopack]_runtime.js | 37 ++++++++++---- .../output/[turbopack]_runtime.js.map | 2 +- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/crates/turbopack-ecmascript-runtime/js/src/nodejs/runtime.ts b/crates/turbopack-ecmascript-runtime/js/src/nodejs/runtime.ts index 38dbc4918ec25..54a0244f524fd 100644 --- a/crates/turbopack-ecmascript-runtime/js/src/nodejs/runtime.ts +++ b/crates/turbopack-ecmascript-runtime/js/src/nodejs/runtime.ts @@ -49,6 +49,8 @@ type ModuleFactory = ( ) => undefined; const url = require("url"); +const fs = require("fs/promises"); +const vm = require("vm"); const moduleFactories: ModuleFactories = Object.create(null); const moduleCache: ModuleCache = Object.create(null); @@ -118,15 +120,45 @@ async function loadChunkAsync( source: SourceInfo, chunkData: ChunkData ): Promise { - return new Promise((resolve, reject) => { - try { - loadChunk(chunkData, source); - } catch (err) { - reject(err); - return; + const chunkPath = typeof chunkData === "string" ? chunkData : chunkData.path; + if (!chunkPath.endsWith(".js")) { + // We only support loading JS chunks in Node.js. + // This branch can be hit when trying to load a CSS chunk. + return; + } + + const resolved = path.resolve(RUNTIME_ROOT, chunkPath); + + try { + const contents = await fs.readFile(resolved, "utf-8"); + + const module = { + exports: {}, + }; + vm.runInThisContext( + "(function(module, exports, require, __dirname, __filename) {" + + contents + + "\n})", + resolved + )(module, module.exports, require, path.dirname(resolved), resolved); + + const chunkModules: ModuleFactories = module.exports; + for (const [moduleId, moduleFactory] of Object.entries(chunkModules)) { + if (!moduleFactories[moduleId]) { + moduleFactories[moduleId] = moduleFactory; + } } - resolve(); - }); + } catch (e) { + let errorMessage = `Failed to load chunk ${chunkPath}`; + + if (source) { + errorMessage += ` from ${stringifySourceInfo(source)}`; + } + + throw new Error(errorMessage, { + cause: e, + }); + } } function loadWebAssembly(chunkPath: ChunkPath, imports: WebAssembly.Imports) { diff --git a/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js b/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js index 57d30e4001002..d1ea5ab0f4fdf 100644 --- a/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js +++ b/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js @@ -428,6 +428,8 @@ function stringifySourceInfo(source) { } } const url = require("url"); +const fs = require("fs/promises"); +const vm = require("vm"); const moduleFactories = Object.create(null); const moduleCache = Object.create(null); /** @@ -476,15 +478,34 @@ function loadChunkPath(chunkPath, source) { } } async function loadChunkAsync(source, chunkData) { - return new Promise((resolve, reject)=>{ - try { - loadChunk(chunkData, source); - } catch (err) { - reject(err); - return; + const chunkPath = typeof chunkData === "string" ? chunkData : chunkData.path; + if (!chunkPath.endsWith(".js")) { + // We only support loading JS chunks in Node.js. + // This branch can be hit when trying to load a CSS chunk. + return; + } + const resolved = path.resolve(RUNTIME_ROOT, chunkPath); + try { + const contents = await fs.readFile(resolved, "utf-8"); + const module1 = { + exports: {} + }; + vm.runInThisContext("(function(module, exports, require, __dirname, __filename) {" + contents + "\n})", resolved)(module1, module1.exports, require, path.dirname(resolved), resolved); + const chunkModules = module1.exports; + for (const [moduleId, moduleFactory] of Object.entries(chunkModules)){ + if (!moduleFactories[moduleId]) { + moduleFactories[moduleId] = moduleFactory; + } } - resolve(); - }); + } catch (e) { + let errorMessage = `Failed to load chunk ${chunkPath}`; + if (source) { + errorMessage += ` from ${stringifySourceInfo(source)}`; + } + throw new Error(errorMessage, { + cause: e + }); + } } function loadWebAssembly(chunkPath, imports) { const resolved = path.resolve(RUNTIME_ROOT, chunkPath); diff --git a/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js.map b/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js.map index 988fc1672184d..bf446d5d55b18 100644 --- a/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js.map +++ b/crates/turbopack-tests/tests/snapshot/runtime/default_build_runtime/output/[turbopack]_runtime.js.map @@ -6,5 +6,5 @@ {"offset": {"line": 327, "column": 0}, "map": {"version":3,"sources":["turbopack://[turbopack]/shared-node/base-externals-utils.ts"],"sourcesContent":["/// \n\n/// A 'base' utilities to support runtime can have externals.\n/// Currently this is for node.js / edge runtime both.\n/// If a fn requires node.js specific behavior, it should be placed in `node-external-utils` instead.\n\nasync function externalImport(id: ModuleId) {\n let raw;\n try {\n raw = await import(id);\n } catch (err) {\n // TODO(alexkirsz) This can happen when a client-side module tries to load\n // an external module we don't provide a shim for (e.g. querystring, url).\n // For now, we fail semi-silently, but in the future this should be a\n // compilation error.\n throw new Error(`Failed to load external module ${id}: ${err}`);\n }\n\n if (raw && raw.__esModule && raw.default && \"default\" in raw.default) {\n return interopEsm(raw.default, createNS(raw), true);\n }\n\n return raw;\n}\n\nfunction externalRequire(\n id: ModuleId,\n esm: boolean = false\n): Exports | EsmNamespaceObject {\n let raw;\n try {\n raw = require(id);\n } catch (err) {\n // TODO(alexkirsz) This can happen when a client-side module tries to load\n // an external module we don't provide a shim for (e.g. querystring, url).\n // For now, we fail semi-silently, but in the future this should be a\n // compilation error.\n throw new Error(`Failed to load external module ${id}: ${err}`);\n }\n\n if (!esm || raw.__esModule) {\n return raw;\n }\n\n return interopEsm(raw, createNS(raw), true);\n}\n\nexternalRequire.resolve = (\n id: string,\n options?: {\n paths?: string[];\n }\n) => {\n return require.resolve(id, options);\n};\n"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,6DAA6D;AAC7D,sDAAsD;AACtD,qGAAqG;AAErG,eAAe,eAAe,EAAY;IACxC,IAAI;IACJ,IAAI;QACF,MAAM,MAAM,MAAM,CAAC;IACrB,EAAE,OAAO,KAAK;QACZ,0EAA0E;QAC1E,0EAA0E;QAC1E,qEAAqE;QACrE,qBAAqB;QACrB,MAAM,IAAI,MAAM,CAAC,+BAA+B,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC;IAChE;IAEA,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI,OAAO,IAAI,aAAa,IAAI,OAAO,EAAE;QACpE,OAAO,WAAW,IAAI,OAAO,EAAE,SAAS,MAAM;IAChD;IAEA,OAAO;AACT;AAEA,SAAS,gBACP,EAAY,EACZ,MAAe,KAAK;IAEpB,IAAI;IACJ,IAAI;QACF,MAAM,QAAQ;IAChB,EAAE,OAAO,KAAK;QACZ,0EAA0E;QAC1E,0EAA0E;QAC1E,qEAAqE;QACrE,qBAAqB;QACrB,MAAM,IAAI,MAAM,CAAC,+BAA+B,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC;IAChE;IAEA,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE;QAC1B,OAAO;IACT;IAEA,OAAO,WAAW,KAAK,SAAS,MAAM;AACxC;AAEA,gBAAgB,OAAO,GAAG,CACxB,IACA;IAIA,OAAO,QAAQ,OAAO,CAAC,IAAI;AAC7B"}}, {"offset": {"line": 366, "column": 0}, "map": {"version":3,"sources":["turbopack://[turbopack]/shared-node/node-externals-utils.ts"],"sourcesContent":["declare var RUNTIME_PUBLIC_PATH: string;\ndeclare var OUTPUT_ROOT: string;\ndeclare var ASSET_PREFIX: string;\n\nconst path = require(\"path\");\n\nconst relativePathToRuntimeRoot = path.relative(RUNTIME_PUBLIC_PATH, \".\");\n// Compute the relative path to the `distDir`.\nconst relativePathToDistRoot = path.relative(\n path.join(OUTPUT_ROOT, RUNTIME_PUBLIC_PATH),\n \".\"\n);\nconst RUNTIME_ROOT = path.resolve(__filename, relativePathToRuntimeRoot);\n// Compute the absolute path to the root, by stripping distDir from the absolute path to this file.\nconst ABSOLUTE_ROOT = path.resolve(__filename, relativePathToDistRoot);\n\n/**\n * Returns an absolute path to the given module path.\n * Module path should be relative, either path to a file or a directory.\n *\n * This fn allows to calculate an absolute path for some global static values, such as\n * `__dirname` or `import.meta.url` that Turbopack will not embeds in compile time.\n * See ImportMetaBinding::code_generation for the usage.\n */\nfunction resolveAbsolutePath(modulePath?: string): string {\n if (modulePath) {\n return path.join(ABSOLUTE_ROOT, modulePath);\n }\n return ABSOLUTE_ROOT;\n}\n"],"names":[],"mappings":"AAIA,MAAM,OAAO,QAAQ;AAErB,MAAM,4BAA4B,KAAK,QAAQ,CAAC,qBAAqB;AACrE,8CAA8C;AAC9C,MAAM,yBAAyB,KAAK,QAAQ,CAC1C,KAAK,IAAI,CAAC,aAAa,sBACvB;AAEF,MAAM,eAAe,KAAK,OAAO,CAAC,YAAY;AAC9C,mGAAmG;AACnG,MAAM,gBAAgB,KAAK,OAAO,CAAC,YAAY;AAE/C;;;;;;;CAOC,GACD,SAAS,oBAAoB,UAAmB;IAC9C,IAAI,YAAY;QACd,OAAO,KAAK,IAAI,CAAC,eAAe;IAClC;IACA,OAAO;AACT"}}, {"offset": {"line": 386, "column": 0}, "map": {"version":3,"sources":["turbopack://[turbopack]/shared-node/node-wasm-utils.ts"],"sourcesContent":["/// \n\nfunction readWebAssemblyAsResponse(path: string) {\n const { createReadStream } = require(\"fs\") as typeof import(\"fs\");\n const { Readable } = require(\"stream\") as typeof import(\"stream\");\n\n const stream = createReadStream(path);\n\n // @ts-ignore unfortunately there's a slight type mismatch with the stream.\n return new Response(Readable.toWeb(stream), {\n headers: {\n \"content-type\": \"application/wasm\",\n },\n });\n}\n\nasync function compileWebAssemblyFromPath(\n path: string\n): Promise {\n const response = readWebAssemblyAsResponse(path);\n\n return await WebAssembly.compileStreaming(response);\n}\n\nasync function instantiateWebAssemblyFromPath(\n path: string,\n importsObj: WebAssembly.Imports\n): Promise {\n const response = readWebAssemblyAsResponse(path);\n\n const { instance } = await WebAssembly.instantiateStreaming(\n response,\n importsObj\n );\n\n return instance.exports;\n}\n"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,SAAS,0BAA0B,IAAY;IAC7C,MAAM,EAAE,gBAAgB,EAAE,GAAG,QAAQ;IACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ;IAE7B,MAAM,SAAS,iBAAiB;IAEhC,2EAA2E;IAC3E,OAAO,IAAI,SAAS,SAAS,KAAK,CAAC,SAAS;QAC1C,SAAS;YACP,gBAAgB;QAClB;IACF;AACF;AAEA,eAAe,2BACb,IAAY;IAEZ,MAAM,WAAW,0BAA0B;IAE3C,OAAO,MAAM,YAAY,gBAAgB,CAAC;AAC5C;AAEA,eAAe,+BACb,IAAY,EACZ,UAA+B;IAE/B,MAAM,WAAW,0BAA0B;IAE3C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,oBAAoB,CACzD,UACA;IAGF,OAAO,SAAS,OAAO;AACzB"}}, - {"offset": {"line": 407, "column": 0}, "map": {"version":3,"sources":["turbopack://[turbopack]/nodejs/runtime.ts"],"sourcesContent":["/// \n/// \n/// \n/// \n\nenum SourceType {\n /**\n * The module was instantiated because it was included in an evaluated chunk's\n * runtime.\n */\n Runtime = 0,\n /**\n * The module was instantiated because a parent module imported it.\n */\n Parent = 1,\n}\n\ntype SourceInfo =\n | {\n type: SourceType.Runtime;\n chunkPath: ChunkPath;\n }\n | {\n type: SourceType.Parent;\n parentId: ModuleId;\n };\n\nfunction stringifySourceInfo(source: SourceInfo): string {\n switch (source.type) {\n case SourceType.Runtime:\n return `runtime for chunk ${source.chunkPath}`;\n case SourceType.Parent:\n return `parent module ${source.parentId}`;\n }\n}\n\ntype ExternalRequire = (id: ModuleId) => Exports | EsmNamespaceObject;\ntype ExternalImport = (id: ModuleId) => Promise;\n\ninterface TurbopackNodeBuildContext extends TurbopackBaseContext {\n R: ResolvePathFromModule;\n x: ExternalRequire;\n y: ExternalImport;\n}\n\ntype ModuleFactory = (\n this: Module[\"exports\"],\n context: TurbopackNodeBuildContext\n) => undefined;\n\nconst url = require(\"url\");\n\nconst moduleFactories: ModuleFactories = Object.create(null);\nconst moduleCache: ModuleCache = Object.create(null);\n\n/**\n * Returns an absolute path to the given module's id.\n */\nfunction createResolvePathFromModule(\n resolver: (moduleId: string) => Exports\n): (moduleId: string) => string {\n return function resolvePathFromModule(moduleId: string): string {\n const exported = resolver(moduleId);\n const exportedPath = exported?.default ?? exported;\n if (typeof exportedPath !== \"string\") {\n return exported as any;\n }\n\n const strippedAssetPrefix = exportedPath.slice(ASSET_PREFIX.length);\n const resolved = path.resolve(\n ABSOLUTE_ROOT,\n OUTPUT_ROOT,\n strippedAssetPrefix\n );\n\n return url.pathToFileURL(resolved);\n };\n}\n\nfunction loadChunk(chunkData: ChunkData, source?: SourceInfo): void {\n if (typeof chunkData === \"string\") {\n return loadChunkPath(chunkData, source);\n } else {\n return loadChunkPath(chunkData.path, source);\n }\n}\n\nfunction loadChunkPath(chunkPath: ChunkPath, source?: SourceInfo): void {\n if (!chunkPath.endsWith(\".js\")) {\n // We only support loading JS chunks in Node.js.\n // This branch can be hit when trying to load a CSS chunk.\n return;\n }\n\n try {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n const chunkModules: ModuleFactories = require(resolved);\n\n for (const [moduleId, moduleFactory] of Object.entries(chunkModules)) {\n if (!moduleFactories[moduleId]) {\n moduleFactories[moduleId] = moduleFactory;\n }\n }\n } catch (e) {\n let errorMessage = `Failed to load chunk ${chunkPath}`;\n\n if (source) {\n errorMessage += ` from ${stringifySourceInfo(source)}`;\n }\n\n throw new Error(errorMessage, {\n cause: e,\n });\n }\n}\n\nasync function loadChunkAsync(\n source: SourceInfo,\n chunkData: ChunkData\n): Promise {\n return new Promise((resolve, reject) => {\n try {\n loadChunk(chunkData, source);\n } catch (err) {\n reject(err);\n return;\n }\n resolve();\n });\n}\n\nfunction loadWebAssembly(chunkPath: ChunkPath, imports: WebAssembly.Imports) {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n\n return instantiateWebAssemblyFromPath(resolved, imports);\n}\n\nfunction loadWebAssemblyModule(chunkPath: ChunkPath) {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n\n return compileWebAssemblyFromPath(resolved);\n}\n\nfunction instantiateModule(id: ModuleId, source: SourceInfo): Module {\n const moduleFactory = moduleFactories[id];\n if (typeof moduleFactory !== \"function\") {\n // This can happen if modules incorrectly handle HMR disposes/updates,\n // e.g. when they keep a `setTimeout` around which still executes old code\n // and contains e.g. a `require(\"something\")` call.\n let instantiationReason;\n switch (source.type) {\n case SourceType.Runtime:\n instantiationReason = `as a runtime entry of chunk ${source.chunkPath}`;\n break;\n case SourceType.Parent:\n instantiationReason = `because it was required from module ${source.parentId}`;\n break;\n }\n throw new Error(\n `Module ${id} was instantiated ${instantiationReason}, but the module factory is not available. It might have been deleted in an HMR update.`\n );\n }\n\n let parents: ModuleId[];\n switch (source.type) {\n case SourceType.Runtime:\n parents = [];\n break;\n case SourceType.Parent:\n // No need to add this module as a child of the parent module here, this\n // has already been taken care of in `getOrInstantiateModuleFromParent`.\n parents = [source.parentId];\n break;\n }\n\n const module: Module = {\n exports: {},\n error: undefined,\n loaded: false,\n id,\n parents,\n children: [],\n namespaceObject: undefined,\n };\n moduleCache[id] = module;\n\n // NOTE(alexkirsz) This can fail when the module encounters a runtime error.\n try {\n const r = commonJsRequire.bind(null, module);\n moduleFactory.call(module.exports, {\n a: asyncModule.bind(null, module),\n e: module.exports,\n r,\n t: runtimeRequire,\n x: externalRequire,\n y: externalImport,\n f: moduleContext,\n i: esmImport.bind(null, module),\n s: esmExport.bind(null, module, module.exports),\n j: dynamicExport.bind(null, module, module.exports),\n v: exportValue.bind(null, module),\n n: exportNamespace.bind(null, module),\n m: module,\n c: moduleCache,\n M: moduleFactories,\n l: loadChunkAsync.bind(null, { type: SourceType.Parent, parentId: id }),\n w: loadWebAssembly,\n u: loadWebAssemblyModule,\n g: globalThis,\n P: resolveAbsolutePath,\n U: relativeURL,\n R: createResolvePathFromModule(r),\n __dirname: module.id.replace(/(^|\\/)[\\/]+$/, \"\"),\n });\n } catch (error) {\n module.error = error as any;\n throw error;\n }\n\n module.loaded = true;\n if (module.namespaceObject && module.exports !== module.namespaceObject) {\n // in case of a circular dependency: cjs1 -> esm2 -> cjs1\n interopEsm(module.exports, module.namespaceObject);\n }\n\n return module;\n}\n\n/**\n * Retrieves a module from the cache, or instantiate it if it is not cached.\n */\nfunction getOrInstantiateModuleFromParent(\n id: ModuleId,\n sourceModule: Module\n): Module {\n const module = moduleCache[id];\n\n if (sourceModule.children.indexOf(id) === -1) {\n sourceModule.children.push(id);\n }\n\n if (module) {\n if (module.parents.indexOf(sourceModule.id) === -1) {\n module.parents.push(sourceModule.id);\n }\n\n return module;\n }\n\n return instantiateModule(id, {\n type: SourceType.Parent,\n parentId: sourceModule.id,\n });\n}\n\n/**\n * Instantiates a runtime module.\n */\nfunction instantiateRuntimeModule(\n moduleId: ModuleId,\n chunkPath: ChunkPath\n): Module {\n return instantiateModule(moduleId, { type: SourceType.Runtime, chunkPath });\n}\n\n/**\n * Retrieves a module from the cache, or instantiate it as a runtime module if it is not cached.\n */\nfunction getOrInstantiateRuntimeModule(\n moduleId: ModuleId,\n chunkPath: ChunkPath\n): Module {\n const module = moduleCache[moduleId];\n if (module) {\n if (module.error) {\n throw module.error;\n }\n return module;\n }\n\n return instantiateRuntimeModule(moduleId, chunkPath);\n}\n\nmodule.exports = {\n getOrInstantiateRuntimeModule,\n loadChunk,\n};\n"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,+DAA+D;AAC/D,+DAA+D;AAC/D,0DAA0D;;UAErD;IACH;;;GAGC;IAED;;GAEC;GARE,eAAA;AAsBL,SAAS,oBAAoB,MAAkB;IAC7C,OAAQ,OAAO,IAAI;QACjB;YACE,OAAO,CAAC,kBAAkB,EAAE,OAAO,SAAS,CAAC,CAAC;QAChD;YACE,OAAO,CAAC,cAAc,EAAE,OAAO,QAAQ,CAAC,CAAC;IAC7C;AACF;AAgBA,MAAM,MAAM,QAAQ;AAEpB,MAAM,kBAAmC,OAAO,MAAM,CAAC;AACvD,MAAM,cAA2B,OAAO,MAAM,CAAC;AAE/C;;CAEC,GACD,SAAS,4BACP,QAAuC;IAEvC,OAAO,SAAS,sBAAsB,QAAgB;QACpD,MAAM,WAAW,SAAS;QAC1B,MAAM,eAAe,UAAU,WAAW;QAC1C,IAAI,OAAO,iBAAiB,UAAU;YACpC,OAAO;QACT;QAEA,MAAM,sBAAsB,aAAa,KAAK,CAAC,aAAa,MAAM;QAClE,MAAM,WAAW,KAAK,OAAO,CAC3B,eACA,aACA;QAGF,OAAO,IAAI,aAAa,CAAC;IAC3B;AACF;AAEA,SAAS,UAAU,SAAoB,EAAE,MAAmB;IAC1D,IAAI,OAAO,cAAc,UAAU;QACjC,OAAO,cAAc,WAAW;IAClC,OAAO;QACL,OAAO,cAAc,UAAU,IAAI,EAAE;IACvC;AACF;AAEA,SAAS,cAAc,SAAoB,EAAE,MAAmB;IAC9D,IAAI,CAAC,UAAU,QAAQ,CAAC,QAAQ;QAC9B,gDAAgD;QAChD,0DAA0D;QAC1D;IACF;IAEA,IAAI;QACF,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;QAC5C,MAAM,eAAgC,QAAQ;QAE9C,KAAK,MAAM,CAAC,UAAU,cAAc,IAAI,OAAO,OAAO,CAAC,cAAe;YACpE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;gBAC9B,eAAe,CAAC,SAAS,GAAG;YAC9B;QACF;IACF,EAAE,OAAO,GAAG;QACV,IAAI,eAAe,CAAC,qBAAqB,EAAE,UAAU,CAAC;QAEtD,IAAI,QAAQ;YACV,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,QAAQ,CAAC;QACxD;QAEA,MAAM,IAAI,MAAM,cAAc;YAC5B,OAAO;QACT;IACF;AACF;AAEA,eAAe,eACb,MAAkB,EAClB,SAAoB;IAEpB,OAAO,IAAI,QAAc,CAAC,SAAS;QACjC,IAAI;YACF,UAAU,WAAW;QACvB,EAAE,OAAO,KAAK;YACZ,OAAO;YACP;QACF;QACA;IACF;AACF;AAEA,SAAS,gBAAgB,SAAoB,EAAE,OAA4B;IACzE,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;IAE5C,OAAO,+BAA+B,UAAU;AAClD;AAEA,SAAS,sBAAsB,SAAoB;IACjD,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;IAE5C,OAAO,2BAA2B;AACpC;AAEA,SAAS,kBAAkB,EAAY,EAAE,MAAkB;IACzD,MAAM,gBAAgB,eAAe,CAAC,GAAG;IACzC,IAAI,OAAO,kBAAkB,YAAY;QACvC,sEAAsE;QACtE,0EAA0E;QAC1E,mDAAmD;QACnD,IAAI;QACJ,OAAQ,OAAO,IAAI;YACjB;gBACE,sBAAsB,CAAC,4BAA4B,EAAE,OAAO,SAAS,CAAC,CAAC;gBACvE;YACF;gBACE,sBAAsB,CAAC,oCAAoC,EAAE,OAAO,QAAQ,CAAC,CAAC;gBAC9E;QACJ;QACA,MAAM,IAAI,MACR,CAAC,OAAO,EAAE,GAAG,kBAAkB,EAAE,oBAAoB,uFAAuF,CAAC;IAEjJ;IAEA,IAAI;IACJ,OAAQ,OAAO,IAAI;QACjB;YACE,UAAU,EAAE;YACZ;QACF;YACE,wEAAwE;YACxE,wEAAwE;YACxE,UAAU;gBAAC,OAAO,QAAQ;aAAC;YAC3B;IACJ;IAEA,MAAM,UAAiB;QACrB,SAAS,CAAC;QACV,OAAO;QACP,QAAQ;QACR;QACA;QACA,UAAU,EAAE;QACZ,iBAAiB;IACnB;IACA,WAAW,CAAC,GAAG,GAAG;IAElB,4EAA4E;IAC5E,IAAI;QACF,MAAM,IAAI,gBAAgB,IAAI,CAAC,MAAM;QACrC,cAAc,IAAI,CAAC,QAAO,OAAO,EAAE;YACjC,GAAG,YAAY,IAAI,CAAC,MAAM;YAC1B,GAAG,QAAO,OAAO;YACjB;YACA,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,UAAU,IAAI,CAAC,MAAM;YACxB,GAAG,UAAU,IAAI,CAAC,MAAM,SAAQ,QAAO,OAAO;YAC9C,GAAG,cAAc,IAAI,CAAC,MAAM,SAAQ,QAAO,OAAO;YAClD,GAAG,YAAY,IAAI,CAAC,MAAM;YAC1B,GAAG,gBAAgB,IAAI,CAAC,MAAM;YAC9B,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,eAAe,IAAI,CAAC,MAAM;gBAAE,IAAI;gBAAqB,UAAU;YAAG;YACrE,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,4BAA4B;YAC/B,WAAW,QAAO,EAAE,CAAC,OAAO,CAAC,gBAAgB;QAC/C;IACF,EAAE,OAAO,OAAO;QACd,QAAO,KAAK,GAAG;QACf,MAAM;IACR;IAEA,QAAO,MAAM,GAAG;IAChB,IAAI,QAAO,eAAe,IAAI,QAAO,OAAO,KAAK,QAAO,eAAe,EAAE;QACvE,yDAAyD;QACzD,WAAW,QAAO,OAAO,EAAE,QAAO,eAAe;IACnD;IAEA,OAAO;AACT;AAEA;;CAEC,GACD,SAAS,iCACP,EAAY,EACZ,YAAoB;IAEpB,MAAM,UAAS,WAAW,CAAC,GAAG;IAE9B,IAAI,aAAa,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;QAC5C,aAAa,QAAQ,CAAC,IAAI,CAAC;IAC7B;IAEA,IAAI,SAAQ;QACV,IAAI,QAAO,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG;YAClD,QAAO,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE;QACrC;QAEA,OAAO;IACT;IAEA,OAAO,kBAAkB,IAAI;QAC3B,IAAI;QACJ,UAAU,aAAa,EAAE;IAC3B;AACF;AAEA;;CAEC,GACD,SAAS,yBACP,QAAkB,EAClB,SAAoB;IAEpB,OAAO,kBAAkB,UAAU;QAAE,IAAI;QAAsB;IAAU;AAC3E;AAEA;;CAEC,GACD,SAAS,8BACP,QAAkB,EAClB,SAAoB;IAEpB,MAAM,UAAS,WAAW,CAAC,SAAS;IACpC,IAAI,SAAQ;QACV,IAAI,QAAO,KAAK,EAAE;YAChB,MAAM,QAAO,KAAK;QACpB;QACA,OAAO;IACT;IAEA,OAAO,yBAAyB,UAAU;AAC5C;AAEA,OAAO,OAAO,GAAG;IACf;IACA;AACF"}}] + {"offset": {"line": 407, "column": 0}, "map": {"version":3,"sources":["turbopack://[turbopack]/nodejs/runtime.ts"],"sourcesContent":["/// \n/// \n/// \n/// \n\nenum SourceType {\n /**\n * The module was instantiated because it was included in an evaluated chunk's\n * runtime.\n */\n Runtime = 0,\n /**\n * The module was instantiated because a parent module imported it.\n */\n Parent = 1,\n}\n\ntype SourceInfo =\n | {\n type: SourceType.Runtime;\n chunkPath: ChunkPath;\n }\n | {\n type: SourceType.Parent;\n parentId: ModuleId;\n };\n\nfunction stringifySourceInfo(source: SourceInfo): string {\n switch (source.type) {\n case SourceType.Runtime:\n return `runtime for chunk ${source.chunkPath}`;\n case SourceType.Parent:\n return `parent module ${source.parentId}`;\n }\n}\n\ntype ExternalRequire = (id: ModuleId) => Exports | EsmNamespaceObject;\ntype ExternalImport = (id: ModuleId) => Promise;\n\ninterface TurbopackNodeBuildContext extends TurbopackBaseContext {\n R: ResolvePathFromModule;\n x: ExternalRequire;\n y: ExternalImport;\n}\n\ntype ModuleFactory = (\n this: Module[\"exports\"],\n context: TurbopackNodeBuildContext\n) => undefined;\n\nconst url = require(\"url\");\nconst fs = require(\"fs/promises\");\nconst vm = require(\"vm\");\n\nconst moduleFactories: ModuleFactories = Object.create(null);\nconst moduleCache: ModuleCache = Object.create(null);\n\n/**\n * Returns an absolute path to the given module's id.\n */\nfunction createResolvePathFromModule(\n resolver: (moduleId: string) => Exports\n): (moduleId: string) => string {\n return function resolvePathFromModule(moduleId: string): string {\n const exported = resolver(moduleId);\n const exportedPath = exported?.default ?? exported;\n if (typeof exportedPath !== \"string\") {\n return exported as any;\n }\n\n const strippedAssetPrefix = exportedPath.slice(ASSET_PREFIX.length);\n const resolved = path.resolve(\n ABSOLUTE_ROOT,\n OUTPUT_ROOT,\n strippedAssetPrefix\n );\n\n return url.pathToFileURL(resolved);\n };\n}\n\nfunction loadChunk(chunkData: ChunkData, source?: SourceInfo): void {\n if (typeof chunkData === \"string\") {\n return loadChunkPath(chunkData, source);\n } else {\n return loadChunkPath(chunkData.path, source);\n }\n}\n\nfunction loadChunkPath(chunkPath: ChunkPath, source?: SourceInfo): void {\n if (!chunkPath.endsWith(\".js\")) {\n // We only support loading JS chunks in Node.js.\n // This branch can be hit when trying to load a CSS chunk.\n return;\n }\n\n try {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n const chunkModules: ModuleFactories = require(resolved);\n\n for (const [moduleId, moduleFactory] of Object.entries(chunkModules)) {\n if (!moduleFactories[moduleId]) {\n moduleFactories[moduleId] = moduleFactory;\n }\n }\n } catch (e) {\n let errorMessage = `Failed to load chunk ${chunkPath}`;\n\n if (source) {\n errorMessage += ` from ${stringifySourceInfo(source)}`;\n }\n\n throw new Error(errorMessage, {\n cause: e,\n });\n }\n}\n\nasync function loadChunkAsync(\n source: SourceInfo,\n chunkData: ChunkData\n): Promise {\n const chunkPath = typeof chunkData === \"string\" ? chunkData : chunkData.path;\n if (!chunkPath.endsWith(\".js\")) {\n // We only support loading JS chunks in Node.js.\n // This branch can be hit when trying to load a CSS chunk.\n return;\n }\n\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n\n try {\n const contents = await fs.readFile(resolved, \"utf-8\");\n\n const module = {\n exports: {},\n };\n vm.runInThisContext(\n \"(function(module, exports, require, __dirname, __filename) {\" +\n contents +\n \"\\n})\",\n resolved\n )(module, module.exports, require, path.dirname(resolved), resolved);\n\n const chunkModules: ModuleFactories = module.exports;\n for (const [moduleId, moduleFactory] of Object.entries(chunkModules)) {\n if (!moduleFactories[moduleId]) {\n moduleFactories[moduleId] = moduleFactory;\n }\n }\n } catch (e) {\n let errorMessage = `Failed to load chunk ${chunkPath}`;\n\n if (source) {\n errorMessage += ` from ${stringifySourceInfo(source)}`;\n }\n\n throw new Error(errorMessage, {\n cause: e,\n });\n }\n}\n\nfunction loadWebAssembly(chunkPath: ChunkPath, imports: WebAssembly.Imports) {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n\n return instantiateWebAssemblyFromPath(resolved, imports);\n}\n\nfunction loadWebAssemblyModule(chunkPath: ChunkPath) {\n const resolved = path.resolve(RUNTIME_ROOT, chunkPath);\n\n return compileWebAssemblyFromPath(resolved);\n}\n\nfunction instantiateModule(id: ModuleId, source: SourceInfo): Module {\n const moduleFactory = moduleFactories[id];\n if (typeof moduleFactory !== \"function\") {\n // This can happen if modules incorrectly handle HMR disposes/updates,\n // e.g. when they keep a `setTimeout` around which still executes old code\n // and contains e.g. a `require(\"something\")` call.\n let instantiationReason;\n switch (source.type) {\n case SourceType.Runtime:\n instantiationReason = `as a runtime entry of chunk ${source.chunkPath}`;\n break;\n case SourceType.Parent:\n instantiationReason = `because it was required from module ${source.parentId}`;\n break;\n }\n throw new Error(\n `Module ${id} was instantiated ${instantiationReason}, but the module factory is not available. It might have been deleted in an HMR update.`\n );\n }\n\n let parents: ModuleId[];\n switch (source.type) {\n case SourceType.Runtime:\n parents = [];\n break;\n case SourceType.Parent:\n // No need to add this module as a child of the parent module here, this\n // has already been taken care of in `getOrInstantiateModuleFromParent`.\n parents = [source.parentId];\n break;\n }\n\n const module: Module = {\n exports: {},\n error: undefined,\n loaded: false,\n id,\n parents,\n children: [],\n namespaceObject: undefined,\n };\n moduleCache[id] = module;\n\n // NOTE(alexkirsz) This can fail when the module encounters a runtime error.\n try {\n const r = commonJsRequire.bind(null, module);\n moduleFactory.call(module.exports, {\n a: asyncModule.bind(null, module),\n e: module.exports,\n r,\n t: runtimeRequire,\n x: externalRequire,\n y: externalImport,\n f: moduleContext,\n i: esmImport.bind(null, module),\n s: esmExport.bind(null, module, module.exports),\n j: dynamicExport.bind(null, module, module.exports),\n v: exportValue.bind(null, module),\n n: exportNamespace.bind(null, module),\n m: module,\n c: moduleCache,\n M: moduleFactories,\n l: loadChunkAsync.bind(null, { type: SourceType.Parent, parentId: id }),\n w: loadWebAssembly,\n u: loadWebAssemblyModule,\n g: globalThis,\n P: resolveAbsolutePath,\n U: relativeURL,\n R: createResolvePathFromModule(r),\n __dirname: module.id.replace(/(^|\\/)[\\/]+$/, \"\"),\n });\n } catch (error) {\n module.error = error as any;\n throw error;\n }\n\n module.loaded = true;\n if (module.namespaceObject && module.exports !== module.namespaceObject) {\n // in case of a circular dependency: cjs1 -> esm2 -> cjs1\n interopEsm(module.exports, module.namespaceObject);\n }\n\n return module;\n}\n\n/**\n * Retrieves a module from the cache, or instantiate it if it is not cached.\n */\nfunction getOrInstantiateModuleFromParent(\n id: ModuleId,\n sourceModule: Module\n): Module {\n const module = moduleCache[id];\n\n if (sourceModule.children.indexOf(id) === -1) {\n sourceModule.children.push(id);\n }\n\n if (module) {\n if (module.parents.indexOf(sourceModule.id) === -1) {\n module.parents.push(sourceModule.id);\n }\n\n return module;\n }\n\n return instantiateModule(id, {\n type: SourceType.Parent,\n parentId: sourceModule.id,\n });\n}\n\n/**\n * Instantiates a runtime module.\n */\nfunction instantiateRuntimeModule(\n moduleId: ModuleId,\n chunkPath: ChunkPath\n): Module {\n return instantiateModule(moduleId, { type: SourceType.Runtime, chunkPath });\n}\n\n/**\n * Retrieves a module from the cache, or instantiate it as a runtime module if it is not cached.\n */\nfunction getOrInstantiateRuntimeModule(\n moduleId: ModuleId,\n chunkPath: ChunkPath\n): Module {\n const module = moduleCache[moduleId];\n if (module) {\n if (module.error) {\n throw module.error;\n }\n return module;\n }\n\n return instantiateRuntimeModule(moduleId, chunkPath);\n}\n\nmodule.exports = {\n getOrInstantiateRuntimeModule,\n loadChunk,\n};\n"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,+DAA+D;AAC/D,+DAA+D;AAC/D,0DAA0D;;UAErD;IACH;;;GAGC;IAED;;GAEC;GARE,eAAA;AAsBL,SAAS,oBAAoB,MAAkB;IAC7C,OAAQ,OAAO,IAAI;QACjB;YACE,OAAO,CAAC,kBAAkB,EAAE,OAAO,SAAS,CAAC,CAAC;QAChD;YACE,OAAO,CAAC,cAAc,EAAE,OAAO,QAAQ,CAAC,CAAC;IAC7C;AACF;AAgBA,MAAM,MAAM,QAAQ;AACpB,MAAM,KAAK,QAAQ;AACnB,MAAM,KAAK,QAAQ;AAEnB,MAAM,kBAAmC,OAAO,MAAM,CAAC;AACvD,MAAM,cAA2B,OAAO,MAAM,CAAC;AAE/C;;CAEC,GACD,SAAS,4BACP,QAAuC;IAEvC,OAAO,SAAS,sBAAsB,QAAgB;QACpD,MAAM,WAAW,SAAS;QAC1B,MAAM,eAAe,UAAU,WAAW;QAC1C,IAAI,OAAO,iBAAiB,UAAU;YACpC,OAAO;QACT;QAEA,MAAM,sBAAsB,aAAa,KAAK,CAAC,aAAa,MAAM;QAClE,MAAM,WAAW,KAAK,OAAO,CAC3B,eACA,aACA;QAGF,OAAO,IAAI,aAAa,CAAC;IAC3B;AACF;AAEA,SAAS,UAAU,SAAoB,EAAE,MAAmB;IAC1D,IAAI,OAAO,cAAc,UAAU;QACjC,OAAO,cAAc,WAAW;IAClC,OAAO;QACL,OAAO,cAAc,UAAU,IAAI,EAAE;IACvC;AACF;AAEA,SAAS,cAAc,SAAoB,EAAE,MAAmB;IAC9D,IAAI,CAAC,UAAU,QAAQ,CAAC,QAAQ;QAC9B,gDAAgD;QAChD,0DAA0D;QAC1D;IACF;IAEA,IAAI;QACF,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;QAC5C,MAAM,eAAgC,QAAQ;QAE9C,KAAK,MAAM,CAAC,UAAU,cAAc,IAAI,OAAO,OAAO,CAAC,cAAe;YACpE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;gBAC9B,eAAe,CAAC,SAAS,GAAG;YAC9B;QACF;IACF,EAAE,OAAO,GAAG;QACV,IAAI,eAAe,CAAC,qBAAqB,EAAE,UAAU,CAAC;QAEtD,IAAI,QAAQ;YACV,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,QAAQ,CAAC;QACxD;QAEA,MAAM,IAAI,MAAM,cAAc;YAC5B,OAAO;QACT;IACF;AACF;AAEA,eAAe,eACb,MAAkB,EAClB,SAAoB;IAEpB,MAAM,YAAY,OAAO,cAAc,WAAW,YAAY,UAAU,IAAI;IAC5E,IAAI,CAAC,UAAU,QAAQ,CAAC,QAAQ;QAC9B,gDAAgD;QAChD,0DAA0D;QAC1D;IACF;IAEA,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;IAE5C,IAAI;QACF,MAAM,WAAW,MAAM,GAAG,QAAQ,CAAC,UAAU;QAE7C,MAAM,UAAS;YACb,SAAS,CAAC;QACZ;QACA,GAAG,gBAAgB,CACjB,iEACE,WACA,QACF,UACA,SAAQ,QAAO,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW;QAE3D,MAAM,eAAgC,QAAO,OAAO;QACpD,KAAK,MAAM,CAAC,UAAU,cAAc,IAAI,OAAO,OAAO,CAAC,cAAe;YACpE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;gBAC9B,eAAe,CAAC,SAAS,GAAG;YAC9B;QACF;IACF,EAAE,OAAO,GAAG;QACV,IAAI,eAAe,CAAC,qBAAqB,EAAE,UAAU,CAAC;QAEtD,IAAI,QAAQ;YACV,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,QAAQ,CAAC;QACxD;QAEA,MAAM,IAAI,MAAM,cAAc;YAC5B,OAAO;QACT;IACF;AACF;AAEA,SAAS,gBAAgB,SAAoB,EAAE,OAA4B;IACzE,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;IAE5C,OAAO,+BAA+B,UAAU;AAClD;AAEA,SAAS,sBAAsB,SAAoB;IACjD,MAAM,WAAW,KAAK,OAAO,CAAC,cAAc;IAE5C,OAAO,2BAA2B;AACpC;AAEA,SAAS,kBAAkB,EAAY,EAAE,MAAkB;IACzD,MAAM,gBAAgB,eAAe,CAAC,GAAG;IACzC,IAAI,OAAO,kBAAkB,YAAY;QACvC,sEAAsE;QACtE,0EAA0E;QAC1E,mDAAmD;QACnD,IAAI;QACJ,OAAQ,OAAO,IAAI;YACjB;gBACE,sBAAsB,CAAC,4BAA4B,EAAE,OAAO,SAAS,CAAC,CAAC;gBACvE;YACF;gBACE,sBAAsB,CAAC,oCAAoC,EAAE,OAAO,QAAQ,CAAC,CAAC;gBAC9E;QACJ;QACA,MAAM,IAAI,MACR,CAAC,OAAO,EAAE,GAAG,kBAAkB,EAAE,oBAAoB,uFAAuF,CAAC;IAEjJ;IAEA,IAAI;IACJ,OAAQ,OAAO,IAAI;QACjB;YACE,UAAU,EAAE;YACZ;QACF;YACE,wEAAwE;YACxE,wEAAwE;YACxE,UAAU;gBAAC,OAAO,QAAQ;aAAC;YAC3B;IACJ;IAEA,MAAM,UAAiB;QACrB,SAAS,CAAC;QACV,OAAO;QACP,QAAQ;QACR;QACA;QACA,UAAU,EAAE;QACZ,iBAAiB;IACnB;IACA,WAAW,CAAC,GAAG,GAAG;IAElB,4EAA4E;IAC5E,IAAI;QACF,MAAM,IAAI,gBAAgB,IAAI,CAAC,MAAM;QACrC,cAAc,IAAI,CAAC,QAAO,OAAO,EAAE;YACjC,GAAG,YAAY,IAAI,CAAC,MAAM;YAC1B,GAAG,QAAO,OAAO;YACjB;YACA,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,UAAU,IAAI,CAAC,MAAM;YACxB,GAAG,UAAU,IAAI,CAAC,MAAM,SAAQ,QAAO,OAAO;YAC9C,GAAG,cAAc,IAAI,CAAC,MAAM,SAAQ,QAAO,OAAO;YAClD,GAAG,YAAY,IAAI,CAAC,MAAM;YAC1B,GAAG,gBAAgB,IAAI,CAAC,MAAM;YAC9B,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,eAAe,IAAI,CAAC,MAAM;gBAAE,IAAI;gBAAqB,UAAU;YAAG;YACrE,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG,4BAA4B;YAC/B,WAAW,QAAO,EAAE,CAAC,OAAO,CAAC,gBAAgB;QAC/C;IACF,EAAE,OAAO,OAAO;QACd,QAAO,KAAK,GAAG;QACf,MAAM;IACR;IAEA,QAAO,MAAM,GAAG;IAChB,IAAI,QAAO,eAAe,IAAI,QAAO,OAAO,KAAK,QAAO,eAAe,EAAE;QACvE,yDAAyD;QACzD,WAAW,QAAO,OAAO,EAAE,QAAO,eAAe;IACnD;IAEA,OAAO;AACT;AAEA;;CAEC,GACD,SAAS,iCACP,EAAY,EACZ,YAAoB;IAEpB,MAAM,UAAS,WAAW,CAAC,GAAG;IAE9B,IAAI,aAAa,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;QAC5C,aAAa,QAAQ,CAAC,IAAI,CAAC;IAC7B;IAEA,IAAI,SAAQ;QACV,IAAI,QAAO,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG;YAClD,QAAO,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE;QACrC;QAEA,OAAO;IACT;IAEA,OAAO,kBAAkB,IAAI;QAC3B,IAAI;QACJ,UAAU,aAAa,EAAE;IAC3B;AACF;AAEA;;CAEC,GACD,SAAS,yBACP,QAAkB,EAClB,SAAoB;IAEpB,OAAO,kBAAkB,UAAU;QAAE,IAAI;QAAsB;IAAU;AAC3E;AAEA;;CAEC,GACD,SAAS,8BACP,QAAkB,EAClB,SAAoB;IAEpB,MAAM,UAAS,WAAW,CAAC,SAAS;IACpC,IAAI,SAAQ;QACV,IAAI,QAAO,KAAK,EAAE;YAChB,MAAM,QAAO,KAAK;QACpB;QACA,OAAO;IACT;IAEA,OAAO,yBAAyB,UAAU;AAC5C;AAEA,OAAO,OAAO,GAAG;IACf;IACA;AACF"}}] } \ No newline at end of file From 1ee3f85f51c7897c2c93c047b6c8af3b34a08960 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Tue, 16 Jul 2024 13:03:20 -0400 Subject: [PATCH 09/73] refactor(turborepo): derive `Opts` from `Config` (#8759) ### Description Changed `Opts` to be derived from more than just `RunArgs` and `ExecutionArgs`. This means that `Opts` contains the fully resolved config, which gets rid of some messy mutable logic in `RunBuilder` and creates a single source of truth. ### Testing Instructions Existing tests cover this pretty well. --- crates/turborepo-api-client/src/lib.rs | 10 ++ crates/turborepo-lib/src/cli/mod.rs | 29 +--- crates/turborepo-lib/src/opts.rs | 129 +++++++++++------- crates/turborepo-lib/src/run/builder.rs | 28 +--- turborepo-tests/integration/tests/no-args.t | 2 +- .../integration/tests/turbo-help.t | 3 +- 6 files changed, 106 insertions(+), 95 deletions(-) diff --git a/crates/turborepo-api-client/src/lib.rs b/crates/turborepo-api-client/src/lib.rs index e541fca9e7ed1..02863c59ee3c8 100644 --- a/crates/turborepo-api-client/src/lib.rs +++ b/crates/turborepo-api-client/src/lib.rs @@ -123,6 +123,16 @@ pub struct APIAuth { pub team_slug: Option, } +impl std::fmt::Debug for APIAuth { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("APIAuth") + .field("team_id", &self.team_id) + .field("token", &"***") + .field("team_slug", &self.team_slug) + .finish() + } +} + pub fn is_linked(api_auth: &Option) -> bool { api_auth .as_ref() diff --git a/crates/turborepo-lib/src/cli/mod.rs b/crates/turborepo-lib/src/cli/mod.rs index 7f54a52368df1..f4b399b434cfc 100644 --- a/crates/turborepo-lib/src/cli/mod.rs +++ b/crates/turborepo-lib/src/cli/mod.rs @@ -682,8 +682,8 @@ pub struct ExecutionArgs { /// Environment variable mode. /// Use "loose" to pass the entire existing environment. /// Use "strict" to use an allowlist specified in turbo.json. - #[clap(long = "env-mode", default_value = "strict", num_args = 0..=1, default_missing_value = "strict")] - pub env_mode: EnvMode, + #[clap(long = "env-mode", num_args = 0..=1, default_missing_value = "strict")] + pub env_mode: Option, /// Use the given selector to specify package(s) to act as /// entry points. The syntax mirrors pnpm's syntax, and /// additional documentation and examples can be found in @@ -755,8 +755,8 @@ impl ExecutionArgs { ); } - if self.env_mode != EnvMode::default() { - telemetry.track_arg_value("env-mode", self.env_mode, EventType::NonSensitive); + if let Some(env_mode) = self.env_mode { + telemetry.track_arg_value("env-mode", env_mode, EventType::NonSensitive); } if let Some(output_logs) = &self.output_logs { @@ -1443,7 +1443,7 @@ mod test { command: Some(Command::Run { execution_args: Box::new(ExecutionArgs { tasks: vec!["build".to_string()], - env_mode: EnvMode::Strict, + env_mode: Some(EnvMode::Strict), ..get_default_execution_args() }), run_args: Box::new(get_default_run_args()) @@ -1452,28 +1452,13 @@ mod test { } ; "env_mode: not fully-specified" )] - #[test_case::test_case( - &["turbo", "run", "build"], - Args { - command: Some(Command::Run { - execution_args: Box::new(ExecutionArgs { - tasks: vec!["build".to_string()], - env_mode: EnvMode::Strict, - ..get_default_execution_args() - }), - run_args: Box::new(get_default_run_args()) - }), - ..Args::default() - } ; - "env_mode: default strict" - )] #[test_case::test_case( &["turbo", "run", "build", "--env-mode", "loose"], Args { command: Some(Command::Run { execution_args: Box::new(ExecutionArgs { tasks: vec!["build".to_string()], - env_mode: EnvMode::Loose, + env_mode: Some(EnvMode::Loose), ..get_default_execution_args() }), run_args: Box::new(get_default_run_args()) @@ -1488,7 +1473,7 @@ mod test { command: Some(Command::Run { execution_args: Box::new(ExecutionArgs { tasks: vec!["build".to_string()], - env_mode: EnvMode::Strict, + env_mode: Some(EnvMode::Strict), ..get_default_execution_args() }), run_args: Box::new(get_default_run_args()) diff --git a/crates/turborepo-lib/src/opts.rs b/crates/turborepo-lib/src/opts.rs index cb109a49f9ac9..1e31ead1b7279 100644 --- a/crates/turborepo-lib/src/opts.rs +++ b/crates/turborepo-lib/src/opts.rs @@ -2,14 +2,16 @@ use std::{backtrace, backtrace::Backtrace}; use thiserror::Error; use turbopath::AnchoredSystemPathBuf; -use turborepo_cache::CacheOpts; +use turborepo_api_client::APIAuth; +use turborepo_cache::{CacheOpts, RemoteCacheOpts}; use crate::{ cli::{ Command, DryRunMode, EnvMode, ExecutionArgs, LogOrder, LogPrefix, OutputLogsMode, RunArgs, }, + commands::CommandBase, + config::ConfigurationOptions, run::task_id::TaskId, - Args, }; #[derive(Debug, Error)] @@ -30,6 +32,8 @@ pub enum Error { ConcurrencyOutOfBounds(#[backtrace] backtrace::Backtrace, String), #[error(transparent)] Path(#[from] turbopath::PathError), + #[error(transparent)] + Config(#[from] crate::config::Error), } #[derive(Debug)] @@ -76,10 +80,12 @@ impl Opts { } } -impl<'a> TryFrom<&'a Args> for Opts { - type Error = self::Error; +impl Opts { + pub fn new(base: &CommandBase) -> Result { + let args = base.args(); + let config = base.config()?; + let api_auth = base.api_auth()?; - fn try_from(args: &'a Args) -> Result { let Some(Command::Run { run_args, execution_args, @@ -87,9 +93,12 @@ impl<'a> TryFrom<&'a Args> for Opts { else { return Err(Error::ExpectedRun(Backtrace::capture())); }; - let run_and_execution_args = RunAndExecutionArgs { + + let run_and_execution_args = OptsInputs { run_args: run_args.as_ref(), execution_args: execution_args.as_ref(), + config, + api_auth: &api_auth, }; let run_opts = RunOpts::try_from(run_and_execution_args)?; let cache_opts = CacheOpts::from(run_and_execution_args); @@ -105,11 +114,12 @@ impl<'a> TryFrom<&'a Args> for Opts { } } -// This is not ideal, but it allows us to impl From #[derive(Debug, Clone, Copy)] -struct RunAndExecutionArgs<'a> { +struct OptsInputs<'a> { run_args: &'a RunArgs, execution_args: &'a ExecutionArgs, + config: &'a ConfigurationOptions, + api_auth: &'a Option, } #[derive(Debug, Default)] @@ -119,12 +129,12 @@ pub struct RunCacheOpts { pub(crate) task_output_logs_override: Option, } -impl<'a> From> for RunCacheOpts { - fn from(args: RunAndExecutionArgs<'a>) -> Self { +impl<'a> From> for RunCacheOpts { + fn from(inputs: OptsInputs<'a>) -> Self { RunCacheOpts { - skip_reads: args.execution_args.force.flatten().is_some_and(|f| f), - skip_writes: args.run_args.no_cache, - task_output_logs_override: args.execution_args.output_logs, + skip_reads: inputs.execution_args.force.flatten().is_some_and(|f| f), + skip_writes: inputs.run_args.no_cache, + task_output_logs_override: inputs.execution_args.output_logs, } } } @@ -187,11 +197,11 @@ pub enum ResolvedLogPrefix { const DEFAULT_CONCURRENCY: u32 = 10; -impl<'a> TryFrom> for RunOpts { +impl<'a> TryFrom> for RunOpts { type Error = self::Error; - fn try_from(args: RunAndExecutionArgs) -> Result { - let concurrency = args + fn try_from(inputs: OptsInputs) -> Result { + let concurrency = inputs .execution_args .concurrency .as_deref() @@ -199,16 +209,16 @@ impl<'a> TryFrom> for RunOpts { .transpose()? .unwrap_or(DEFAULT_CONCURRENCY); - let graph = args.run_args.graph.as_deref().map(|file| match file { + let graph = inputs.run_args.graph.as_deref().map(|file| match file { "" => GraphOpts::Stdout, f => GraphOpts::File(f.to_string()), }); - let (is_github_actions, log_order, log_prefix) = match args.execution_args.log_order { + let (is_github_actions, log_order, log_prefix) = match inputs.execution_args.log_order { LogOrder::Auto if turborepo_ci::Vendor::get_constant() == Some("GITHUB_ACTIONS") => ( true, ResolvedLogOrder::Grouped, - match args.execution_args.log_prefix { + match inputs.execution_args.log_prefix { LogPrefix::Task => ResolvedLogPrefix::Task, _ => ResolvedLogPrefix::None, }, @@ -218,33 +228,37 @@ impl<'a> TryFrom> for RunOpts { LogOrder::Auto | LogOrder::Stream => ( false, ResolvedLogOrder::Stream, - args.execution_args.log_prefix.into(), + inputs.execution_args.log_prefix.into(), ), LogOrder::Grouped => ( false, ResolvedLogOrder::Grouped, - args.execution_args.log_prefix.into(), + inputs.execution_args.log_prefix.into(), ), }; Ok(Self { - tasks: args.execution_args.tasks.clone(), + tasks: inputs.execution_args.tasks.clone(), log_prefix, log_order, - summarize: args.run_args.summarize, - experimental_space_id: args.run_args.experimental_space_id.clone(), - framework_inference: args.execution_args.framework_inference, - env_mode: args.execution_args.env_mode, + summarize: inputs.run_args.summarize, + experimental_space_id: inputs + .run_args + .experimental_space_id + .clone() + .or(inputs.config.spaces_id().map(|s| s.to_owned())), + framework_inference: inputs.execution_args.framework_inference, concurrency, - parallel: args.run_args.parallel, - profile: args.run_args.profile.clone(), - continue_on_error: args.execution_args.continue_execution, - pass_through_args: args.execution_args.pass_through_args.clone(), - only: args.execution_args.only, - daemon: args.run_args.daemon(), - single_package: args.execution_args.single_package, + parallel: inputs.run_args.parallel, + profile: inputs.run_args.profile.clone(), + continue_on_error: inputs.execution_args.continue_execution, + pass_through_args: inputs.execution_args.pass_through_args.clone(), + only: inputs.execution_args.only, + daemon: inputs.run_args.daemon(), + single_package: inputs.execution_args.single_package, graph, - dry_run: args.run_args.dry_run, + dry_run: inputs.run_args.dry_run, + env_mode: inputs.execution_args.env_mode.unwrap_or_default(), is_github_actions, }) } @@ -288,11 +302,11 @@ pub struct ScopeOpts { pub filter_patterns: Vec, } -impl<'a> TryFrom> for ScopeOpts { +impl<'a> TryFrom> for ScopeOpts { type Error = self::Error; - fn try_from(args: RunAndExecutionArgs<'a>) -> Result { - let pkg_inference_root = args + fn try_from(inputs: OptsInputs<'a>) -> Result { + let pkg_inference_root = inputs .execution_args .pkg_inference_root .as_ref() @@ -300,21 +314,44 @@ impl<'a> TryFrom> for ScopeOpts { .transpose()?; Ok(Self { - global_deps: args.execution_args.global_deps.clone(), + global_deps: inputs.execution_args.global_deps.clone(), pkg_inference_root, - filter_patterns: args.execution_args.filter.clone(), + filter_patterns: inputs.execution_args.filter.clone(), }) } } -impl<'a> From> for CacheOpts { - fn from(args: RunAndExecutionArgs<'a>) -> Self { +impl<'a> From> for CacheOpts { + fn from(inputs: OptsInputs<'a>) -> Self { + let is_linked = turborepo_api_client::is_linked(inputs.api_auth); + let skip_remote = if !is_linked { + true + } else if let Some(enabled) = inputs.config.enabled { + // We're linked, but if the user has explicitly enabled or disabled, use that + // value + !enabled + } else { + false + }; + + // Note that we don't currently use the team_id value here. In the future, we + // should probably verify that we only use the signature value when the + // configured team_id matches the final resolved team_id. + let unused_remote_cache_opts_team_id = + inputs.config.team_id().map(|team_id| team_id.to_string()); + let signature = inputs.config.signature(); + let remote_cache_opts = Some(RemoteCacheOpts::new( + unused_remote_cache_opts_team_id, + signature, + )); + CacheOpts { - override_dir: args.execution_args.cache_dir.clone(), - skip_filesystem: args.execution_args.remote_only, - remote_cache_read_only: args.run_args.remote_cache_read_only, - workers: args.run_args.cache_workers, - ..CacheOpts::default() + override_dir: inputs.execution_args.cache_dir.clone(), + skip_filesystem: inputs.execution_args.remote_only, + remote_cache_read_only: inputs.run_args.remote_cache_read_only, + workers: inputs.run_args.cache_workers, + skip_remote, + remote_cache_opts, } } } diff --git a/crates/turborepo-lib/src/run/builder.rs b/crates/turborepo-lib/src/run/builder.rs index 3bc96d3a5543c..f8aa2d62424ce 100644 --- a/crates/turborepo-lib/src/run/builder.rs +++ b/crates/turborepo-lib/src/run/builder.rs @@ -10,7 +10,7 @@ use tracing::debug; use turbopath::{AbsoluteSystemPathBuf, AnchoredSystemPath}; use turborepo_analytics::{start_analytics, AnalyticsHandle, AnalyticsSender}; use turborepo_api_client::{APIAuth, APIClient}; -use turborepo_cache::{AsyncCache, RemoteCacheOpts}; +use turborepo_cache::AsyncCache; use turborepo_env::EnvironmentVariableMap; use turborepo_errors::Spanned; use turborepo_repository::{ @@ -69,33 +69,13 @@ pub struct RunBuilder { impl RunBuilder { pub fn new(base: CommandBase) -> Result { - let api_auth = base.api_auth()?; let api_client = base.api_client()?; - let mut opts: Opts = base.args().try_into()?; + let opts = Opts::new(&base)?; + let api_auth = base.api_auth()?; let config = base.config()?; let allow_missing_package_manager = config.allow_no_package_manager(); - let is_linked = turborepo_api_client::is_linked(&api_auth); - if !is_linked { - opts.cache_opts.skip_remote = true; - } else if let Some(enabled) = config.enabled { - // We're linked, but if the user has explicitly enabled or disabled, use that - // value - opts.cache_opts.skip_remote = !enabled; - } - // Note that we don't currently use the team_id value here. In the future, we - // should probably verify that we only use the signature value when the - // configured team_id matches the final resolved team_id. - let unused_remote_cache_opts_team_id = config.team_id().map(|team_id| team_id.to_string()); - let signature = config.signature(); - opts.cache_opts.remote_cache_opts = Some(RemoteCacheOpts::new( - unused_remote_cache_opts_team_id, - signature, - )); - if opts.run_opts.experimental_space_id.is_none() { - opts.run_opts.experimental_space_id = config.spaces_id().map(|s| s.to_owned()); - } let version = base.version(); let experimental_ui = config.ui(); let processes = ProcessManager::new( @@ -111,11 +91,11 @@ impl RunBuilder { processes, opts, api_client, - api_auth, repo_root, ui, version, experimental_ui, + api_auth, analytics_sender: None, entrypoint_packages: None, should_print_prelude_override: None, diff --git a/turborepo-tests/integration/tests/no-args.t b/turborepo-tests/integration/tests/no-args.t index 8c74321153b0c..dc079a8b5b31e 100644 --- a/turborepo-tests/integration/tests/no-args.t +++ b/turborepo-tests/integration/tests/no-args.t @@ -96,7 +96,7 @@ Make sure exit code is 2 when no args are passed --global-deps Specify glob of global filesystem dependencies to be hashed. Useful for .env and files --env-mode [] - Environment variable mode. Use "loose" to pass the entire existing environment. Use "strict" to use an allowlist specified in turbo.json [default: strict] [possible values: loose, strict] + Environment variable mode. Use "loose" to pass the entire existing environment. Use "strict" to use an allowlist specified in turbo.json [possible values: loose, strict] -F, --filter Use the given selector to specify package(s) to act as entry points. The syntax mirrors pnpm's syntax, and additional documentation and examples can be found in turbo's documentation https://turbo.build/repo/docs/reference/command-line-reference/run#--filter --output-logs diff --git a/turborepo-tests/integration/tests/turbo-help.t b/turborepo-tests/integration/tests/turbo-help.t index 1ec3f0c34c423..bb2bad7144ec1 100644 --- a/turborepo-tests/integration/tests/turbo-help.t +++ b/turborepo-tests/integration/tests/turbo-help.t @@ -96,7 +96,7 @@ Test help flag --global-deps Specify glob of global filesystem dependencies to be hashed. Useful for .env and files --env-mode [] - Environment variable mode. Use "loose" to pass the entire existing environment. Use "strict" to use an allowlist specified in turbo.json [default: strict] [possible values: loose, strict] + Environment variable mode. Use "loose" to pass the entire existing environment. Use "strict" to use an allowlist specified in turbo.json [possible values: loose, strict] -F, --filter Use the given selector to specify package(s) to act as entry points. The syntax mirrors pnpm's syntax, and additional documentation and examples can be found in turbo's documentation https://turbo.build/repo/docs/reference/command-line-reference/run#--filter --output-logs @@ -268,7 +268,6 @@ Test help flag --env-mode [] Environment variable mode. Use "loose" to pass the entire existing environment. Use "strict" to use an allowlist specified in turbo.json - [default: strict] [possible values: loose, strict] -F, --filter From de38c2c528c2d7f8a3cf3ebfe568630908c90cca Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Tue, 16 Jul 2024 12:07:24 -0700 Subject: [PATCH 10/73] Remove unused instant return value from `CaptureFuture` (#8758) ### Description Appears to be unused. ### Testing Instructions ``` cargo check cargo check --tests ``` --- crates/turbo-tasks/src/capture_future.rs | 4 ++-- crates/turbo-tasks/src/manager.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/turbo-tasks/src/capture_future.rs b/crates/turbo-tasks/src/capture_future.rs index 30b87aefdbb01..8a7b5d621b2e4 100644 --- a/crates/turbo-tasks/src/capture_future.rs +++ b/crates/turbo-tasks/src/capture_future.rs @@ -51,7 +51,7 @@ pub fn add_allocation_info(alloc_info: AllocationInfo) { } impl> Future for CaptureFuture { - type Output = (T, Duration, Instant, usize); + type Output = (T, Duration, usize); fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.project(); @@ -68,7 +68,7 @@ impl> Future for CaptureFuture { let (duration, allocations, deallocations) = *this.cell.lock().unwrap(); let memory_usage = (*this.allocations + allocations) .saturating_sub(*this.deallocations + deallocations); - Poll::Ready((r, *this.duration + duration, start + elapsed, memory_usage)) + Poll::Ready((r, *this.duration + duration, memory_usage)) } Poll::Pending => Poll::Pending, } diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 87fded4ccd50c..c179b871b5554 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -445,7 +445,7 @@ impl TurboTasks { }; async { - let (result, duration, _instant, memory_usage) = + let (result, duration, memory_usage) = CaptureFuture::new(AssertUnwindSafe(future).catch_unwind()) .await; From a946801dcde4d4b05c4753bf61927067b19a0aa6 Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Tue, 16 Jul 2024 12:15:38 -0700 Subject: [PATCH 11/73] Delete dead raw_vc_set module (#8760) ### Description Looks like this is unused. Was added in https://github.com/vercel/turbo/pull/5584 ### Testing Instructions ``` cargo check cargo check --tests ``` --- crates/turbo-tasks/src/lib.rs | 1 - crates/turbo-tasks/src/raw_vc_set.rs | 24 ------------------------ 2 files changed, 25 deletions(-) delete mode 100644 crates/turbo-tasks/src/raw_vc_set.rs diff --git a/crates/turbo-tasks/src/lib.rs b/crates/turbo-tasks/src/lib.rs index 84c107c055aff..6c67aae0aab27 100644 --- a/crates/turbo-tasks/src/lib.rs +++ b/crates/turbo-tasks/src/lib.rs @@ -59,7 +59,6 @@ mod once_map; pub mod persisted_graph; pub mod primitives; mod raw_vc; -mod raw_vc_set; mod rcstr; mod read_ref; pub mod registry; diff --git a/crates/turbo-tasks/src/raw_vc_set.rs b/crates/turbo-tasks/src/raw_vc_set.rs deleted file mode 100644 index 8f1942b3f6a07..0000000000000 --- a/crates/turbo-tasks/src/raw_vc_set.rs +++ /dev/null @@ -1,24 +0,0 @@ -use std::marker::PhantomData; - -use auto_hash_map::AutoSet; -// This specific macro identifier is detected by turbo-tasks-build. -use turbo_tasks_macros::primitive as __turbo_tasks_internal_primitive; - -use crate as turbo_tasks; -use crate::{RawVc, TaskId, Vc}; - -__turbo_tasks_internal_primitive!(AutoSet); - -impl Vc> { - /// Casts a `TaskId` to a `Vc>`. - /// - /// # Safety - /// - /// The `TaskId` must be point to a valid `AutoSet`. - pub unsafe fn from_task_id(task_id: TaskId) -> Self { - Vc { - node: RawVc::TaskOutput(task_id), - _t: PhantomData, - } - } -} From 3e33af5cbc031ea59ce4bd981e4be77f6982efc4 Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Tue, 16 Jul 2024 12:23:34 -0700 Subject: [PATCH 12/73] Delete dead keyed_cell module (#8761) ### Description Looks like this was added with a callsite in https://github.com/vercel/turbo/pull/6160 , and the callsite was removed in https://github.com/vercel/turbo/pull/6172 . ### Testing Instructions ``` cargo check ``` --- crates/turbo-tasks/src/keyed_cell.rs | 77 --------------------- crates/turbo-tasks/src/lib.rs | 2 - crates/turbopack-core/src/chunk/chunking.rs | 3 +- 3 files changed, 1 insertion(+), 81 deletions(-) delete mode 100644 crates/turbo-tasks/src/keyed_cell.rs diff --git a/crates/turbo-tasks/src/keyed_cell.rs b/crates/turbo-tasks/src/keyed_cell.rs deleted file mode 100644 index ffacf6220fbb7..0000000000000 --- a/crates/turbo-tasks/src/keyed_cell.rs +++ /dev/null @@ -1,77 +0,0 @@ -use anyhow::Result; - -use crate::{ - self as turbo_tasks, macro_helpers::find_cell_by_type, manager::current_task, - ConcreteTaskInput, CurrentCellRef, RawVc, TaskId, TaskInput, ValueTypeId, Vc, VcValueType, -}; - -#[turbo_tasks::value] -struct KeyedCell { - cell: RawVc, - #[turbo_tasks(trace_ignore, debug_ignore)] - cell_ref: CurrentCellRef, -} - -#[turbo_tasks::value_impl] -impl KeyedCell { - #[turbo_tasks::function] - fn new_local(_task: TaskId, _key: ConcreteTaskInput, value_type_id: ValueTypeId) -> Vc { - let cell_ref = find_cell_by_type(value_type_id); - KeyedCell { - cell: cell_ref.into(), - cell_ref, - } - .cell() - } - - #[turbo_tasks::function] - fn new_global(_key: ConcreteTaskInput, value_type_id: ValueTypeId) -> Vc { - let cell_ref = find_cell_by_type(value_type_id); - KeyedCell { - cell: cell_ref.into(), - cell_ref, - } - .cell() - } -} - -/// Cells a value in a cell with a given key. A key MUST only be used once per -/// function. -/// -/// Usually calling [Vc::cell] will create cells for a give type based on the -/// call order of [Vc::cell]. But this can yield to over-invalidation when the -/// number of cells changes. e. g. not doing the first [Vc::cell] call will move -/// all remaining values into different cells, causing invalidation of all of -/// them. -/// -/// A keyed cell avoids this problem by not using call order, but a key instead. -/// -/// Internally it creates a new Task based on the key and cells the value into -/// that task. This is a implementation detail and might change in the future. -pub async fn keyed_cell( - key: K, - content: T, -) -> Result> { - let cell = KeyedCell::new_local( - current_task("keyed_cell"), - key.into_concrete(), - T::get_value_type_id(), - ) - .await?; - cell.cell_ref.compare_and_update_shared(content); - Ok(cell.cell.into()) -} - -/// Cells a value in a cell with a given key. A key MUST only be used once for -/// the whole application. -/// -/// This allows to create singleton Vcs for values while avoiding to pass the -/// whole value as argument and creating a large task key. -pub async fn global_keyed_cell( - key: K, - content: T, -) -> Result> { - let cell = KeyedCell::new_global(key.into_concrete(), T::get_value_type_id()).await?; - cell.cell_ref.compare_and_update_shared(content); - Ok(cell.cell.into()) -} diff --git a/crates/turbo-tasks/src/lib.rs b/crates/turbo-tasks/src/lib.rs index 6c67aae0aab27..20406afd422e5 100644 --- a/crates/turbo-tasks/src/lib.rs +++ b/crates/turbo-tasks/src/lib.rs @@ -48,7 +48,6 @@ mod id; mod id_factory; mod invalidation; mod join_iter_ext; -mod keyed_cell; #[doc(hidden)] pub mod macro_helpers; mod magic_any; @@ -85,7 +84,6 @@ pub use invalidation::{ DynamicEqHash, InvalidationReason, InvalidationReasonKind, InvalidationReasonSet, }; pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt}; -pub use keyed_cell::{global_keyed_cell, keyed_cell}; pub use manager::{ dynamic_call, emit, get_invalidator, mark_finished, mark_stateful, prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call, turbo_tasks, CurrentCellRef, diff --git a/crates/turbopack-core/src/chunk/chunking.rs b/crates/turbopack-core/src/chunk/chunking.rs index bfdb09e339406..c359c0c038bab 100644 --- a/crates/turbopack-core/src/chunk/chunking.rs +++ b/crates/turbopack-core/src/chunk/chunking.rs @@ -141,8 +141,7 @@ async fn handle_split_group( }) } -/// Creates a chunk with the given `chunk_items. `key` should be unique and is -/// used with [keyed_cell] to place the chunk items into a cell. +/// Creates a chunk with the given `chunk_items. `key` should be unique. #[tracing::instrument(level = Level::TRACE, skip_all, fields(key = display(key)))] async fn make_chunk( chunk_items: Vec, From 5ad5132e1e6c4b01dc2241fb58181c0c9548cc6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 14:50:16 -0600 Subject: [PATCH 13/73] release(turborepo): 2.0.7 (#8768) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index b7d875f147ec3..19176815f7a7f 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index 501b758037546..b74f5125c4f5b 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index 9e30b18ca7f9e..0f627151917f9 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index 38e0df4506531..6bd470ca7a392 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index 6cf17bdac95b0..cf20ed49b2d82 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index 7986f682e38ea..3fd545c1522f6 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index 5d1047a8f8335..b35ef23c56a29 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index 9cb417a781bca..cecfbb992b703 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index 59e980bd01ad6..3700274689d6f 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.7-canary.1", + "version": "2.0.7", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.7-canary.1", - "turbo-darwin-arm64": "2.0.7-canary.1", - "turbo-linux-64": "2.0.7-canary.1", - "turbo-linux-arm64": "2.0.7-canary.1", - "turbo-windows-64": "2.0.7-canary.1", - "turbo-windows-arm64": "2.0.7-canary.1" + "turbo-darwin-64": "2.0.7", + "turbo-darwin-arm64": "2.0.7", + "turbo-linux-64": "2.0.7", + "turbo-linux-arm64": "2.0.7", + "turbo-windows-64": "2.0.7", + "turbo-windows-arm64": "2.0.7" } } diff --git a/version.txt b/version.txt index 404381bb617d0..7a9d87b1a7cb0 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.7-canary.1 -canary +2.0.7 +latest From b311251cc8fe3b4b60d015b408c7a14ff8fb9e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 17 Jul 2024 15:16:14 +0900 Subject: [PATCH 14/73] feat: Enable tree shaking in next.js (#8755) --- .gitattributes | 1 + .../turbopack-ecmascript/benches/analyzer.rs | 2 +- .../src/analyzer/graph.rs | 3 +- .../src/analyzer/imports.rs | 20 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 3 +- crates/turbopack-ecmascript/src/lib.rs | 8 + crates/turbopack-ecmascript/src/minify.rs | 7 +- crates/turbopack-ecmascript/src/parse.rs | 1 - .../src/references/esm/base.rs | 3 + .../src/references/mod.rs | 9 +- .../src/tree_shake/asset.rs | 2 +- .../src/tree_shake/cjs_finder.rs | 11 - .../src/tree_shake/graph.rs | 194 ++- .../src/tree_shake/mod.rs | 130 +- .../src/tree_shake/util.rs | 304 +++- .../tests/tree-shaker/analyzer/1/output.md | 58 + .../tests/tree-shaker/analyzer/2/output.md | 58 + .../tests/tree-shaker/analyzer/3/output.md | 38 + .../analyzer/amphtml-document/input.js | 34 + .../analyzer/amphtml-document/output.md | 596 +++++++ .../tree-shaker/analyzer/app-route/output.md | 61 +- .../analyzer/combined-export/output.md | 22 + .../tree-shaker/analyzer/complex/output.md | 55 +- .../analyzer/export-named/output.md | 20 +- .../tree-shaker/analyzer/failed-1/output.md | 28 + .../tree-shaker/analyzer/failed-2/output.md | 104 +- .../tree-shaker/analyzer/failed-3/output.md | 204 ++- .../tree-shaker/analyzer/grouping/output.md | 22 + .../analyzer/ipc-evaluate/output.md | 100 +- .../tree-shaker/analyzer/ipc-index/output.md | 204 ++- .../tree-shaker/analyzer/let-bug-1/input.js | 44 + .../tree-shaker/analyzer/let-bug-1/output.md | 465 +++++ .../tree-shaker/analyzer/logger/input.js | 44 + .../tree-shaker/analyzer/logger/output.md | 465 +++++ .../analyzer/multi-export/output.md | 26 +- .../tree-shaker/analyzer/nanoid/input.js | 44 + .../tree-shaker/analyzer/nanoid/output.md | 960 +++++++++++ .../analyzer/next-response/input.js | 122 ++ .../analyzer/next-response/output.md | 1161 +++++++++++++ .../analyzer/nextjs-tracer/input.js | 214 +++ .../analyzer/nextjs-tracer/output.md | 1516 +++++++++++++++++ .../tree-shaker/analyzer/node-fetch/input.js | 9 + .../tree-shaker/analyzer/node-fetch/output.md | 278 +++ .../analyzer/node-globals/output.md | 10 + .../tree-shaker/analyzer/otel-core/input.js | 27 + .../tree-shaker/analyzer/otel-core/output.md | 355 ++++ .../analyzer/route-handler/input.js | 9 + .../analyzer/route-handler/output.md | 252 +++ .../tree-shaker/analyzer/route-kind/output.md | 16 + .../tree-shaker/analyzer/shared-2/output.md | 100 +- .../shared-and-side-effects/output.md | 150 +- .../analyzer/shared-regression/output.md | 100 +- .../analyzer/simple-vars-1/output.md | 22 + .../tree-shaker/analyzer/simple/output.md | 22 + .../analyzer/template-pages/output.md | 571 +++++-- .../analyzer/test-config-1/output.md | 66 + .../tree-shaker/analyzer/tla-1/output.md | 34 +- .../tree-shaker/analyzer/typeof-1/input.js | 10 + .../tree-shaker/analyzer/typeof-1/output.md | 298 ++++ .../analyzer/write-order/output.md | 37 + ...e-shake_dynamic-import_input_lib_05eac0.js | 4 +- ...ake_dynamic-import_input_lib_05eac0.js.map | 16 +- ...-shake_export-namespace_input_e0a7d8._.js} | 30 +- ...ke_export-namespace_input_e0a7d8._.js.map} | 26 +- ...-shake_import-namespace_input_87afd8._.js} | 30 +- ...ke_import-namespace_input_87afd8._.js.map} | 22 +- ...hake_require-side-effect_input_fa7732._.js | 4 +- ..._require-side-effect_input_fa7732._.js.map | 20 +- ...ke_tree-shake-test-1_input_index_2951af.js | 4 +- ...ree-shake-test-1_input_index_2951af.js.map | 16 +- crates/turbopack-wasm/src/module_asset.rs | 36 +- crates/turbopack/src/module_options/mod.rs | 2 + .../module_options/module_options_context.rs | 1 + 73 files changed, 9349 insertions(+), 591 deletions(-) delete mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js} (91%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map} (89%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js} (90%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map} (89%) diff --git a/.gitattributes b/.gitattributes index 650dc002a59d5..860411fb2b3c6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ .config/ast-grep/rule-tests/__snapshots__/** linguist-generated=true crates/turbo-tasks-macros-tests/tests/**/*.stderr linguist-generated=true +crates/turbopack-ecmascript/tests/tree-shaker/analyzer/**/output.md linguist-generated=true crates/turbopack-tests/tests/snapshot/**/output/** linguist-generated=true crates/turborepo-lockfiles/fixtures/*.lock text eol=lf diff --git a/crates/turbopack-ecmascript/benches/analyzer.rs b/crates/turbopack-ecmascript/benches/analyzer.rs index 4b70575de1e98..0a94684f5ed9b 100644 --- a/crates/turbopack-ecmascript/benches/analyzer.rs +++ b/crates/turbopack-ecmascript/benches/analyzer.rs @@ -56,7 +56,7 @@ pub fn benchmark(c: &mut Criterion) { program.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); let eval_context = - EvalContext::new(&program, unresolved_mark, top_level_mark, false, None); + EvalContext::new(&program, unresolved_mark, top_level_mark, None); let var_graph = create_graph(&program, &eval_context); let input = BenchInput { diff --git a/crates/turbopack-ecmascript/src/analyzer/graph.rs b/crates/turbopack-ecmascript/src/analyzer/graph.rs index 05dd2f59e6646..8105ae870289f 100644 --- a/crates/turbopack-ecmascript/src/analyzer/graph.rs +++ b/crates/turbopack-ecmascript/src/analyzer/graph.rs @@ -270,13 +270,12 @@ impl EvalContext { module: &Program, unresolved_mark: Mark, top_level_mark: Mark, - skip_namespace: bool, source: Option>>, ) -> Self { Self { unresolved_mark, top_level_mark, - imports: ImportMap::analyze(module, skip_namespace, source), + imports: ImportMap::analyze(module, source), } } diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index 7221c0a710091..ba874d0c3ca44 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -139,8 +139,6 @@ pub(crate) struct ImportMap { pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), - /// User requested the whole module - Namespace, Exports, Part(u32), } @@ -202,16 +200,11 @@ impl ImportMap { } /// Analyze ES import - pub(super) fn analyze( - m: &Program, - skip_namespace: bool, - source: Option>>, - ) -> Self { + pub(super) fn analyze(m: &Program, source: Option>>) -> Self { let mut data = ImportMap::default(); m.visit_with(&mut Analyzer { data: &mut data, - skip_namespace, source, }); @@ -221,7 +214,6 @@ impl ImportMap { struct Analyzer<'a> { data: &'a mut ImportMap, - skip_namespace: bool, source: Option>>, } @@ -233,10 +225,6 @@ impl<'a> Analyzer<'a> { imported_symbol: ImportedSymbol, annotations: ImportAnnotations, ) -> Option { - if self.skip_namespace && matches!(imported_symbol, ImportedSymbol::Namespace) { - return None; - } - let issue_source = self .source .map(|s| IssueSource::from_swc_offsets(s, span.lo.to_usize(), span.hi.to_usize())); @@ -339,7 +327,7 @@ impl Visit for Analyzer<'_> { let i = self.ensure_reference( export.span, export.src.value.clone(), - symbol.unwrap_or(ImportedSymbol::Namespace), + symbol.unwrap_or(ImportedSymbol::Exports), annotations, ); if let Some(i) = i { @@ -455,7 +443,7 @@ fn get_import_symbol_from_import(specifier: &ImportSpecifier) -> ImportedSymbol _ => local.sym.clone(), }), ImportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ImportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ImportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } @@ -465,6 +453,6 @@ fn get_import_symbol_from_export(specifier: &ExportSpecifier) -> ImportedSymbol ImportedSymbol::Symbol(orig_name(orig)) } ExportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ExportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ExportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } diff --git a/crates/turbopack-ecmascript/src/analyzer/mod.rs b/crates/turbopack-ecmascript/src/analyzer/mod.rs index 54f229549a26b..d397d1873a2c3 100644 --- a/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -3588,8 +3588,7 @@ mod tests { let top_level_mark = Mark::new(); m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); - let eval_context = - EvalContext::new(&m, unresolved_mark, top_level_mark, false, None); + let eval_context = EvalContext::new(&m, unresolved_mark, top_level_mark, None); let mut var_graph = create_graph(&m, &eval_context); diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index 114a6d2a218ec..51fc0bc516f36 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -120,6 +120,9 @@ pub enum TreeShakingMode { ReexportsOnly, } +#[turbo_tasks::value(transparent)] +pub struct OptionTreeShaking(pub Option); + #[turbo_tasks::value(shared, serialization = "auto_for_input")] #[derive(PartialOrd, Ord, Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { @@ -139,6 +142,11 @@ pub struct EcmascriptOptions { /// If false, they will reference the whole directory. If true, they won't /// reference anything and lead to an runtime error instead. pub ignore_dynamic_requests: bool, + + /// The list of export names that should make tree shaking bail off. This is + /// required because tree shaking can split imports like `export const + /// runtime = 'edge'` as a separate module. + pub special_exports: Vc>, } #[turbo_tasks::value(serialization = "auto_for_input")] diff --git a/crates/turbopack-ecmascript/src/minify.rs b/crates/turbopack-ecmascript/src/minify.rs index f02a3517a30b0..f94859d23d8c3 100644 --- a/crates/turbopack-ecmascript/src/minify.rs +++ b/crates/turbopack-ecmascript/src/minify.rs @@ -54,9 +54,12 @@ pub async fn minify(path: Vc, code: Vc) -> Result GLOBALS.set(&Default::default(), || { let program = match parser.parse_program() { Ok(program) => program, - Err(_error) => { + Err(err) => { // TODO should emit an issue - bail!("failed to parse source code") + bail!( + "failed to parse source code\n{err:?}\n{}", + code.source_code().to_str()? + ) } }; let comments = SingleThreadedComments::default(); diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index 7fae1353e5cbd..f9a61d0d19643 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -432,7 +432,6 @@ async fn parse_content( &parsed_program, unresolved_mark, top_level_mark, - false, Some(source), ); diff --git a/crates/turbopack-ecmascript/src/references/esm/base.rs b/crates/turbopack-ecmascript/src/references/esm/base.rs index 5286850437a42..8852d61a52442 100644 --- a/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -96,6 +96,7 @@ pub struct EsmAssetReference { pub issue_source: Option>, pub export_name: Option>, pub import_externals: bool, + pub special_exports: Vc>, } /// A list of [EsmAssetReference]s @@ -121,6 +122,7 @@ impl EsmAssetReference { issue_source: Option>, annotations: Value, export_name: Option>, + special_exports: Vc>, import_externals: bool, ) -> Vc { Self::cell(EsmAssetReference { @@ -130,6 +132,7 @@ impl EsmAssetReference { annotations: annotations.into_value(), export_name, import_externals, + special_exports, }) } diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index e284992e9ad58..379b4e5262368 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -353,6 +353,7 @@ struct AnalysisState<'a> { // the object allocation. first_import_meta: bool, tree_shaking_mode: Option, + special_exports: Vc>, import_externals: bool, ignore_dynamic_requests: bool, } @@ -412,6 +413,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let options = raw_module.options; let compile_time_info = raw_module.compile_time_info; let options = options.await?; + let special_exports = options.special_exports; let import_externals = options.import_externals; let origin = Vc::upcast::>(module); @@ -428,7 +430,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let parsed = if let Some(part) = part { let parsed = parse(source, ty, transforms); - let split_data = split(source.ident(), source, parsed); + let split_data = split(source.ident(), source, parsed, special_exports); part_of_module(split_data, part) } else { parse(source, ty, transforms) @@ -576,7 +578,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => Some(ModulePart::exports()), - ImportedSymbol::Namespace => None, }, Some(TreeShakingMode::ReexportsOnly) => match &r.imported_symbol { ImportedSymbol::ModuleEvaluation => { @@ -586,10 +587,10 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => None, - ImportedSymbol::Namespace => None, }, None => None, }, + special_exports, import_externals, ); @@ -814,6 +815,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( first_import_meta: true, tree_shaking_mode: options.tree_shaking_mode, import_externals: options.import_externals, + special_exports: options.special_exports, ignore_dynamic_requests: options.ignore_dynamic_requests, }; @@ -1972,6 +1974,7 @@ async fn handle_free_var_reference( .map(|export| ModulePart::export(export.clone())), None => None, }, + state.special_exports, state.import_externals, ) .resolve() diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index c7b4b7c2d7168..f27d4320f048d 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -23,7 +23,7 @@ use crate::{ /// This type is used for an advanced tree shkaing. #[turbo_tasks::value] pub struct EcmascriptModulePartAsset { - pub(crate) full_module: Vc, + pub full_module: Vc, pub(crate) part: Vc, pub(crate) import_externals: bool, } diff --git a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs deleted file mode 100644 index 9cf44e8983818..0000000000000 --- a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs +++ /dev/null @@ -1,11 +0,0 @@ -use swc_core::ecma::ast::*; - -pub fn contains_cjs(m: &Program) -> bool { - if let Program::Module(m) = m { - if m.body.iter().any(|s| s.is_module_decl()) { - return false; - } - } - - true -} diff --git a/crates/turbopack-ecmascript/src/tree_shake/graph.rs b/crates/turbopack-ecmascript/src/tree_shake/graph.rs index 9531033047db0..20ef975394ed6 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/graph.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/graph.rs @@ -13,11 +13,11 @@ use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ - op, ClassDecl, Decl, DefaultDecl, ExportDecl, ExportNamedSpecifier, ExportSpecifier, - Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, ImportSpecifier, - ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, Stmt, VarDecl, - VarDeclKind, VarDeclarator, + op, ClassDecl, Decl, DefaultDecl, ExportAll, ExportDecl, ExportNamedSpecifier, + ExportSpecifier, Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, + ImportSpecifier, ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, + Stmt, VarDecl, VarDeclKind, VarDeclarator, }, atoms::JsWord, utils::{find_pat_ids, private_ident, quote_ident}, @@ -26,7 +26,9 @@ use swc_core::{ use turbo_tasks::RcStr; use super::{ - util::{ids_captured_by, ids_used_by, ids_used_by_ignoring_nested}, + util::{ + collect_top_level_decls, ids_captured_by, ids_used_by, ids_used_by_ignoring_nested, Vars, + }, Key, TURBOPACK_PART_IMPORT_SOURCE, }; use crate::magic_identifier; @@ -191,6 +193,8 @@ pub(super) struct SplitModuleResult { /// Dependency between parts. pub part_deps: FxHashMap>, pub modules: Vec, + + pub star_reexports: Vec, } impl DepGraph { @@ -226,7 +230,13 @@ impl DepGraph { let mut exports = FxHashMap::default(); let mut part_deps = FxHashMap::<_, Vec<_>>::default(); + let star_reexports: Vec<_> = data + .values() + .filter_map(|v| v.content.as_module_decl()?.as_export_all()) + .cloned() + .collect(); let mut modules = vec![]; + let mut exports_module = Module::dummy(); if groups.graph_ix.is_empty() { // If there's no dependency, all nodes are in the module evaluaiotn group. @@ -273,6 +283,24 @@ impl DepGraph { if let Some(export) = &data[item].export { exports.insert(Key::Export(export.as_str().into()), ix as u32); + + let s = ExportSpecifier::Named(ExportNamedSpecifier { + span: DUMMY_SP, + orig: ModuleExportName::Ident(Ident::new(export.clone(), DUMMY_SP)), + exported: None, + is_type_only: false, + }); + exports_module.body.push(ModuleItem::ModuleDecl( + ModuleDecl::ExportNamed(NamedExport { + span: DUMMY_SP, + specifiers: vec![s], + src: Some(Box::new(TURBOPACK_PART_IMPORT_SOURCE.into())), + type_only: false, + with: Some(Box::new(create_turbopack_part_id_assert( + PartId::Export(export.to_string().into()), + ))), + }), + )); } } ItemId::Group(ItemIdGroupKind::ModuleEvaluation) => { @@ -295,7 +323,7 @@ impl DepGraph { let data = data.get(dep_item).unwrap(); for var in data.var_decls.iter() { - if required_vars.remove(var) { + if required_vars.contains(var) { specifiers.push(ImportSpecifier::Named(ImportNamedSpecifier { span: DUMMY_SP, local: var.clone().into(), @@ -366,10 +394,21 @@ impl DepGraph { modules.push(chunk); } + exports.insert(Key::Exports, modules.len() as u32); + + for star in &star_reexports { + exports_module + .body + .push(ModuleItem::ModuleDecl(ModuleDecl::ExportAll(star.clone()))); + } + + modules.push(exports_module); + SplitModuleResult { entrypoints: exports, part_deps, modules, + star_reexports, } } @@ -429,7 +468,7 @@ impl DepGraph { let ix = self.g.get_node(id); if let ItemId::Group(_) = id { - groups.push((vec![id.clone()], FxHashSet::default())); + groups.push((vec![id.clone()], FxHashSet::default(), 1)); global_done.insert(ix); } } @@ -447,7 +486,8 @@ impl DepGraph { global_done.extend(cycle.iter().copied()); - groups.push((ids, Default::default())); + let len = ids.len(); + groups.push((ids, FxHashSet::default(), len)); } } } @@ -482,7 +522,7 @@ impl DepGraph { .count(); if dependant_count >= 2 && count_of_startings >= 2 { - groups.push((vec![id.clone()], FxHashSet::default())); + groups.push((vec![id.clone()], FxHashSet::default(), 1)); global_done.insert(ix as u32); } } @@ -490,11 +530,15 @@ impl DepGraph { loop { let mut changed = false; - for (group, group_done) in &mut groups { - let start = &group[0]; - let start_ix = self.g.get_node(start); - changed |= - add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); + for (group, group_done, init_len) in &mut groups { + // Cycle group + + for i in 0..*init_len { + let start = &group[i]; + let start_ix = self.g.get_node(start); + changed |= + add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); + } } if !changed { @@ -557,6 +601,7 @@ impl DepGraph { unresolved_ctxt: SyntaxContext, top_level_ctxt: SyntaxContext, ) -> (Vec, FxHashMap) { + let top_level_vars = collect_top_level_decls(module); let mut exports = vec![]; let mut items = FxHashMap::default(); let mut ids = vec![]; @@ -697,21 +742,41 @@ impl DepGraph { }); { - let mut used_ids = ids_used_by_ignoring_nested( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - ); + let mut used_ids = if export.decl.is_fn_expr() { + ids_used_by_ignoring_nested( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + ids_used_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + }; + used_ids.read.remove(&default_var.to_id()); used_ids.write.insert(default_var.to_id()); - let captured_ids = - ids_captured_by(&export.decl, unresolved_ctxt, top_level_ctxt); + let mut captured_ids = if export.decl.is_fn_expr() { + ids_captured_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + Vars::default() + }; + captured_ids.read.remove(&default_var.to_id()); + let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, write_vars: used_ids.write, eventual_write_vars: captured_ids.write, var_decls: [default_var.to_id()].into_iter().collect(), - side_effects: true, content: ModuleItem::ModuleDecl(item.clone()), ..Default::default() }; @@ -741,9 +806,14 @@ impl DepGraph { &export.expr, unresolved_ctxt, top_level_ctxt, + &top_level_vars, + ); + let captured_ids = ids_captured_by( + &export.expr, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, ); - let captured_ids = - ids_captured_by(&export.expr, unresolved_ctxt, top_level_ctxt); used_ids.write.insert(default_var.to_id()); @@ -843,11 +913,7 @@ impl DepGraph { kind: ItemIdItemKind::ImportBinding(si as _), }; ids.push(id.clone()); - let local = match s { - ImportSpecifier::Named(s) => s.local.to_id(), - ImportSpecifier::Default(s) => s.local.to_id(), - ImportSpecifier::Namespace(s) => s.local.to_id(), - }; + let local = s.local().to_id(); items.insert( id, ItemData { @@ -875,7 +941,12 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&f.function, unresolved_ctxt, top_level_ctxt); + let vars = ids_used_by( + &f.function, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(f.ident.to_id()); @@ -905,19 +976,19 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt); + let mut vars = + ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt, &top_level_vars); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(c.ident.to_id()); v }; + vars.write.insert(c.ident.to_id()); items.insert( id, ItemData { - is_hoisted: true, - eventual_read_vars: vars.read, - eventual_write_vars: vars.write, - write_vars: var_decls.clone(), + read_vars: vars.read, + write_vars: vars.write, var_decls, content: ModuleItem::Stmt(Stmt::Decl(Decl::Class(c.clone()))), ..Default::default() @@ -937,13 +1008,24 @@ impl DepGraph { ids.push(id.clone()); let decl_ids: Vec = find_pat_ids(&decl.name); - let vars = ids_used_by_ignoring_nested( + let vars = ids_used_by( &decl.init, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); let eventual_vars = - ids_captured_by(&decl.init, unresolved_ctxt, top_level_ctxt); + if matches!(decl.init.as_deref(), Some(Expr::Fn(..) | Expr::Arrow(..))) + { + ids_captured_by( + &decl.init, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + Vars::default() + }; let side_effects = vars.found_unresolved; @@ -972,9 +1054,14 @@ impl DepGraph { expr: box Expr::Assign(assign), .. })) => { - let mut used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let mut used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); if assign.op != op!("=") { used_ids.read.extend(used_ids.write.iter().cloned()); @@ -983,6 +1070,7 @@ impl DepGraph { &assign.left, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); used_ids.read.extend(extra_ids.read); used_ids.write.extend(extra_ids.write); @@ -1011,15 +1099,21 @@ impl DepGraph { ModuleItem::ModuleDecl( ModuleDecl::ExportDefaultDecl(..) | ModuleDecl::ExportDefaultExpr(..) - | ModuleDecl::ExportNamed(NamedExport { .. }), + | ModuleDecl::ExportNamed(NamedExport { .. }) + | ModuleDecl::ExportAll(..), ) => {} _ => { // Default to normal - let used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, @@ -1058,10 +1152,10 @@ impl DepGraph { for (local, export_name) in exports { let name = match &export_name { - Some(ModuleExportName::Ident(v)) => v.to_id(), - _ => local.clone(), + Some(ModuleExportName::Ident(v)) => v.sym.clone(), + _ => local.0.clone(), }; - let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.0.clone())); + let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.clone())); ids.push(id.clone()); items.insert( id.clone(), @@ -1078,8 +1172,8 @@ impl DepGraph { type_only: false, with: None, })), - read_vars: [name.clone()].into_iter().collect(), - export: Some(name.0), + read_vars: [local.clone()].into_iter().collect(), + export: Some(name), ..Default::default() }, ); diff --git a/crates/turbopack-ecmascript/src/tree_shake/mod.rs b/crates/turbopack-ecmascript/src/tree_shake/mod.rs index c72b11ecfc1ab..d5b8a8a31b557 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/mod.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/mod.rs @@ -1,13 +1,16 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Write}; use anyhow::{bail, Result}; use indexmap::IndexSet; use rustc_hash::FxHashMap; use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP, GLOBALS}, - ecma::ast::{ - ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, Program, + ecma::{ + ast::{ + ExportAll, ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, Program, + }, + codegen::{text_writer::JsWriter, Emitter}, }, }; use turbo_tasks::{RcStr, ValueToString, Vc}; @@ -21,7 +24,6 @@ use crate::{analyzer::graph::EvalContext, parse::ParseResult, EcmascriptModuleAs pub mod asset; pub mod chunk_item; -mod cjs_finder; mod graph; pub mod merge; #[cfg(test)] @@ -110,6 +112,10 @@ impl Analyzer<'_> { for id in item.var_decls.iter() { let state = self.vars.entry(id.clone()).or_default(); + if state.declarator.is_none() { + state.declarator = Some(item_id.clone()); + } + if item.is_hoisted { state.last_writes.push(item_id.clone()); } else { @@ -171,7 +177,11 @@ impl Analyzer<'_> { if let Some(declarator) = &state.declarator { if declarator != item_id { // A write also depends on the declaration. - self.g.add_weak_deps(item_id, [declarator].iter().copied()); + if item.side_effects { + self.g.add_strong_deps(item_id, [declarator]); + } else { + self.g.add_weak_deps(item_id, [declarator]); + } } } } @@ -256,6 +266,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_strong_deps(item_id, state.last_writes.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A read also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // For each var in EVENTUAL_WRITE_VARS: @@ -266,6 +283,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_weak_deps(item_id, state.last_reads.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A write also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // (no state update happens, since this is only triggered by @@ -302,6 +326,7 @@ impl Analyzer<'_> { pub(crate) enum Key { ModuleEvaluation, Export(RcStr), + Exports, } /// Converts [Vc] to the index. @@ -312,9 +337,9 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result let key = match &*part { ModulePart::Evaluation => Key::ModuleEvaluation, ModulePart::Export(export) => Key::Export(export.await?.as_str().into()), + ModulePart::Exports => Key::Exports, ModulePart::Internal(part_id) => return Ok(*part_id), ModulePart::Locals - | ModulePart::Exports | ModulePart::Facade | ModulePart::RenamedExport { .. } | ModulePart::RenamedNamespace { .. } => { @@ -322,23 +347,64 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result } }; - let entrypoints = match &result { - SplitResult::Ok { entrypoints, .. } => entrypoints, - _ => bail!("split failed"), + let SplitResult::Ok { + entrypoints, + modules, + .. + } = &result + else { + bail!("split failed") }; - let part_id = match entrypoints.get(&key) { - Some(id) => *id, - None => { - bail!( - "could not find part id for module part {:?} in {:?}", - key, - entrypoints - ) + if let Some(id) = entrypoints.get(&key) { + return Ok(*id); + } + + // This is required to handle `export * from 'foo'` + if let ModulePart::Export(..) = &*part { + if let Some(&v) = entrypoints.get(&Key::Exports) { + return Ok(v); } - }; + } + + let mut dump = String::new(); + + for (idx, m) in modules.iter().enumerate() { + let ParseResult::Ok { + program, + source_map, + .. + } = &*m.await? + else { + bail!("failed to get module") + }; + + { + let mut buf = vec![]; + + { + let wr = JsWriter::new(Default::default(), "\n", &mut buf, None); - Ok(part_id) + let mut emitter = Emitter { + cfg: Default::default(), + comments: None, + cm: source_map.clone(), + wr, + }; + + emitter.emit_program(program).unwrap(); + } + let code = String::from_utf8(buf).unwrap(); + + writeln!(dump, "# Module #{idx}:\n{code}\n\n\n")?; + } + } + + bail!( + "could not find part id for module part {:?} in {:?}\n\nModule dump:\n{dump}", + key, + entrypoints + ) } #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] @@ -355,6 +421,9 @@ pub(crate) enum SplitResult { #[turbo_tasks(trace_ignore)] deps: FxHashMap>, + + #[turbo_tasks(debug_ignore, trace_ignore)] + star_reexports: Vec, }, Failed { parse_result: Vc, @@ -372,7 +441,12 @@ impl PartialEq for SplitResult { #[turbo_tasks::function] pub(super) async fn split_module(asset: Vc) -> Result> { - Ok(split(asset.source().ident(), asset.source(), asset.parse())) + Ok(split( + asset.source().ident(), + asset.source(), + asset.parse(), + asset.options().await?.special_exports, + )) } #[turbo_tasks::function] @@ -380,6 +454,7 @@ pub(super) async fn split( ident: Vc, source: Vc>, parsed: Vc, + special_exports: Vc>, ) -> Result> { let parse_result = parsed.await?; @@ -393,7 +468,7 @@ pub(super) async fn split( .. } => { // If the script file is a common js file, we cannot split the module - if cjs_finder::contains_cjs(program) { + if util::should_skip_tree_shaking(program, &special_exports.await?) { return Ok(SplitResult::Failed { parse_result: parsed, } @@ -419,6 +494,7 @@ pub(super) async fn split( entrypoints, part_deps, modules, + star_reexports, } = dep_graph.split_module(&items); assert_ne!(modules.len(), 0, "modules.len() == 0;\nModule: {module:?}",); @@ -431,7 +507,6 @@ pub(super) async fn split( modules.len() ); } - let modules = modules .into_iter() .map(|module| { @@ -440,7 +515,6 @@ pub(super) async fn split( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - false, Some(source), ); @@ -459,6 +533,7 @@ pub(super) async fn split( entrypoints, deps: part_deps, modules, + star_reexports, } .cell()) } @@ -483,6 +558,7 @@ pub(super) async fn part_of_module( modules, entrypoints, deps, + star_reexports, .. } => { debug_assert_ne!(modules.len(), 0, "modules.len() == 0"); @@ -557,7 +633,6 @@ pub(super) async fn part_of_module( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); return Ok(ParseResult::Ok { @@ -624,12 +699,15 @@ pub(super) async fn part_of_module( ))); } + module.body.extend(star_reexports.iter().map(|export_all| { + ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) + })); + let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); return Ok(ParseResult::Ok { diff --git a/crates/turbopack-ecmascript/src/tree_shake/util.rs b/crates/turbopack-ecmascript/src/tree_shake/util.rs index 79224046c7dd7..050f021e0c65e 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/util.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/util.rs @@ -1,17 +1,22 @@ use std::hash::BuildHasherDefault; use indexmap::IndexSet; -use rustc_hash::FxHasher; +use rustc_hash::{FxHashSet, FxHasher}; use swc_core::{ common::SyntaxContext, ecma::{ ast::{ - AssignTarget, BlockStmtOrExpr, Constructor, ExportNamedSpecifier, ExportSpecifier, - Expr, Function, Id, Ident, MemberExpr, MemberProp, NamedExport, Pat, PropName, + ArrowExpr, AssignPatProp, AssignTarget, ClassDecl, ClassExpr, Constructor, DefaultDecl, + ExportDefaultDecl, ExportNamedSpecifier, ExportSpecifier, Expr, FnDecl, FnExpr, + Function, Id, Ident, ImportSpecifier, MemberExpr, MemberProp, NamedExport, Param, Pat, + Prop, PropName, VarDeclarator, *, }, visit::{noop_visit_type, Visit, VisitWith}, }, }; +use turbo_tasks::RcStr; + +use crate::TURBOPACK_HELPER; #[derive(Debug, Default, Clone, Copy)] enum Mode { @@ -27,10 +32,11 @@ struct Target { } /// A visitor which collects variables which are read or written. -#[derive(Default)] -pub(crate) struct IdentUsageCollector { +pub(crate) struct IdentUsageCollector<'a> { unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, + vars: Vars, is_nested: bool, @@ -39,7 +45,7 @@ pub(crate) struct IdentUsageCollector { mode: Option, } -impl IdentUsageCollector { +impl IdentUsageCollector<'_> { fn with_nested(&mut self, f: impl FnOnce(&mut Self)) { if !self.target.eventual { return; @@ -58,19 +64,13 @@ impl IdentUsageCollector { } } -impl Visit for IdentUsageCollector { +impl Visit for IdentUsageCollector<'_> { fn visit_assign_target(&mut self, n: &AssignTarget) { self.with_mode(Some(Mode::Write), |this| { n.visit_children_with(this); }) } - fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) { - self.with_nested(|this| { - n.visit_children_with(this); - }) - } - fn visit_constructor(&mut self, n: &Constructor) { self.with_nested(|this| { n.visit_children_with(this); @@ -114,6 +114,7 @@ impl Visit for IdentUsageCollector { if n.span.ctxt != self.unresolved && n.span.ctxt != self.top_level && n.span.ctxt != SyntaxContext::empty() + && !self.top_level_vars.contains(&n.to_id()) { return; } @@ -168,6 +169,16 @@ impl Visit for IdentUsageCollector { } } + fn visit_prop(&mut self, n: &Prop) { + match n { + Prop::Shorthand(v) => { + self.with_mode(None, |c| c.visit_ident(v)); + } + + _ => n.visit_children_with(self), + } + } + noop_visit_type!(); } @@ -186,18 +197,26 @@ pub(crate) struct Vars { /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_captured_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_captured_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: false, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -207,18 +226,26 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_used_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -228,23 +255,256 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by_ignoring_nested( +pub(crate) fn ids_used_by_ignoring_nested<'a, N>( n: &N, unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, ) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: false, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars } + +pub struct TopLevelBindingCollector { + bindings: FxHashSet, + is_pat_decl: bool, +} + +impl TopLevelBindingCollector { + fn add(&mut self, i: &Ident) { + self.bindings.insert(i.to_id()); + } +} + +impl Visit for TopLevelBindingCollector { + noop_visit_type!(); + + fn visit_arrow_expr(&mut self, _: &ArrowExpr) {} + + fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) { + node.value.visit_with(self); + + if self.is_pat_decl { + self.add(&node.key); + } + } + + fn visit_class_decl(&mut self, node: &ClassDecl) { + self.add(&node.ident); + } + + fn visit_expr(&mut self, _: &Expr) {} + + fn visit_export_default_decl(&mut self, e: &ExportDefaultDecl) { + match &e.decl { + DefaultDecl::Class(ClassExpr { + ident: Some(ident), .. + }) => { + self.add(ident); + } + DefaultDecl::Fn(FnExpr { + ident: Some(ident), + function: f, + }) if f.body.is_some() => { + self.add(ident); + } + _ => {} + } + } + + fn visit_fn_decl(&mut self, node: &FnDecl) { + self.add(&node.ident); + } + + fn visit_import_specifier(&mut self, node: &ImportSpecifier) { + match node { + ImportSpecifier::Named(s) => self.add(&s.local), + ImportSpecifier::Default(s) => { + self.add(&s.local); + } + ImportSpecifier::Namespace(s) => { + self.add(&s.local); + } + } + } + + fn visit_param(&mut self, node: &Param) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.visit_children_with(self); + self.is_pat_decl = old; + } + + fn visit_pat(&mut self, node: &Pat) { + node.visit_children_with(self); + + if self.is_pat_decl { + if let Pat::Ident(i) = node { + self.add(&i.id) + } + } + } + + fn visit_var_declarator(&mut self, node: &VarDeclarator) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.name.visit_with(self); + + self.is_pat_decl = false; + node.init.visit_with(self); + self.is_pat_decl = old; + } +} + +/// Collects binding identifiers. +pub fn collect_top_level_decls(n: &N) -> FxHashSet +where + N: VisitWith, +{ + let mut v = TopLevelBindingCollector { + bindings: Default::default(), + is_pat_decl: false, + }; + n.visit_with(&mut v); + v.bindings +} + +pub fn should_skip_tree_shaking(m: &Program, special_exports: &[RcStr]) -> bool { + if let Program::Module(m) = m { + for item in m.body.iter() { + match item { + // Skip turbopack helpers. + ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { + with, specifiers, .. + })) => { + if let Some(with) = with.as_deref().and_then(|v| v.as_import_with()) { + for item in with.values.iter() { + if item.key.sym == *TURBOPACK_HELPER { + // Skip tree shaking if the import is from turbopack-helper + return true; + } + } + } + + // TODO(PACK-3150): Tree shaking has a bug related to ModuleExportName::Str + for s in specifiers.iter() { + if let ImportSpecifier::Named(is) = s { + if matches!(is.imported, Some(ModuleExportName::Str(..))) { + return true; + } + } + } + } + + // Tree shaking has a bug related to ModuleExportName::Str + ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport { + src: Some(..), + specifiers, + .. + })) => { + for s in specifiers { + if let ExportSpecifier::Named(es) = s { + if matches!(es.orig, ModuleExportName::Str(..)) + || matches!(es.exported, Some(ModuleExportName::Str(..))) + { + return true; + } + } + } + } + + // Skip sever actions + ModuleItem::Stmt(Stmt::Expr(ExprStmt { + expr: box Expr::Lit(Lit::Str(Str { value, .. })), + .. + })) => { + if value == "use server" { + return true; + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Var(box VarDecl { decls, .. }), + .. + })) => { + for decl in decls { + if let Pat::Ident(name) = &decl.name { + if special_exports.iter().any(|s| **s == *name.sym) { + return true; + } + } + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Fn(f), + .. + })) => { + if special_exports.iter().any(|s| **s == *f.ident.sym) { + return true; + } + } + + _ => {} + } + } + + let mut visitor = UseServerFinder::default(); + m.visit_with(&mut visitor); + if visitor.abort { + return true; + } + + for item in m.body.iter() { + if item.is_module_decl() { + return false; + } + } + } + + true +} + +#[derive(Default)] +struct UseServerFinder { + abort: bool, +} + +impl Visit for UseServerFinder { + fn visit_expr_stmt(&mut self, e: &ExprStmt) { + e.visit_children_with(self); + + if let Expr::Lit(Lit::Str(Str { value, .. })) = &*e.expr { + if value == "use server" { + self.abort = true; + } + } + } + + fn visit_stmt(&mut self, n: &Stmt) { + if self.abort { + return; + } + + n.visit_children_with(self); + } + + noop_visit_type!(); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md index 66a2680795ce9..79c4fc3cbc295 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,11 +334,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -362,9 +368,11 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; + N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -375,6 +383,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -384,6 +393,7 @@ graph TD Export( "external1", ): 3, + Exports: 11, Export( "foo", ): 2, @@ -448,6 +458,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -468,6 +481,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -547,6 +563,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -558,6 +577,22 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 11 +```js +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js @@ -590,6 +625,7 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, + Exports: 8, Export( "foo", ): 2, @@ -649,6 +685,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; import { upper } from "module"; function internal() { @@ -670,6 +709,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -709,6 +751,22 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; +``` +## Part 8 +```js +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md index d121155292e1d..073987fab8235 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md @@ -292,11 +292,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; ``` # Phase 4 ```mermaid @@ -352,11 +355,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; Item15 --> Item1; Item15 --> Item2; Item15 --> Item11; @@ -381,12 +387,14 @@ graph TD N0 --> N6; N1 --> N10; N1 --> N9; + N1 --> N5; N2 --> N9; N2 --> N5; N3 --> N6; N4 --> N6; N4 --> N8; N4 --> N2; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -397,6 +405,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -406,6 +415,7 @@ graph TD Export( "external1", ): 1, + Exports: 11, Export( "foo", ): 3, @@ -452,6 +462,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -491,6 +504,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 2 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -570,6 +586,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -581,6 +600,22 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 11 +```js +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js @@ -614,6 +649,7 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 1, + Exports: 8, Export( "foo", ): 3, @@ -651,6 +687,9 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -695,6 +734,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -734,6 +776,22 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; +``` +## Part 8 +```js +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md index eefa42f0d0b7a..3602e2dd5b590 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md @@ -355,6 +355,7 @@ graph TD Export( "c2_2", ): 3, + Exports: 9, } ``` @@ -482,6 +483,19 @@ export { d3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +export { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_1" +}; +export { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_3" +}; +export { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c2_2" +}; + ``` ## Merged (module eval) ```js @@ -519,6 +533,7 @@ c2_2(); Export( "c2_2", ): 3, + Exports: 6, } ``` @@ -563,6 +578,7 @@ export { c2_2 }; ``` ## Part 4 ```js +function d1() {} function d2() {} function c1_1() { return c1_2(); @@ -573,6 +589,9 @@ function c1_2() { function c1_3() { return c1_1(d2); } +export { d1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { d2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -589,6 +608,7 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { ``` ## Part 5 ```js +function d3() {} function c2_1() { return c2_2(d3); } @@ -598,6 +618,9 @@ function c2_2() { function c2_3() { return c2_1(); } +export { d3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { c2_1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -608,6 +631,19 @@ export { c2_3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 6 +```js +export { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_1" +}; +export { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_3" +}; +export { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c2_2" +}; + ``` ## Merged (module eval) ```js @@ -636,6 +672,7 @@ c2_2(); Export( "c2_2", ): 3, + Exports: 6, } ``` @@ -662,6 +699,7 @@ export { c1_3 }; Export( "c2_2", ): 3, + Exports: 6, } ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js new file mode 100644 index 0000000000000..fd849eeea7373 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js @@ -0,0 +1,34 @@ +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; +import Document, { Html, Head, Main, NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +export default MyDocument; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md new file mode 100644 index 0000000000000..0db4dfc0f65db --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md @@ -0,0 +1,596 @@ +# Items + +Count: 14 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsx` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsxs` + +## Item 4: Stmt 0, `ImportBinding(2)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_Fragment` + +## Item 5: Stmt 1, `ImportOfModule` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 1, `ImportBinding(0)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Document` + +## Item 7: Stmt 1, `ImportBinding(1)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Html` + +## Item 8: Stmt 1, `ImportBinding(2)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Head` + +## Item 9: Stmt 1, `ImportBinding(3)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Main` + +## Item 10: Stmt 1, `ImportBinding(4)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `NextScript` + +## Item 11: Stmt 2, `Normal` + +```js +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} + +``` + +- Declares: `MyDocument` +- Reads: `Document`, `_jsxs`, `_Fragment`, `_jsx`, `Html`, `Head`, `Main`, `NextScript` +- Write: `Document`, `MyDocument` + +## Item 12: Stmt 3, `Normal` + +```js +export default MyDocument; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `MyDocument` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item12; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #5), "default"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(1, ImportOfModule)]"]; + N4["Items: [ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(0, ImportBinding(2)), ItemId(1, ImportBinding(0)), ItemId(1, ImportBinding(1)), ItemId(1, ImportBinding(2)), ItemId(1, ImportBinding(3)), ItemId(1, ImportBinding(4)), ItemId(2, Normal), ItemId(3, Normal)]"]; + N0 --> N2; + N0 --> N3; + N0 --> N4; + N1 --> N4; + N3 --> N2; + N4 --> N2; + N4 --> N3; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, + Exports: 5, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import "react/jsx-runtime"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import 'next/document'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { jsx as _jsx } from "react/jsx-runtime"; +import { jsxs as _jsxs } from "react/jsx-runtime"; +import { Fragment as _Fragment } from "react/jsx-runtime"; +import Document from 'next/document'; +import { Html } from 'next/document'; +import { Head } from 'next/document'; +import { Main } from 'next/document'; +import { NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +const __TURBOPACK__default__export__ = MyDocument; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, + Exports: 5, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import "react/jsx-runtime"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import 'next/document'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { jsx as _jsx } from "react/jsx-runtime"; +import { jsxs as _jsxs } from "react/jsx-runtime"; +import { Fragment as _Fragment } from "react/jsx-runtime"; +import Document from 'next/document'; +import { Html } from 'next/document'; +import { Head } from 'next/document'; +import { Main } from 'next/document'; +import { NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +const __TURBOPACK__default__export__ = MyDocument; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md index b797be2842de7..b7655b3de241f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md @@ -103,7 +103,7 @@ const routeModule = new AppRouteRouteModule({ - Side effects - Declares: `routeModule` - Reads: `AppRouteRouteModule`, `RouteKind`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `routeModule`, `RouteKind`, `userland` ## Item 10: Stmt 5, `VarDeclarator(0)` @@ -142,6 +142,7 @@ function patchFetch() { - Declares: `patchFetch` - Reads (eventual): `_patchFetch`, `serverHooks`, `staticGenerationAsyncStorage` - Write: `patchFetch` +- Write (eventual): `serverHooks`, `staticGenerationAsyncStorage` # Phase 1 ```mermaid @@ -282,6 +283,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; ``` # Phase 4 ```mermaid @@ -335,6 +338,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; Item13 --> Item1; Item13 --> Item2; Item13 --> Item3; @@ -368,6 +373,8 @@ graph TD N4 --> N12; N6 --> N11; N6 --> N12; + N6 --> N4; + N6 --> N3; N8 --> N7; N9 --> N7; N9 --> N8; @@ -400,6 +407,7 @@ graph TD Export( "routeModule", ): 1, + Exports: 13, Export( "originalPathname", ): 5, @@ -477,6 +485,12 @@ import "__TURBOPACK_PART__" assert { import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { patchFetch as patchFetch }; import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; function patchFetch() { @@ -594,6 +608,28 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 13 +```js +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; +export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export requestAsyncStorage" +}; +export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export staticGenerationAsyncStorage" +}; +export { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export serverHooks" +}; +export { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export originalPathname" +}; +export { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export patchFetch" +}; + ``` ## Merged (module eval) ```js @@ -635,6 +671,7 @@ import "__TURBOPACK_PART__" assert { Export( "routeModule", ): 1, + Exports: 13, Export( "originalPathname", ): 5, @@ -822,6 +859,28 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 13 +```js +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; +export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export requestAsyncStorage" +}; +export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export staticGenerationAsyncStorage" +}; +export { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export serverHooks" +}; +export { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export originalPathname" +}; +export { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export patchFetch" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md index c734bad84fb88..458f65fd2d252 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md @@ -88,6 +88,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 3, Export( "b", ): 2, @@ -121,6 +122,16 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js @@ -132,6 +143,7 @@ export { b } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, + Exports: 3, Export( "b", ): 2, @@ -165,6 +177,16 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md index 7929d55a7d44b..e21a6ea4860dc 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md @@ -281,10 +281,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; ``` # Phase 4 ```mermaid @@ -338,10 +341,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; Item14 --> Item3; Item14 --> Item6; Item14 --> Item9; @@ -371,9 +377,10 @@ graph TD N3 --> N13; N4 --> N13; N4 --> N11; + N4 --> N6; N5 --> N11; - N5 --> N12; N5 --> N6; + N5 --> N12; N7 --> N6; N8 --> N7; N8 --> N6; @@ -402,6 +409,7 @@ graph TD Export( "initialCat", ): 3, + Exports: 14, Export( "cat", ): 2, @@ -463,6 +471,9 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; export { getChimera }; function getChimera() { return cat + dog; @@ -477,12 +488,12 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; import { dog } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; function getDog() { return dog; } @@ -598,6 +609,22 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 14 +```js +export { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export dogRef" +}; +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export initialCat" +}; +export { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getChimera" +}; + ``` ## Merged (module eval) ```js @@ -624,6 +651,7 @@ import "__TURBOPACK_PART__" assert { Export( "initialCat", ): 3, + Exports: 10, Export( "cat", ): 2, @@ -714,6 +742,9 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { getChimera }; function getChimera() { return cat + dog; @@ -768,6 +799,22 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 10 +```js +export { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export dogRef" +}; +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export initialCat" +}; +export { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getChimera" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md index a19d842625785..0fbaba881b5bd 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md @@ -41,6 +41,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 3 ```mermaid @@ -51,6 +52,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 4 ```mermaid @@ -61,8 +63,8 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item3 --> Item1; Item4 --> Item2; + Item3 --> Item1; ``` # Final ```mermaid @@ -78,6 +80,7 @@ graph TD Export( "fakeCat", ): 1, + Exports: 2, } ``` @@ -97,6 +100,13 @@ export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 2 +```js +export { fakeCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export fakeCat" +}; + ``` ## Merged (module eval) ```js @@ -112,6 +122,7 @@ import "./lib"; Export( "fakeCat", ): 1, + Exports: 2, } ``` @@ -131,6 +142,13 @@ export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 2 +```js +export { fakeCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export fakeCat" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md index 41b9426b0686b..b38d9dbf90f83 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md @@ -239,6 +239,7 @@ graph TD Export( "addMessageListener", ): 1, + Exports: 6, Export( "sendMessage", ): 2, @@ -361,6 +362,19 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 6 +```js +export { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export addMessageListener" +}; +export { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export sendMessage" +}; +export { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export connectHMR" +}; + ``` ## Merged (module eval) ```js @@ -378,6 +392,7 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { Export( "addMessageListener", ): 1, + Exports: 6, Export( "sendMessage", ): 2, @@ -500,6 +515,19 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 6 +```js +export { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export addMessageListener" +}; +export { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export sendMessage" +}; +export { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export connectHMR" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md index 361e8588ef2c0..dcaa3b1ed962c 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md @@ -465,9 +465,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; ``` # Phase 4 ```mermaid @@ -536,9 +538,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; Item20 --> Item1; Item20 --> Item2; Item20 --> Item3; @@ -555,9 +559,9 @@ graph TD N5["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch")), ItemId(9, Normal)]"]; N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs")), ItemId(11, Normal)]"]; N7["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses")), ItemId(12, Normal)]"]; - N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(14, Normal)]"]; + N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(0, ImportBinding(0)), ItemId(14, Normal)]"]; N9["Items: [ItemId(0, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N10["Items: [ItemId(10, Normal)]"]; + N10["Items: [ItemId(0, ImportBinding(0)), ItemId(10, Normal)]"]; N11["Items: [ItemId(13, Normal)]"]; N2 --> N3; N2 --> N10; @@ -566,6 +570,8 @@ graph TD N5 --> N10; N8 --> N11; N8 --> N9; + N8 --> N10; + N9 --> N10; N10 --> N11; N10 --> N9; N11 --> N9; @@ -599,6 +605,7 @@ graph TD Export( "formatDynamicAPIAccesses", ): 7, + Exports: 12, } ``` @@ -782,10 +789,14 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; export { createPostponedAbortSignal }; +import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -796,6 +807,9 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -803,6 +817,9 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -818,9 +835,10 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -830,6 +848,9 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -849,6 +870,34 @@ export { assertPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 12 +```js +export { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPrerenderState" +}; +export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export markCurrentScopeAsDynamic" +}; +export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicDataAccessed" +}; +export { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export Postpone" +}; +export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicFetch" +}; +export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export usedDynamicAPIs" +}; +export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export formatDynamicAPIAccesses" +}; +export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPostponedAbortSignal" +}; + ``` ## Merged (module eval) ```js @@ -888,6 +937,7 @@ import '../../lib/url'; Export( "formatDynamicAPIAccesses", ): 7, + Exports: 12, } ``` @@ -1071,10 +1121,14 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; export { createPostponedAbortSignal }; +import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -1085,6 +1139,9 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1092,6 +1149,9 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -1107,9 +1167,10 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { React } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -1119,6 +1180,9 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1138,6 +1202,34 @@ export { assertPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 12 +```js +export { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPrerenderState" +}; +export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export markCurrentScopeAsDynamic" +}; +export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicDataAccessed" +}; +export { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export Postpone" +}; +export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicFetch" +}; +export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export usedDynamicAPIs" +}; +export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export formatDynamicAPIAccesses" +}; +export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPostponedAbortSignal" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md index 5220a3ffac6a3..d903445cdfb18 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,7 +1638,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1614,41 +1647,51 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; + N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; + N0 --> N9; N0 --> N6; - N0 --> N2; N1 --> N6; + N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N8; + N6 --> N9; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N8; + N7 --> N9; N7 --> N6; + N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N7; + N9 --> N6; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, Export( "IPC", ): 2, + Exports: 10, + Export( + "structuredError", + ): 1, } ``` @@ -1668,22 +1711,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1738,6 +1778,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1771,7 +1814,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1806,7 +1849,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1831,6 +1874,9 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -1992,6 +2038,53 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { createConnection } from "node:net"; +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + ``` ## Merged (module eval) ```js @@ -2007,22 +2100,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2072,12 +2162,13 @@ export { improveConsole } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, Export( "IPC", ): 2, + Exports: 10, + Export( + "structuredError", + ): 1, } ``` @@ -2097,13 +2188,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2149,6 +2240,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2374,6 +2468,38 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + +``` +## Part 10 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + ``` ## Merged (module eval) ```js @@ -2389,13 +2515,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md index 6426c3f4376c8..32edc7597008f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md @@ -299,6 +299,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 7, Export( "y", ): 2, @@ -388,6 +389,16 @@ x += 7; x += 8; x += 9; +``` +## Part 7 +```js +export { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export x" +}; +export { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export y" +}; + ``` ## Merged (module eval) ```js @@ -402,6 +413,7 @@ import "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, + Exports: 6, Export( "y", ): 2, @@ -478,6 +490,16 @@ x += 7; x += 8; x += 9; +``` +## Part 6 +```js +export { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export x" +}; +export { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export y" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md index adbe2ec572da3..c00cbd3e502da 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md @@ -140,10 +140,10 @@ export const run = async (moduleFactory)=>{ ``` +- Side effects - Declares: `run` -- Reads (eventual): `ipc`, `queue` -- Write: `run` -- Write (eventual): `ipc`, `queue` +- Reads: `ipc`, `queue` +- Write: `run`, `ipc`, `queue` # Phase 1 ```mermaid @@ -171,6 +171,9 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item5 --> Item1; Item7 --> Item5; ``` # Phase 3 @@ -186,9 +189,10 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; ``` # Phase 4 ```mermaid @@ -203,22 +207,31 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; Item6 --> Item1; + Item6 --> Item5; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("run", #2), "run")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("run", #2), "run"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; + N0 --> N2; + N0 --> N3; + N1 --> N3; + N3 --> N2; ``` # Entrypoints ``` { ModuleEvaluation: 0, + Exports: 4, Export( "run", ): 1, @@ -229,13 +242,33 @@ graph TD # Modules (dev) ## Part 0 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; -import "./index"; ``` ## Part 1 ```js +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { run }; + +``` +## Part 2 +```js +import "./index"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -343,10 +376,22 @@ export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export run" +}; + ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; ``` @@ -355,6 +400,7 @@ import "./index"; ``` { ModuleEvaluation: 0, + Exports: 4, Export( "run", ): 1, @@ -365,13 +411,33 @@ import "./index"; # Modules (prod) ## Part 0 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; -import "./index"; ``` ## Part 1 ```js +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; export { run }; + +``` +## Part 2 +```js +import "./index"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -479,10 +545,22 @@ export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export run" +}; + ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md index 5220a3ffac6a3..d903445cdfb18 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,7 +1638,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1614,41 +1647,51 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; + N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; + N0 --> N9; N0 --> N6; - N0 --> N2; N1 --> N6; + N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N8; + N6 --> N9; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N8; + N7 --> N9; N7 --> N6; + N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N7; + N9 --> N6; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, Export( "IPC", ): 2, + Exports: 10, + Export( + "structuredError", + ): 1, } ``` @@ -1668,22 +1711,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1738,6 +1778,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1771,7 +1814,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1806,7 +1849,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1831,6 +1874,9 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -1992,6 +2038,53 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { createConnection } from "node:net"; +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + ``` ## Merged (module eval) ```js @@ -2007,22 +2100,19 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 6 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2072,12 +2162,13 @@ export { improveConsole } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, Export( "IPC", ): 2, + Exports: 10, + Export( + "structuredError", + ): 1, } ``` @@ -2097,13 +2188,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2149,6 +2240,9 @@ export { structuredError }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2374,6 +2468,38 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + +``` +## Part 10 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + ``` ## Merged (module eval) ```js @@ -2389,13 +2515,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js new file mode 100644 index 0000000000000..2f8e8f3d19740 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md new file mode 100644 index 0000000000000..331a120f8ad52 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md @@ -0,0 +1,465 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; + N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; + N3["Items: [ItemId(0, VarDeclarator(0))]"]; + N4["Items: [ItemId(1, VarDeclarator(0))]"]; + N5["Items: [ItemId(2, VarDeclarator(0))]"]; + N1 --> N3; + N1 --> N5; + N1 --> N4; + N2 --> N3; + N2 --> N4; + N2 --> N5; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getClientComponentLoaderMetrics", + ): 2, + Exports: 6, + Export( + "wrapClientComponentLoader", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getClientComponentLoaderMetrics", + ): 2, + Exports: 6, + Export( + "wrapClientComponentLoader", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js new file mode 100644 index 0000000000000..831bb0474831b --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md new file mode 100644 index 0000000000000..353e06f5e3ad0 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md @@ -0,0 +1,465 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; + N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; + N3["Items: [ItemId(0, VarDeclarator(0))]"]; + N4["Items: [ItemId(1, VarDeclarator(0))]"]; + N5["Items: [ItemId(2, VarDeclarator(0))]"]; + N1 --> N3; + N1 --> N5; + N1 --> N4; + N2 --> N3; + N2 --> N4; + N2 --> N5; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getClientComponentLoaderMetrics", + ): 2, + Exports: 6, + Export( + "wrapClientComponentLoader", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "getClientComponentLoaderMetrics", + ): 2, + Exports: 6, + Export( + "wrapClientComponentLoader", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; + +``` +## Part 1 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { wrapClientComponentLoader }; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getClientComponentLoaderMetrics }; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md index add30fe1a5e6a..ec441ed9dee16 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md @@ -45,6 +45,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 3 @@ -58,6 +59,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 4 @@ -71,8 +73,8 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item5 --> Item2; Item4 --> Item1; + Item5 --> Item2; ``` # Final ```mermaid @@ -86,6 +88,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 3, Export( "cat", ): 2, @@ -119,6 +122,16 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; + ``` ## Merged (module eval) ```js @@ -130,6 +143,7 @@ export { cat } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, + Exports: 3, Export( "cat", ): 2, @@ -163,6 +177,16 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js new file mode 100644 index 0000000000000..bf12a2b2e4066 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js @@ -0,0 +1,44 @@ +import crypto from 'crypto' +import { urlAlphabet } from './url-alphabet/index.js' +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} +let random = bytes => { + fillPool((bytes -= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} +let customRandom = (alphabet, size, getRandom) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * size) / alphabet.length) + return () => { + let id = '' + while (true) { + let bytes = getRandom(step) + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) +let nanoid = (size = 21) => { + fillPool((size -= 0)) + let id = '' + for (let i = poolOffset - size; i < poolOffset; i++) { + id += urlAlphabet[pool[i] & 63] + } + return id +} +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md new file mode 100644 index 0000000000000..229602f229f54 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md @@ -0,0 +1,960 @@ +# Items + +Count: 18 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Declares: `crypto` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Declares: `urlAlphabet` + +## Item 5: Stmt 2, `VarDeclarator(0)` + +```js +const POOL_SIZE_MULTIPLIER = 128; + +``` + +- Declares: `POOL_SIZE_MULTIPLIER` +- Write: `POOL_SIZE_MULTIPLIER` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +let pool, poolOffset; + +``` + +- Declares: `pool` +- Write: `pool` + +## Item 7: Stmt 3, `VarDeclarator(1)` + +```js +let pool, poolOffset; + +``` + +- Declares: `poolOffset` +- Write: `poolOffset` + +## Item 8: Stmt 4, `VarDeclarator(0)` + +```js +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; + +``` + +- Side effects +- Declares: `fillPool` +- Reads: `pool`, `POOL_SIZE_MULTIPLIER`, `crypto`, `poolOffset` +- Write: `fillPool`, `pool`, `crypto`, `poolOffset` + +## Item 9: Stmt 5, `VarDeclarator(0)` + +```js +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; + +``` + +- Declares: `random` +- Reads: `fillPool`, `pool`, `poolOffset` +- Write: `random`, `pool` + +## Item 10: Stmt 6, `VarDeclarator(0)` + +```js +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; + +``` + +- Side effects +- Declares: `customRandom` +- Write: `customRandom` + +## Item 11: Stmt 7, `VarDeclarator(0)` + +```js +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); + +``` + +- Declares: `customAlphabet` +- Reads: `customRandom`, `random` +- Write: `customAlphabet` + +## Item 12: Stmt 8, `VarDeclarator(0)` + +```js +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; + +``` + +- Declares: `nanoid` +- Reads: `fillPool`, `poolOffset`, `urlAlphabet`, `pool` +- Write: `nanoid`, `urlAlphabet`, `pool` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item8; + Item13 --> Item10; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("nanoid", #2), "nanoid"))]"]; + N2["Items: [ItemId(Export(("customAlphabet", #2), "customAlphabet")), ItemId(7, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("customRandom", #2), "customRandom"))]"]; + N4["Items: [ItemId(Export(("urlAlphabet", #2), "urlAlphabet")), ItemId(1, ImportBinding(0))]"]; + N5["Items: [ItemId(Export(("random", #2), "random"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, ImportOfModule)]"]; + N8["Items: [ItemId(3, VarDeclarator(0))]"]; + N9["Items: [ItemId(3, VarDeclarator(1))]"]; + N10["Items: [ItemId(0, ImportBinding(0)), ItemId(2, VarDeclarator(0)), ItemId(4, VarDeclarator(0))]"]; + N11["Items: [ItemId(5, VarDeclarator(0))]"]; + N12["Items: [ItemId(6, VarDeclarator(0))]"]; + N13["Items: [ItemId(1, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N0 --> N6; + N0 --> N7; + N0 --> N10; + N0 --> N12; + N1 --> N13; + N2 --> N12; + N2 --> N11; + N3 --> N12; + N4 --> N13; + N5 --> N11; + N7 --> N6; + N10 --> N8; + N10 --> N9; + N10 --> N6; + N10 --> N7; + N11 --> N10; + N11 --> N8; + N11 --> N9; + N12 --> N6; + N12 --> N7; + N12 --> N10; + N13 --> N10; + N13 --> N9; + N13 --> N11; + N13 --> N8; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 14, + Export( + "customAlphabet", + ): 2, + Export( + "customRandom", + ): 3, + Export( + "urlAlphabet", + ): 4, + Export( + "random", + ): 5, + Export( + "nanoid", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 2 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { customAlphabet as customAlphabet }; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { customRandom as customRandom }; + +``` +## Part 4 +```js +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { urlAlphabet as urlAlphabet }; +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 6 +```js +import 'crypto'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import './url-alphabet/index.js'; + +``` +## Part 8 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import crypto from 'crypto'; +const POOL_SIZE_MULTIPLIER = 128; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { urlAlphabet } from './url-alphabet/index.js'; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +export { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export nanoid" +}; +export { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customAlphabet" +}; +export { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customRandom" +}; +export { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export urlAlphabet" +}; +export { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export random" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 14, + Export( + "customAlphabet", + ): 2, + Export( + "customRandom", + ): 3, + Export( + "urlAlphabet", + ): 4, + Export( + "random", + ): 5, + Export( + "nanoid", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 2 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { customAlphabet as customAlphabet }; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { customRandom as customRandom }; + +``` +## Part 4 +```js +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { urlAlphabet as urlAlphabet }; +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 6 +```js +import 'crypto'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import './url-alphabet/index.js'; + +``` +## Part 8 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import crypto from 'crypto'; +const POOL_SIZE_MULTIPLIER = 128; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { urlAlphabet } from './url-alphabet/index.js'; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +export { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export nanoid" +}; +export { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customAlphabet" +}; +export { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customRandom" +}; +export { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export urlAlphabet" +}; +export { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export random" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js new file mode 100644 index 0000000000000..355cd43370ea1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js @@ -0,0 +1,122 @@ +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +const INTERNALS = Symbol('internal response'); +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +/** + * This class extends the [Web `Response` API](https://developer.mozilla.org/docs/Web/API/Response) with additional convenience methods. + * + * Read more: [Next.js Docs: `NextResponse`](https://nextjs.org/docs/app/api-reference/functions/next-response) + */ export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + // rest of props come from Response + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +//# sourceMappingURL=response.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md new file mode 100644 index 0000000000000..20d9b441f54eb --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md @@ -0,0 +1,1161 @@ +# Items + +Count: 17 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Declares: `stringifyCookie` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Declares: `NextURL` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `toNodeOutgoingHttpHeaders` + +## Item 7: Stmt 2, `ImportBinding(1)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `validateURL` + +## Item 8: Stmt 3, `ImportOfModule` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Side effects + +## Item 9: Stmt 3, `ImportBinding(0)` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Declares: `ReflectAdapter` + +## Item 10: Stmt 4, `ImportOfModule` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Side effects + +## Item 11: Stmt 4, `ImportBinding(0)` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Declares: `ResponseCookies` + +## Item 12: Stmt 5, `VarDeclarator(0)` + +```js +const INTERNALS = Symbol('internal response'); + +``` + +- Side effects +- Declares: `INTERNALS` +- Write: `INTERNALS` + +## Item 13: Stmt 6, `VarDeclarator(0)` + +```js +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); + +``` + +- Side effects +- Declares: `REDIRECTS` +- Write: `REDIRECTS` + +## Item 14: Stmt 7, `Normal` + +```js +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} + +``` + +- Hoisted +- Declares: `handleMiddlewareField` +- Write: `handleMiddlewareField` + +## Item 15: Stmt 8, `Normal` + +```js +export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +``` + +- Declares: `NextResponse` +- Reads: `ResponseCookies`, `stringifyCookie`, `handleMiddlewareField`, `ReflectAdapter`, `INTERNALS`, `NextURL`, `toNodeOutgoingHttpHeaders`, `NextResponse`, `REDIRECTS`, `validateURL` +- Write: `ReflectAdapter`, `REDIRECTS`, `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("NextResponse", #2), "NextResponse")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(2, ImportBinding(1)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(7, Normal), ItemId(8, Normal)]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(1, ImportOfModule)]"]; + N4["Items: [ItemId(2, ImportOfModule)]"]; + N5["Items: [ItemId(3, ImportOfModule)]"]; + N6["Items: [ItemId(4, ImportOfModule)]"]; + N7["Items: [ItemId(5, VarDeclarator(0))]"]; + N8["Items: [ItemId(6, VarDeclarator(0))]"]; + N0 --> N2; + N0 --> N3; + N0 --> N4; + N0 --> N5; + N0 --> N6; + N0 --> N7; + N0 --> N8; + N1 --> N7; + N1 --> N8; + N3 --> N2; + N4 --> N2; + N4 --> N3; + N5 --> N2; + N5 --> N3; + N5 --> N4; + N6 --> N2; + N6 --> N3; + N6 --> N4; + N6 --> N5; + N7 --> N2; + N7 --> N3; + N7 --> N4; + N7 --> N5; + N7 --> N6; + N8 --> N2; + N8 --> N3; + N8 --> N4; + N8 --> N5; + N8 --> N6; + N8 --> N7; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "NextResponse", + ): 1, + Exports: 9, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { NextResponse }; +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders } from '../utils'; +import { validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import '../next-url'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import '../utils'; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import './adapters/reflect'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './cookies'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +export { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export NextResponse" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "NextResponse", + ): 1, + Exports: 9, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { NextResponse }; +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders } from '../utils'; +import { validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import '../next-url'; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import '../utils'; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import './adapters/reflect'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './cookies'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +export { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export NextResponse" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js new file mode 100644 index 0000000000000..3fafa47598599 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js @@ -0,0 +1,214 @@ +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; +let api; +// we want to allow users to use their own version of @opentelemetry/api if they +// want to, so we try to require it first, and if it fails we fall back to the +// version that is bundled with Next.js +// this is because @opentelemetry/api has to be synced with the version of +// @opentelemetry/tracing that is used, and we don't want to force users to use +// the version that is bundled with Next.js. +// the API is ~stable, so this should be fine +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +/** we use this map to propagate attributes from nested spans to the top span */ const rootSpanAttributesStore = new Map(); +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + /** + * Returns an instance to the trace with configured name. + * Since wrap / trace can be defined in any place prior to actual trace subscriber initialization, + * This should be lazily evaluated. + */ getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + // Active span is already set, too late to propagate. + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + // coerce options form overload + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + // Trying to get active scoped span to assign parent. If option specifies parent span manually, will try to use it. + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + // If there's error make sure it throws + return result.then((res)=>{ + span.end(); + // Need to pass down the promise result, + // it could be react stream response with error { error, stream } + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { getTracer, SpanStatusCode, SpanKind }; + +//# sourceMappingURL=tracer.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md new file mode 100644 index 0000000000000..e8c8203b76367 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md @@ -0,0 +1,1516 @@ +# Items + +Count: 23 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `LogSpanAllowList` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `NextVanillaSpanAllowlist` + +## Item 4: Stmt 1, `VarDeclarator(0)` + +```js +let api; + +``` + +- Declares: `api` +- Write: `api` + +## Item 5: Stmt 2, `Normal` + +```js +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` + +- Side effects +- Write: `api` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; + +``` + +- Declares: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` +- Reads: `api` +- Write: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` + +## Item 7: Stmt 4, `VarDeclarator(0)` + +```js +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; + +``` + +- Declares: `isPromise` +- Write: `isPromise` + +## Item 8: Stmt 5, `Normal` + +```js +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} + +``` + +- Declares: `BubbledError` +- Write: `BubbledError` + +## Item 9: Stmt 6, `Normal` + +```js +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} + +``` + +- Hoisted +- Declares: `isBubbledError` +- Reads (eventual): `BubbledError` +- Write: `isBubbledError` + +## Item 10: Stmt 7, `VarDeclarator(0)` + +```js +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; + +``` + +- Declares: `closeSpanWithError` +- Reads: `isBubbledError`, `SpanStatusCode` +- Write: `closeSpanWithError`, `SpanStatusCode` + +## Item 11: Stmt 8, `VarDeclarator(0)` + +```js +const rootSpanAttributesStore = new Map(); + +``` + +- Side effects +- Declares: `rootSpanAttributesStore` +- Write: `rootSpanAttributesStore` + +## Item 12: Stmt 9, `VarDeclarator(0)` + +```js +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); + +``` + +- Declares: `rootSpanIdKey` +- Reads: `api` +- Write: `rootSpanIdKey`, `api` + +## Item 13: Stmt 10, `VarDeclarator(0)` + +```js +let lastSpanId = 0; + +``` + +- Declares: `lastSpanId` +- Write: `lastSpanId` + +## Item 14: Stmt 11, `VarDeclarator(0)` + +```js +const getSpanId = ()=>lastSpanId++; + +``` + +- Declares: `getSpanId` +- Reads: `lastSpanId` +- Write: `getSpanId` + +## Item 15: Stmt 12, `VarDeclarator(0)` + +```js +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; + +``` + +- Declares: `clientTraceDataSetter` +- Write: `clientTraceDataSetter` + +## Item 16: Stmt 13, `Normal` + +```js +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} + +``` + +- Declares: `NextTracerImpl` +- Reads: `trace`, `context`, `propagation`, `clientTraceDataSetter`, `NextVanillaSpanAllowlist`, `ROOT_CONTEXT`, `getSpanId`, `rootSpanIdKey`, `rootSpanAttributesStore`, `LogSpanAllowList`, `closeSpanWithError`, `isPromise` +- Write: `trace`, `context`, `propagation`, `NextVanillaSpanAllowlist`, `rootSpanAttributesStore`, `LogSpanAllowList`, `NextTracerImpl` + +## Item 17: Stmt 14, `VarDeclarator(0)` + +```js +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); + +``` + +- Declares: `getTracer` +- Reads: `NextTracerImpl` +- Write: `getTracer` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; + Item18 --> Item1; + Item18 --> Item5; + Item18 --> Item11; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("BubbledError", #2), "BubbledError"))]"]; + N2["Items: [ItemId(Export(("isBubbledError", #2), "isBubbledError"))]"]; + N3["Items: [ItemId(Export(("getTracer", #2), "getTracer")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(4, VarDeclarator(0)), ItemId(9, VarDeclarator(0)), ItemId(10, VarDeclarator(0)), ItemId(11, VarDeclarator(0)), ItemId(12, VarDeclarator(0)), ItemId(13, Normal), ItemId(14, VarDeclarator(0))]"]; + N4["Items: [ItemId(Export(("SpanStatusCode", #2), "SpanStatusCode"))]"]; + N5["Items: [ItemId(Export(("SpanKind", #2), "SpanKind"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, VarDeclarator(0))]"]; + N8["Items: [ItemId(2, Normal)]"]; + N9["Items: [ItemId(3, VarDeclarator(0))]"]; + N10["Items: [ItemId(5, Normal)]"]; + N11["Items: [ItemId(6, Normal)]"]; + N12["Items: [ItemId(7, VarDeclarator(0))]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N0 --> N6; + N0 --> N8; + N0 --> N13; + N1 --> N10; + N2 --> N11; + N3 --> N8; + N3 --> N7; + N3 --> N9; + N3 --> N13; + N3 --> N12; + N4 --> N12; + N4 --> N9; + N5 --> N9; + N8 --> N7; + N8 --> N6; + N9 --> N8; + N9 --> N7; + N11 --> N10; + N12 --> N11; + N12 --> N9; + N13 --> N6; + N13 --> N8; + N13 --> N10; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "isBubbledError", + ): 2, + Export( + "SpanKind", + ): 5, + Exports: 14, + Export( + "SpanStatusCode", + ): 4, + Export( + "BubbledError", + ): 1, + Export( + "getTracer", + ): 3, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { BubbledError }; + +``` +## Part 2 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { isBubbledError }; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { getTracer as getTracer }; +import { LogSpanAllowList } from './constants'; +import { NextVanillaSpanAllowlist } from './constants'; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 5 +```js +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanKind as SpanKind }; + +``` +## Part 6 +```js +import './constants'; + +``` +## Part 7 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +export { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export BubbledError" +}; +export { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export isBubbledError" +}; +export { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getTracer" +}; +export { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanStatusCode" +}; +export { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanKind" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "isBubbledError", + ): 2, + Export( + "SpanKind", + ): 5, + Exports: 14, + Export( + "SpanStatusCode", + ): 4, + Export( + "BubbledError", + ): 1, + Export( + "getTracer", + ): 3, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { BubbledError }; + +``` +## Part 2 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { isBubbledError }; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { getTracer as getTracer }; +import { LogSpanAllowList } from './constants'; +import { NextVanillaSpanAllowlist } from './constants'; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 5 +```js +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { SpanKind as SpanKind }; + +``` +## Part 6 +```js +import './constants'; + +``` +## Part 7 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +export { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export BubbledError" +}; +export { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export isBubbledError" +}; +export { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getTracer" +}; +export { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanStatusCode" +}; +export { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanKind" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js new file mode 100644 index 0000000000000..dbdeaab4b2c2a --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js @@ -0,0 +1,9 @@ +import Stream from 'node:stream'; + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +function fetch(){ + +} + +export default fetch; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md new file mode 100644 index 0000000000000..e5e48962003c7 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md @@ -0,0 +1,278 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Declares: `Stream` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +``` + +- Declares: `streamDestructionSupported` +- Reads: `Stream` +- Write: `streamDestructionSupported`, `Stream` + +## Item 4: Stmt 2, `Normal` + +```js +function fetch() {} + +``` + +- Hoisted +- Declares: `fetch` +- Write: `fetch` + +## Item 5: Stmt 3, `Normal` + +```js +export default fetch; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `fetch` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; + Item6 --> Item1; + Item6 --> Item5; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #4), "default"))]"]; + N2["Items: [ItemId(0, ImportOfModule)]"]; + N3["Items: [ItemId(2, Normal), ItemId(3, Normal)]"]; + N0 --> N2; + N0 --> N3; + N1 --> N3; + N3 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, + Exports: 4, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import 'node:stream'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function fetch() {} +const __TURBOPACK__default__export__ = fetch; +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Export( + "default", + ): 1, + Exports: 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` +## Part 1 +```js +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 2 +```js +import 'node:stream'; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function fetch() {} +const __TURBOPACK__default__export__ = fetch; +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md index 77cd4a23f2131..6cc6ecc74a347 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md @@ -50,6 +50,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 1, } ``` @@ -60,6 +61,10 @@ graph TD "module evaluation"; process.turbopack = {}; +``` +## Part 1 +```js + ``` ## Merged (module eval) ```js @@ -72,6 +77,7 @@ process.turbopack = {}; ``` { ModuleEvaluation: 0, + Exports: 1, } ``` @@ -82,6 +88,10 @@ process.turbopack = {}; "module evaluation"; process.turbopack = {}; +``` +## Part 1 +```js + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js new file mode 100644 index 0000000000000..0d99a1926bc63 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { DEFAULT_ENVIRONMENT, parseEnvironment, } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +/** + * Gets the environment variables + */ +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md new file mode 100644 index 0000000000000..0ff6ef1b2b064 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md @@ -0,0 +1,355 @@ +# Items + +Count: 10 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `DEFAULT_ENVIRONMENT` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `parseEnvironment` + +## Item 4: Stmt 1, `ImportOfModule` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Side effects + +## Item 5: Stmt 1, `ImportBinding(0)` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Declares: `_globalThis` + +## Item 6: Stmt 2, `Normal` + +```js +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} + +``` + +- Hoisted +- Declares: `getEnv` +- Reads (eventual): `parseEnvironment`, `_globalThis`, `DEFAULT_ENVIRONMENT` +- Write: `getEnv` + +## Item 7: Stmt 3, `Normal` + +```js +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} + +``` + +- Hoisted +- Declares: `getEnvWithoutDefaults` +- Reads (eventual): `parseEnvironment`, `_globalThis` +- Write: `getEnvWithoutDefaults` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; + Item8 --> Item1; + Item8 --> Item2; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("getEnv", #2), "getEnv")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(2, Normal)]"]; + N2["Items: [ItemId(Export(("getEnvWithoutDefaults", #2), "getEnvWithoutDefaults")), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(3, Normal)]"]; + N1 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 3, + Export( + "getEnv", + ): 1, + Export( + "getEnvWithoutDefaults", + ): 2, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import '../../utils/environment'; +import './globalThis'; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { getEnv }; +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { getEnvWithoutDefaults }; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +export { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnv" +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnvWithoutDefaults" +}; + +``` +## Merged (module eval) +```js +import '../../utils/environment'; +import './globalThis'; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 3, + Export( + "getEnv", + ): 1, + Export( + "getEnvWithoutDefaults", + ): 2, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import '../../utils/environment'; +import './globalThis'; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { getEnv }; +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { getEnvWithoutDefaults }; +import { parseEnvironment } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +export { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnv" +}; +export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnvWithoutDefaults" +}; + +``` +## Merged (module eval) +```js +import '../../utils/environment'; +import './globalThis'; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js new file mode 100644 index 0000000000000..3fa42f80742e1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js @@ -0,0 +1,9 @@ +import { NextResponse } from "next/server"; + +export const GET = (req) => { + return NextResponse.json({ + pathname: req.nextUrl.pathname, + }); +}; + +export const runtime = "edge"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md new file mode 100644 index 0000000000000..c6c9a53751928 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md @@ -0,0 +1,252 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +export const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; + +``` + +- Declares: `GET` +- Reads: `NextResponse` +- Write: `GET`, `NextResponse` + +## Item 4: Stmt 2, `VarDeclarator(0)` + +```js +export const runtime = "edge"; + +``` + +- Declares: `runtime` +- Write: `runtime` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; + Item5 --> Item1; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("runtime", #2), "runtime")), ItemId(2, VarDeclarator(0))]"]; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 3, + Export( + "runtime", + ): 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import "next/server"; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from "next/server"; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { runtime }; +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; +export { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export runtime" +}; + +``` +## Merged (module eval) +```js +import "next/server"; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 3, + Export( + "runtime", + ): 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import "next/server"; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from "next/server"; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { runtime }; +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; +export { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export runtime" +}; + +``` +## Merged (module eval) +```js +import "next/server"; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md index b786b9b06e654..68fb073d93c3c 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md @@ -98,6 +98,7 @@ graph TD Export( "RouteKind", ): 1, + Exports: 4, } ``` @@ -142,6 +143,13 @@ import { RouteKind } from "__TURBOPACK_PART__" assert { RouteKind["APP_ROUTE"] = "APP_ROUTE"; })(RouteKind || (RouteKind = {})); +``` +## Part 4 +```js +export { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export RouteKind" +}; + ``` ## Merged (module eval) ```js @@ -159,6 +167,7 @@ import "__TURBOPACK_PART__" assert { Export( "RouteKind", ): 1, + Exports: 4, } ``` @@ -203,6 +212,13 @@ import { RouteKind } from "__TURBOPACK_PART__" assert { RouteKind["APP_ROUTE"] = "APP_ROUTE"; })(RouteKind || (RouteKind = {})); +``` +## Part 4 +```js +export { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export RouteKind" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md index ac5007085d28d..271f9598383b2 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `shared`, `random`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -216,19 +219,21 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("a", #2), "a"))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N7; + N2 --> N9; + N3 --> N9; N3 --> N7; N5 --> N4; N6 --> N5; @@ -239,6 +244,7 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; + N9 --> N7; ``` # Entrypoints @@ -248,6 +254,7 @@ graph TD Export( "order", ): 1, + Exports: 10, Export( "b", ): 3, @@ -286,21 +293,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -377,6 +380,33 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js @@ -400,6 +430,7 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, + Exports: 10, Export( "b", ): 3, @@ -438,21 +469,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -529,6 +556,33 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md index c20663c4e6941..32f1a2d2b41de 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md @@ -66,7 +66,7 @@ const shared = { - Declares: `shared` - Reads: `value`, `value2`, `value3` -- Write: `shared` +- Write: `shared`, `value`, `value2`, `value3` ## Item 7: Stmt 6, `Normal` @@ -90,7 +90,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 9: Stmt 8, `VarDeclarator(0)` @@ -104,7 +104,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -163,7 +163,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -205,7 +208,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -247,7 +253,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; Item10 --> Item1; @@ -260,8 +269,8 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(6, Normal)]"]; - N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(7, VarDeclarator(0))]"]; + N0["Items: [ItemId(ModuleEvaluation)]"]; + N1["Items: [ItemId(Export(("a", #2), "a"))]"]; N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(8, VarDeclarator(0))]"]; N3["Items: [ItemId(0, Normal)]"]; N4["Items: [ItemId(1, VarDeclarator(0))]"]; @@ -269,14 +278,18 @@ graph TD N6["Items: [ItemId(3, Normal)]"]; N7["Items: [ItemId(4, VarDeclarator(0))]"]; N8["Items: [ItemId(5, VarDeclarator(0))]"]; + N9["Items: [ItemId(6, Normal)]"]; + N10["Items: [ItemId(7, VarDeclarator(0))]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N6; N0 --> N7; - N0 --> N8; - N1 --> N8; + N0 --> N9; + N1 --> N10; + N2 --> N10; N2 --> N8; + N2 --> N9; N4 --> N3; N5 --> N3; N5 --> N4; @@ -290,12 +303,21 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N7; + N9 --> N8; + N9 --> N3; + N9 --> N4; + N9 --> N5; + N9 --> N6; + N9 --> N7; + N10 --> N8; + N10 --> N9; ``` # Entrypoints ``` { ModuleEvaluation: 0, + Exports: 11, Export( "b", ): 2, @@ -324,33 +346,31 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; "module evaluation"; -console.log(shared); ``` ## Part 1 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; export { b }; const b = { shared, @@ -446,8 +466,11 @@ export { shared } from "__TURBOPACK_VAR__" assert { }; ``` -## Merged (module eval) +## Part 9 ```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; @@ -463,11 +486,57 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +console.log(shared); + +``` +## Part 10 +```js import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -console.log(shared); ``` # Entrypoints @@ -475,6 +544,7 @@ console.log(shared); ``` { ModuleEvaluation: 0, + Exports: 10, Export( "b", ): 2, @@ -512,21 +582,17 @@ console.log(shared); ``` ## Part 1 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -624,6 +690,30 @@ export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md index ac5007085d28d..271f9598383b2 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `shared`, `random`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `a`, `shared` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `b`, `shared` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -216,19 +219,21 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("a", #2), "a"))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N7; + N2 --> N9; + N3 --> N9; N3 --> N7; N5 --> N4; N6 --> N5; @@ -239,6 +244,7 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; + N9 --> N7; ``` # Entrypoints @@ -248,6 +254,7 @@ graph TD Export( "order", ): 1, + Exports: 10, Export( "b", ): 3, @@ -286,21 +293,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -377,6 +380,33 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js @@ -400,6 +430,7 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, + Exports: 10, Export( "b", ): 3, @@ -438,21 +469,17 @@ export { order }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -529,6 +556,33 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 9 +```js +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md index c734bad84fb88..458f65fd2d252 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md @@ -88,6 +88,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 3, Export( "b", ): 2, @@ -121,6 +122,16 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js @@ -132,6 +143,7 @@ export { b } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, + Exports: 3, Export( "b", ): 2, @@ -165,6 +177,16 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md index bd41e8eaf0706..b9f46f6616847 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md @@ -130,6 +130,7 @@ graph TD ``` { ModuleEvaluation: 0, + Exports: 4, Export( "DOG", ): 1, @@ -181,6 +182,16 @@ export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; +export { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export CHIMERA" +}; + ``` ## Merged (module eval) ```js @@ -192,6 +203,7 @@ export { dog } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, + Exports: 4, Export( "DOG", ): 1, @@ -243,6 +255,16 @@ export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; +export { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export CHIMERA" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md index 7b1d2a8064a9b..bcac867d26d06 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md @@ -266,7 +266,7 @@ export const routeModule = new PagesRouteModule({ - Declares: `routeModule` - Reads: `PagesRouteModule`, `RouteKind`, `App`, `Document`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `routeModule`, `RouteKind`, `App`, `Document`, `userland` # Phase 1 ```mermaid @@ -438,6 +438,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -551,6 +563,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -664,6 +688,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -682,23 +718,22 @@ graph TD Item25 --> Item5; Item25 --> Item6; Item25 --> Item13; - Item26 --> Item13; ``` # Final ```mermaid graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; - N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; - N5["Items: [ItemId(Export(("config", #2), "config")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; - N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; - N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; - N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; - N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; - N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; - N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; + N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps"))]"]; + N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths"))]"]; + N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps"))]"]; + N5["Items: [ItemId(Export(("config", #2), "config"))]"]; + N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals"))]"]; + N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps"))]"]; + N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths"))]"]; + N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams"))]"]; + N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps"))]"]; + N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps"))]"]; N12["Items: [ItemId(Export(("routeModule", #2), "routeModule")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(17, VarDeclarator(0))]"]; N13["Items: [ItemId(0, ImportOfModule)]"]; N14["Items: [ItemId(1, ImportOfModule)]"]; @@ -707,6 +742,16 @@ graph TD N17["Items: [ItemId(4, ImportOfModule)]"]; N18["Items: [ItemId(5, ImportOfModule)]"]; N19["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(6, Normal)]"]; + N20["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; + N21["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N22["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; + N23["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; + N24["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; + N25["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; + N26["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; + N27["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; + N28["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; + N29["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N0 --> N13; N0 --> N14; N0 --> N15; @@ -715,17 +760,27 @@ graph TD N0 --> N18; N0 --> N19; N1 --> N19; - N2 --> N19; - N3 --> N19; - N4 --> N19; - N5 --> N19; - N6 --> N19; - N7 --> N19; - N8 --> N19; - N9 --> N19; - N10 --> N19; - N11 --> N19; + N2 --> N20; + N3 --> N21; + N4 --> N22; + N5 --> N23; + N6 --> N24; + N7 --> N25; + N8 --> N26; + N9 --> N27; + N10 --> N28; + N11 --> N29; + N12 --> N29; N12 --> N19; + N12 --> N20; + N12 --> N21; + N12 --> N22; + N12 --> N23; + N12 --> N24; + N12 --> N25; + N12 --> N26; + N12 --> N27; + N12 --> N28; N14 --> N13; N15 --> N13; N15 --> N14; @@ -741,12 +796,22 @@ graph TD N18 --> N15; N18 --> N16; N18 --> N17; + N19 --> N29; N19 --> N13; N19 --> N14; N19 --> N15; N19 --> N16; N19 --> N17; N19 --> N18; + N20 --> N29; + N21 --> N29; + N22 --> N29; + N23 --> N29; + N24 --> N29; + N25 --> N29; + N26 --> N29; + N27 --> N29; + N28 --> N29; ``` # Entrypoints @@ -780,6 +845,7 @@ graph TD Export( "unstable_getStaticProps", ): 7, + Exports: 30, Export( "default", ): 1, @@ -830,209 +896,119 @@ export { __TURBOPACK__default__export__ as default }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 }; export { getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 }; export { getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 4 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 }; export { getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 5 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 }; export { config }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { config } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 6 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 }; export { reportWebVitals }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 7 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 }; export { unstable_getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; export { unstable_getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 }; export { unstable_getStaticParams }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 10 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 }; export { unstable_getServerProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 11 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 }; export { unstable_getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 19 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; export { routeModule }; import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; import { RouteKind } from '../../server/future/route-kind'; @@ -1150,6 +1126,9 @@ import 'VAR_USERLAND'; ``` ## Part 19 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 13 }; @@ -1181,6 +1160,233 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticProps = hoist(userland, 'getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const config = hoist(userland, 'config'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { config } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 29 +```js +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 30 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; +export { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticProps" +}; +export { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticPaths" +}; +export { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getServerSideProps" +}; +export { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export config" +}; +export { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export reportWebVitals" +}; +export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticProps" +}; +export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticPaths" +}; +export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticParams" +}; +export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerProps" +}; +export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerSideProps" +}; +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; + ``` ## Merged (module eval) ```js @@ -1240,6 +1446,7 @@ import "__TURBOPACK_PART__" assert { Export( "unstable_getStaticProps", ): 7, + Exports: 20, Export( "default", ): 1, @@ -1641,6 +1848,46 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 20 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; +export { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticProps" +}; +export { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticPaths" +}; +export { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getServerSideProps" +}; +export { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export config" +}; +export { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export reportWebVitals" +}; +export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticProps" +}; +export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticPaths" +}; +export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticParams" +}; +export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerProps" +}; +export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerSideProps" +}; +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md index 867b54c937d69..a682a132f414d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,11 +334,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -362,9 +368,11 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; + N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; + N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -375,6 +383,7 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; + N10 --> N5; ``` # Entrypoints @@ -384,6 +393,7 @@ graph TD Export( "external1", ): 3, + Exports: 11, Export( "foo", ): 2, @@ -448,6 +458,9 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; function external1() { return internal() + foobar; @@ -468,6 +481,9 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -547,6 +563,9 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; function internal() { return upper(foobar); @@ -558,6 +577,22 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 11 +```js +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js @@ -590,6 +625,7 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, + Exports: 8, Export( "foo", ): 2, @@ -649,6 +685,9 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external1 }; import { upper } from "module"; function internal() { @@ -670,6 +709,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; export { external2 }; function external2() { foobar += "."; @@ -709,6 +751,22 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; +``` +## Part 8 +```js +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + ``` ## Merged (module eval) ```js @@ -735,6 +793,7 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, + Exports: 8, Export( "foo", ): 2, @@ -753,6 +812,9 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; export { external1 }; function internal() { @@ -780,6 +842,7 @@ export { external1 } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, + Exports: 8, Export( "foo", ): 2, @@ -798,6 +861,9 @@ export { external1 } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { upper } from "module"; export { external1 }; function internal() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md index 2324a75bfe17d..c36079b04971c 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md @@ -115,12 +115,13 @@ graph TD ``` { ModuleEvaluation: 0, - Export( - "effects", - ): 1, Export( "effect", ): 2, + Exports: 4, + Export( + "effects", + ): 1, } ``` @@ -164,6 +165,16 @@ export { effects } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effects" +}; +export { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effect" +}; + ``` ## Merged (module eval) ```js @@ -176,12 +187,13 @@ await Promise.resolve(); ``` { ModuleEvaluation: 0, - Export( - "effects", - ): 1, Export( "effect", ): 2, + Exports: 4, + Export( + "effects", + ): 1, } ``` @@ -222,6 +234,16 @@ export { effects } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 4 +```js +export { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effects" +}; +export { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effect" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js new file mode 100644 index 0000000000000..fd7505a005999 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js @@ -0,0 +1,10 @@ +import { NextResponse } from 'next/server' +import { ClientComponent } from '../../ClientComponent' +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent' + +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent, + }) +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md new file mode 100644 index 0000000000000..20fc2ac084576 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md @@ -0,0 +1,298 @@ +# Items + +Count: 9 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Declares: `ClientComponent` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Declares: `MyModuleClientComponent` + +## Item 7: Stmt 3, `Normal` + +```js +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} + +``` + +- Hoisted +- Declares: `GET` +- Reads (eventual): `NextResponse`, `ClientComponent`, `MyModuleClientComponent` +- Write: `GET` +- Write (eventual): `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; + Item8 --> Item1; + Item8 --> Item2; + Item8 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule), ItemId(2, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (dev) +## Part 0 +```js +"module evaluation"; +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from 'next/server'; +import { ClientComponent } from '../../ClientComponent'; +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 0, + Exports: 2, + Export( + "GET", + ): 1, +} +``` + + +# Modules (prod) +## Part 0 +```js +"module evaluation"; +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 1 +```js +export { GET }; +import { NextResponse } from 'next/server'; +import { ClientComponent } from '../../ClientComponent'; +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import 'next/server'; +import '../../ClientComponent'; +import 'my-module/MyModuleClientComponent'; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md index 052eb476d8e5f..28ecbdfae8a6a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md @@ -171,6 +171,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; ``` # Phase 4 @@ -207,6 +208,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; Item8 --> Item3; Item8 --> Item4; @@ -233,6 +235,7 @@ graph TD N1 --> N9; N1 --> N4; N2 --> N9; + N2 --> N4; N2 --> N1; N3 --> N8; N5 --> N4; @@ -255,6 +258,7 @@ graph TD Export( "order", ): 1, + Exports: 10, Export( "func", ): 2, @@ -299,6 +303,9 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; @@ -395,6 +402,19 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export func" +}; +export { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export shared" +}; + ``` ## Merged (module eval) ```js @@ -421,6 +441,7 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, + Exports: 10, Export( "func", ): 2, @@ -465,6 +486,9 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; export { func }; function func() { order.push("d"); @@ -558,6 +582,19 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); +``` +## Part 10 +```js +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export func" +}; +export { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export shared" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js index b496ad7226a0b..c719e831a0c35 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map index 8771340104287..76543693cb889 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG,qOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js similarity index 91% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js index d6d4fa4d32efa..61beca3561f02 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -150,12 +150,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; @@ -197,32 +199,16 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; ; -})()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { -"use strict"; - -__turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] -}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -"__TURBOPACK__ecmascript__hoisting__location__"; -; -; - })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__, - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ + "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__, + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; @@ -260,4 +246,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map index 20adfc3eda1b6..08028c332a04d 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map @@ -20,18 +20,16 @@ {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 165, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 177, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 198, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 219, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, - {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 162, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 167, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 184, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 200, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 215, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 220, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 239, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 244, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js similarity index 90% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js index 281bddcb7f575..0e8d24b6eaeed 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; @@ -188,36 +190,20 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; ; -})()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { -"use strict"; - -__turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] -}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -"__TURBOPACK__ecmascript__hoisting__location__"; -; -; - })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; "module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__.cat); +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__.cat); ; })()), @@ -233,4 +219,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map index a64d074b155f2..bd930bbd92dfd 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map @@ -18,16 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAI,GAAG"}}, - {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 226, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 231, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,8NAAI,GAAG"}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 217, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js index b829c74cc07a9..7bad58454328f 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map index 729da17d345fd..3156e34ae11ad 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map @@ -18,14 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG,6OAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 211, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, + {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js index 00dd5c50b44f6..388520019ef8a 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js @@ -141,12 +141,14 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map index 21f0e7a600376..f088827fe8299 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG,gPAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-wasm/src/module_asset.rs b/crates/turbopack-wasm/src/module_asset.rs index c357e7abaf597..da3381b6923e4 100644 --- a/crates/turbopack-wasm/src/module_asset.rs +++ b/crates/turbopack-wasm/src/module_asset.rs @@ -19,7 +19,6 @@ use turbopack_ecmascript::{ EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, references::async_module::OptionAsyncModule, - EcmascriptModuleAsset, }; use crate::{ @@ -62,24 +61,43 @@ impl WebAssemblyModuleAsset { } #[turbo_tasks::function] - async fn loader(&self) -> Result> { - let query = &*self.source.ident().query().await?; + async fn loader_as_module(self: Vc) -> Result>> { + let this = self.await?; + let query = &*this.source.ident().query().await?; let loader_source = if query == "?module" { - compiling_loader_source(self.source) + compiling_loader_source(this.source) } else { - instantiating_loader_source(self.source) + instantiating_loader_source(this.source) }; - let module = self.asset_context.process( + let module = this.asset_context.process( loader_source, Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(self.source, self.asset_context)), + "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(this.source, this.asset_context)), }))), ).module(); + Ok(module) + } + #[turbo_tasks::function] + async fn loader_as_resolve_origin(self: Vc) -> Result>> { + let module = self.loader_as_module(); + + let Some(esm_asset) = Vc::try_resolve_sidecast::>(module).await? + else { + bail!("WASM loader was not processed into an EcmascriptModuleAsset"); + }; + + Ok(esm_asset) + } + + #[turbo_tasks::function] + async fn loader(self: Vc) -> Result>> { + let module = self.loader_as_module(); + let Some(esm_asset) = - Vc::try_resolve_downcast_type::(module).await? + Vc::try_resolve_sidecast::>(module).await? else { bail!("WASM loader was not processed into an EcmascriptModuleAsset"); }; @@ -156,7 +174,7 @@ impl ResolveOrigin for WebAssemblyModuleAsset { #[turbo_tasks::function] fn get_inner_asset(self: Vc, request: Vc) -> Vc { - self.loader().get_inner_asset(request) + self.loader_as_resolve_origin().get_inner_asset(request) } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index 3eedd7243df0b..6e2570c972361 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -78,6 +78,7 @@ impl ModuleOptions { execution_context, ref rules, esm_url_rewrite_behavior, + special_exports, import_externals, ignore_dynamic_requests, use_swc_css, @@ -122,6 +123,7 @@ impl ModuleOptions { tree_shaking_mode, url_rewrite_behavior: esm_url_rewrite_behavior, import_externals, + special_exports, ignore_dynamic_requests, refresh, ..Default::default() diff --git a/crates/turbopack/src/module_options/module_options_context.rs b/crates/turbopack/src/module_options/module_options_context.rs index 0b4121f69cc6a..41cab2b11815a 100644 --- a/crates/turbopack/src/module_options/module_options_context.rs +++ b/crates/turbopack/src/module_options/module_options_context.rs @@ -141,6 +141,7 @@ pub struct ModuleOptionsContext { pub placeholder_for_future_extensions: (), pub tree_shaking_mode: Option, pub esm_url_rewrite_behavior: Option, + pub special_exports: Vc>, /// References to externals from ESM imports should use `import()` and make /// async modules. pub import_externals: bool, From a80b3cc78d52391454253df6b1d07d1236addf1c Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Wed, 17 Jul 2024 08:57:46 -0700 Subject: [PATCH 15/73] Rewrite IdFactory and IdFactoryWithReuse (#8769) ### Description The real goal here was to extend `IdFactory` to work with 64-bit ids, which I'll need soon for globally unique (and non-reusable) "execution ids" (#8771) to support the safety requirements of local uncached Vcs. I got a little carried away and essentially rewrote this: - (Debatable if this is an improvement or not) ID generation re-use requires an almost-but-not-entirely-free check of the concurrent queue, so it is now opt-in using the `IdFactoryWithReuse`. - ID generation is always performed with an AtomicU64 (which shouldn't really be any more or less expensive than AtomicU32 on 64 bit architectures). - u32 overflow detection is performed by using a `TryFrom` conversion from a NonZeroU64. Previously we could only detect and panic on the first id generated after overflow. Now we should detect and panic on (basically) all ids generated after overflow. - New versions of `concurrent-queue` make the `unbounded` constructor `const`, which allows us to eliminate the use of `Lazy`. - Add a unit test for overflow detection ### Testing Instructions ``` cargo nextest r -p turbo-tasks -p turbo-tasks-memory ``` --- Cargo.lock | 6 +- Cargo.toml | 2 +- .../turbo-tasks-memory/src/memory_backend.rs | 6 +- .../src/memory_backend_with_pg.rs | 6 +- crates/turbo-tasks/src/id.rs | 16 ++- crates/turbo-tasks/src/id_factory.rs | 104 +++++++++++++++--- crates/turbo-tasks/src/manager.rs | 8 +- crates/turbo-tasks/src/registry.rs | 4 +- crates/turbo-tasks/src/util.rs | 6 +- 9 files changed, 125 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16dc4aabb6387..8ea9451c639cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1537,9 +1537,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.1.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -11537,7 +11537,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.4.6", + "rand 0.8.5", "static_assertions", ] diff --git a/Cargo.toml b/Cargo.toml index 7879564321f06..a58e59a6f3613 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -226,7 +226,7 @@ camino = { version = "1.1.4", features = ["serde1"] } chrono = "0.4.23" clap = "4.5.2" clap_complete = "4.5.1" -concurrent-queue = "2.1.0" +concurrent-queue = "2.5.0" console = "0.15.5" console-subscriber = "0.1.8" criterion = "0.4.0" diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index cc2f973988ac9..eccfc45e044cb 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -25,7 +25,7 @@ use turbo_tasks::{ TransientTaskType, }, event::EventListener, - util::{IdFactory, NoMoveVec}, + util::{IdFactoryWithReuse, NoMoveVec}, CellId, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, Unused, }; @@ -45,7 +45,7 @@ fn prehash_task_type(task_type: PersistentTaskType) -> PreHashed, backend_jobs: NoMoveVec, - backend_job_id_factory: IdFactory, + backend_job_id_factory: IdFactoryWithReuse, task_cache: DashMap>, TaskId, BuildHasherDefault>, memory_limit: usize, @@ -65,7 +65,7 @@ impl MemoryBackend { Self { memory_tasks: NoMoveVec::new(), backend_jobs: NoMoveVec::new(), - backend_job_id_factory: IdFactory::new(), + backend_job_id_factory: IdFactoryWithReuse::new(), task_cache: DashMap::with_hasher_and_shard_amount( Default::default(), (std::thread::available_parallelism().map_or(1, usize::from) * 32) diff --git a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs b/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs index a8fa8104b8af2..19ee36169a778 100644 --- a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs +++ b/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs @@ -26,7 +26,7 @@ use turbo_tasks::{ ActivateResult, DeactivateResult, PersistResult, PersistTaskState, PersistedGraph, PersistedGraphApi, ReadTaskState, TaskCell, TaskData, }, - util::{IdFactory, NoMoveVec, SharedError}, + util::{IdFactoryWithReuse, NoMoveVec, SharedError}, CellId, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, Unused, }; @@ -131,7 +131,7 @@ pub struct MemoryBackendWithPersistedGraph { pub pg: P, tasks: NoMoveVec, cache: DashMap, - background_job_id_factory: IdFactory, + background_job_id_factory: IdFactoryWithReuse, background_jobs: NoMoveVec, only_known_to_memory_tasks: DashSet, /// Tasks that were selected to persist @@ -154,7 +154,7 @@ pub struct MemoryBackendWithPersistedGraph { impl MemoryBackendWithPersistedGraph

{ pub fn new(pg: P) -> Self { - let background_job_id_factory = IdFactory::new(); + let background_job_id_factory = IdFactoryWithReuse::new(); let persist_job = background_job_id_factory.get(); Self { pg, diff --git a/crates/turbo-tasks/src/id.rs b/crates/turbo-tasks/src/id.rs index 60d60725e786f..37b55723c3835 100644 --- a/crates/turbo-tasks/src/id.rs +++ b/crates/turbo-tasks/src/id.rs @@ -1,7 +1,7 @@ use std::{ fmt::{Debug, Display}, mem::transmute_copy, - num::NonZeroU32, + num::{NonZeroU32, NonZeroU64, TryFromIntError}, ops::Deref, }; @@ -17,6 +17,8 @@ macro_rules! define_id { } impl $name { + /// Constructs a wrapper type from the numeric identifier. + /// /// # Safety /// /// The passed `id` must not be zero. @@ -39,11 +41,23 @@ macro_rules! define_id { } } + /// Converts a numeric identifier to the wrapper type. + /// + /// Panics if the given id value is zero. impl From for $name { fn from(id: u32) -> Self { Self { id: NonZeroU32::new(id).expect("Ids can only be created from non zero values") } } } + + /// Converts a numeric identifier to the wrapper type. + impl TryFrom for $name { + type Error = TryFromIntError; + + fn try_from(id: NonZeroU64) -> Result { + Ok(Self { id: NonZeroU32::try_from(id)? }) + } + } }; ($name:ident) => { define_id!(internal $name); diff --git a/crates/turbo-tasks/src/id_factory.rs b/crates/turbo-tasks/src/id_factory.rs index 87203ff578c26..1abce319654b2 100644 --- a/crates/turbo-tasks/src/id_factory.rs +++ b/crates/turbo-tasks/src/id_factory.rs @@ -1,40 +1,96 @@ use std::{ + any::type_name, marker::PhantomData, - ops::Deref, - sync::atomic::{AtomicU32, Ordering}, + num::NonZeroU64, + sync::atomic::{AtomicU64, Ordering}, }; use concurrent_queue::ConcurrentQueue; -use once_cell::sync::Lazy; +/// A helper for constructing id types like [`FunctionId`][crate::FunctionId]. +/// +/// For ids that may be re-used, see [`IdFactoryWithReuse`]. pub struct IdFactory { - next_id: AtomicU32, - free_ids: Lazy>, - phantom_data: PhantomData, + next_id: AtomicU64, + _phantom_data: PhantomData, } -impl + Deref> Default for IdFactory { +impl IdFactory { + pub const fn new() -> Self { + Self { + next_id: AtomicU64::new(1), + _phantom_data: PhantomData, + } + } +} + +impl Default for IdFactory { fn default() -> Self { Self::new() } } -impl + Deref> IdFactory { +impl IdFactory +where + T: TryFrom, +{ + /// Return a unique new id. + /// + /// Panics (best-effort) if the id type overflows. + pub fn get(&self) -> T { + // Safety: u64 will not overflow. This is *very* unlikely to happen (would take + // decades). + let new_id = + unsafe { NonZeroU64::new_unchecked(self.next_id.fetch_add(1, Ordering::Relaxed)) }; + + // Use the extra bits of the AtomicU64 as cheap overflow detection when the + // value is less than 64 bits. + match new_id.try_into() { + Ok(id) => id, + Err(_) => panic!( + "Overflow detected while attempting to generate a unique {}", + type_name::(), + ), + } + } +} + +/// An [`IdFactory`], but extended with a free list to allow for id reuse for +/// ids such as [`BackendJobId`][crate::backend::BackendJobId]. +pub struct IdFactoryWithReuse { + factory: IdFactory, + free_ids: ConcurrentQueue, +} + +impl IdFactoryWithReuse { pub const fn new() -> Self { Self { - next_id: AtomicU32::new(1), - free_ids: Lazy::new(|| ConcurrentQueue::unbounded()), - phantom_data: PhantomData, + factory: IdFactory::new(), + free_ids: ConcurrentQueue::unbounded(), } } +} + +impl Default for IdFactoryWithReuse { + fn default() -> Self { + Self::new() + } +} +impl IdFactoryWithReuse +where + T: TryFrom, +{ + /// Return a new or potentially reused id. + /// + /// Panics (best-effort) if the id type overflows. pub fn get(&self) -> T { - if let Ok(id) = self.free_ids.pop() { - return id; - } - self.next_id.fetch_add(1, Ordering::Relaxed).into() + self.free_ids.pop().unwrap_or_else(|_| self.factory.get()) } + /// Add an id to the free list, allowing it to be re-used on a subsequent + /// call to [`IdFactoryWithReuse::get`]. + /// /// # Safety /// /// It must be ensured that the id is no longer used @@ -42,3 +98,21 @@ impl + Deref> IdFactory { let _ = self.free_ids.push(id); } } + +#[cfg(test)] +mod tests { + use std::num::NonZeroU8; + + use super::*; + + #[test] + #[should_panic(expected = "Overflow detected")] + fn test_overflow() { + let factory = IdFactory::::new(); + assert_eq!(factory.get(), NonZeroU8::new(1).unwrap()); + assert_eq!(factory.get(), NonZeroU8::new(2).unwrap()); + for _i in 2..256 { + factory.get(); + } + } +} diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index c179b871b5554..88ebb08acff09 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -28,7 +28,7 @@ use crate::{ capture_future::{self, CaptureFuture}, event::{Event, EventListener}, id::{BackendJobId, FunctionId, TraitTypeId}, - id_factory::IdFactory, + id_factory::IdFactoryWithReuse, raw_vc::{CellId, RawVc}, registry, trace::TraceRawVcs, @@ -133,7 +133,7 @@ pub trait TaskIdProvider { fn reuse_task_id(&self, id: Unused); } -impl TaskIdProvider for IdFactory { +impl TaskIdProvider for IdFactoryWithReuse { fn get_fresh_task_id(&self) -> Unused { // Safety: This is a fresh id from the factory unsafe { Unused::new_unchecked(self.get()) } @@ -234,7 +234,7 @@ pub struct UpdateInfo { pub struct TurboTasks { this: Weak, backend: B, - task_id_factory: IdFactory, + task_id_factory: IdFactoryWithReuse, stopped: AtomicBool, currently_scheduled_tasks: AtomicUsize, currently_scheduled_foreground_jobs: AtomicUsize, @@ -279,7 +279,7 @@ impl TurboTasks { // so we probably want to make sure that all tasks are joined // when trying to drop turbo tasks pub fn new(mut backend: B) -> Arc { - let task_id_factory = IdFactory::new(); + let task_id_factory = IdFactoryWithReuse::new(); backend.initialize(&task_id_factory); let this = Arc::new_cyclic(|this| Self { this: this.clone(), diff --git a/crates/turbo-tasks/src/registry.rs b/crates/turbo-tasks/src/registry.rs index df2f3f16a3201..04cc6e995c2ca 100644 --- a/crates/turbo-tasks/src/registry.rs +++ b/crates/turbo-tasks/src/registry.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, hash::Hash, ops::Deref}; +use std::{fmt::Debug, hash::Hash, num::NonZeroU64, ops::Deref}; use dashmap::{mapref::entry::Entry, DashMap}; use once_cell::sync::Lazy; @@ -30,7 +30,7 @@ static TRAIT_TYPES_BY_VALUE: Lazy> = static TRAIT_TYPES: Lazy> = Lazy::new(NoMoveVec::new); fn register_thing< - K: From + Deref + Sync + Send + Copy, + K: TryFrom + Deref + Sync + Send + Copy, V: Clone + Hash + Ord + Eq + Sync + Send + Copy, const INITIAL_CAPACITY_BITS: u32, >( diff --git a/crates/turbo-tasks/src/util.rs b/crates/turbo-tasks/src/util.rs index 7fdf45bf9dc20..8c05fccc829ca 100644 --- a/crates/turbo-tasks/src/util.rs +++ b/crates/turbo-tasks/src/util.rs @@ -14,7 +14,11 @@ use anyhow::{anyhow, Error}; use pin_project_lite::pin_project; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -pub use super::{id_factory::IdFactory, no_move_vec::NoMoveVec, once_map::*}; +pub use super::{ + id_factory::{IdFactory, IdFactoryWithReuse}, + no_move_vec::NoMoveVec, + once_map::*, +}; /// A error struct that is backed by an Arc to allow cloning errors #[derive(Debug, Clone)] From c9a626ef9f4a6077d7810a1be58f1fae0de816bb Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Wed, 17 Jul 2024 09:05:30 -0700 Subject: [PATCH 16/73] Add u64 ExecutionId type (#8771) ### Description The plan for task-local Vcs is to extend the `RawVc` type into: ``` enum RawVc { TaskOutput(TaskId), TaskCell(TaskId, CellId), LocalCell(ExecutionId, LocalCellId), // new variant! } ``` Where `ExecutionId` is a globally unique value representing the current task execution. That will be used with runtime safety checks to ensure that a given `LocalCellId` (which is an index into a task-local arena/vec) is valid upon read. https://www.notion.so/vercel/Resolved-Vcs-Vc-Lifetimes-Local-Vcs-and-Vc-Refcounts-49d666d3f9594017b5b312b87ddc5bff?pvs=4 This PR extends the `define_id` macro to support arbitrary integer types, and uses that to define `ExecutionId`. ### Testing Instructions ``` cargo nextest r -p turbo-tasks -p turbo-tasks-memory ``` --- crates/turbo-tasks/src/backend.rs | 2 +- crates/turbo-tasks/src/id.rs | 42 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index 1040b718121a3..5af52060a09b3 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -15,7 +15,7 @@ use auto_hash_map::AutoMap; use serde::{Deserialize, Serialize}; use tracing::Span; -pub use crate::id::BackendJobId; +pub use crate::id::{BackendJobId, ExecutionId}; use crate::{ event::EventListener, manager::TurboTasksBackendApi, raw_vc::CellId, registry, ConcreteTaskInput, FunctionId, RawVc, ReadRef, SharedReference, TaskId, TaskIdProvider, diff --git a/crates/turbo-tasks/src/id.rs b/crates/turbo-tasks/src/id.rs index 37b55723c3835..06fff1068d958 100644 --- a/crates/turbo-tasks/src/id.rs +++ b/crates/turbo-tasks/src/id.rs @@ -1,7 +1,7 @@ use std::{ fmt::{Debug, Display}, mem::transmute_copy, - num::{NonZeroU32, NonZeroU64, TryFromIntError}, + num::{NonZero, NonZeroU64, TryFromIntError}, ops::Deref, }; @@ -10,10 +10,10 @@ use serde::{de::Visitor, Deserialize, Serialize}; use crate::registry; macro_rules! define_id { - (internal $name:ident $(,$derive:ty)*) => { - #[derive(Hash, Clone, Copy, PartialEq, Eq, PartialOrd, Ord $(,$derive)*)] + ($name:ident : $primitive:ty $(,derive($($derive:ty),*))?) => { + #[derive(Hash, Clone, Copy, PartialEq, Eq, PartialOrd, Ord $($(,$derive)*)? )] pub struct $name { - id: NonZeroU32, + id: NonZero<$primitive>, } impl $name { @@ -22,8 +22,8 @@ macro_rules! define_id { /// # Safety /// /// The passed `id` must not be zero. - pub unsafe fn new_unchecked(id: u32) -> Self { - Self { id: unsafe { NonZeroU32::new_unchecked(id) } } + pub unsafe fn new_unchecked(id: $primitive) -> Self { + Self { id: unsafe { NonZero::<$primitive>::new_unchecked(id) } } } } @@ -34,7 +34,7 @@ macro_rules! define_id { } impl Deref for $name { - type Target = u32; + type Target = $primitive; fn deref(&self) -> &Self::Target { unsafe { transmute_copy(&&self.id) } @@ -44,9 +44,12 @@ macro_rules! define_id { /// Converts a numeric identifier to the wrapper type. /// /// Panics if the given id value is zero. - impl From for $name { - fn from(id: u32) -> Self { - Self { id: NonZeroU32::new(id).expect("Ids can only be created from non zero values") } + impl From<$primitive> for $name { + fn from(id: $primitive) -> Self { + Self { + id: NonZero::<$primitive>::new(id) + .expect("Ids can only be created from non zero values") + } } } @@ -55,23 +58,18 @@ macro_rules! define_id { type Error = TryFromIntError; fn try_from(id: NonZeroU64) -> Result { - Ok(Self { id: NonZeroU32::try_from(id)? }) + Ok(Self { id: NonZero::try_from(id)? }) } } }; - ($name:ident) => { - define_id!(internal $name); - }; - ($name:ident, derive($($derive:ty),*)) => { - define_id!(internal $name $(,$derive)*); - }; } -define_id!(TaskId); -define_id!(FunctionId); -define_id!(ValueTypeId); -define_id!(TraitTypeId); -define_id!(BackendJobId); +define_id!(TaskId: u32); +define_id!(FunctionId: u32); +define_id!(ValueTypeId: u32); +define_id!(TraitTypeId: u32); +define_id!(BackendJobId: u32); +define_id!(ExecutionId: u64, derive(Debug)); impl Debug for TaskId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { From 5d47dbe56a52cf50f9fa22b66f6753d688b7d997 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Wed, 17 Jul 2024 13:39:11 -0400 Subject: [PATCH 17/73] chore(turborepo): refine package.json parse error (#8753) ### Description Show a proper diagnostic for a parse error in the package.json file, with a path to the file. ### Testing Instructions added a test in `invalid-package-json.t` --- crates/turborepo-errors/src/lib.rs | 17 +++++++---- crates/turborepo-lib/src/run/error.rs | 2 ++ .../src/package_graph/builder.rs | 6 ++-- .../turborepo-repository/src/package_json.rs | 13 +++++---- .../integration/tests/bad-turbo-json.t | 29 +++++++++---------- .../integration/tests/invalid-package-json.t | 16 ++++++++++ 6 files changed, 55 insertions(+), 28 deletions(-) diff --git a/crates/turborepo-errors/src/lib.rs b/crates/turborepo-errors/src/lib.rs index 45b3236fec0e2..701d0ba704f5d 100644 --- a/crates/turborepo-errors/src/lib.rs +++ b/crates/turborepo-errors/src/lib.rs @@ -17,7 +17,7 @@ pub const TURBO_SITE: &str = "https://turbo.build"; pub struct ParseDiagnostic { message: String, #[source_code] - source_code: String, + source_code: NamedSource, #[label] label: Option, } @@ -34,12 +34,19 @@ impl From for ParseDiagnostic { fn from(diagnostic: biome_diagnostics::Error) -> Self { let location = diagnostic.location(); let message = BiomeMessage(&diagnostic).to_string(); + let path = location + .resource + .and_then(|r| r.as_file().map(|p| p.to_string())) + .unwrap_or_default(); Self { message, - source_code: location - .source_code - .map(|s| s.text.to_string()) - .unwrap_or_default(), + source_code: NamedSource::new( + path, + location + .source_code + .map(|s| s.text.to_string()) + .unwrap_or_default(), + ), label: location.span.map(|span| { let start: usize = span.start().into(); let len: usize = span.len().into(); diff --git a/crates/turborepo-lib/src/run/error.rs b/crates/turborepo-lib/src/run/error.rs index 59b3fa612ef03..aca34ea786df5 100644 --- a/crates/turborepo-lib/src/run/error.rs +++ b/crates/turborepo-lib/src/run/error.rs @@ -26,6 +26,7 @@ pub enum Error { #[error(transparent)] Opts(#[from] opts::Error), #[error(transparent)] + #[diagnostic(transparent)] PackageJson(#[from] turborepo_repository::package_json::Error), #[error(transparent)] PackageManager(#[from] turborepo_repository::package_manager::Error), @@ -33,6 +34,7 @@ pub enum Error { #[diagnostic(transparent)] Config(#[from] config::Error), #[error(transparent)] + #[diagnostic(transparent)] PackageGraphBuilder(#[from] package_graph::builder::Error), #[error(transparent)] DaemonConnector(#[from] daemon::DaemonConnectorError), diff --git a/crates/turborepo-repository/src/package_graph/builder.rs b/crates/turborepo-repository/src/package_graph/builder.rs index 68d8fa4a90446..c7b068009b0b7 100644 --- a/crates/turborepo-repository/src/package_graph/builder.rs +++ b/crates/turborepo-repository/src/package_graph/builder.rs @@ -3,6 +3,7 @@ use std::{ collections::{BTreeMap, HashMap, HashSet}, }; +use miette::Diagnostic; use petgraph::graph::{Graph, NodeIndex}; use tracing::{warn, Instrument}; use turbopath::{ @@ -33,7 +34,7 @@ pub struct PackageGraphBuilder<'a, T> { package_discovery: T, } -#[derive(Debug, thiserror::Error)] +#[derive(Debug, Diagnostic, thiserror::Error)] pub enum Error { #[error("could not resolve workspaces: {0}")] PackageManager( @@ -51,7 +52,8 @@ pub enum Error { }, #[error("path error: {0}")] Path(#[from] turbopath::PathError), - #[error("unable to parse workspace package.json: {0}")] + #[diagnostic(transparent)] + #[error(transparent)] PackageJson(#[from] crate::package_json::Error), #[error("package.json must have a name field:\n{0}")] PackageJsonMissingName(AbsoluteSystemPathBuf), diff --git a/crates/turborepo-repository/src/package_json.rs b/crates/turborepo-repository/src/package_json.rs index d58cea285b1c5..61de1d3fedde0 100644 --- a/crates/turborepo-repository/src/package_json.rs +++ b/crates/turborepo-repository/src/package_json.rs @@ -144,10 +144,8 @@ impl PackageJson { pub fn load_from_str(contents: &str, path: &str) -> Result { let (result, errors): (Option, _) = deserialize_from_json_str(contents, JsonParserOptions::default(), path).consume(); - - match result { - Some(package_json) => Ok(package_json.into()), - None => Err(Error::Parse( + if !errors.is_empty() { + return Err(Error::Parse( errors .into_iter() .map(|d| { @@ -156,8 +154,13 @@ impl PackageJson { .into() }) .collect(), - )), + )); } + + // We expect a result if there are no errors + Ok(result + .expect("no parse errors produced but no result") + .into()) } // Utility method for easy construction of package.json during testing diff --git a/turborepo-tests/integration/tests/bad-turbo-json.t b/turborepo-tests/integration/tests/bad-turbo-json.t index a4fa50b02cf24..6ecaf31c3f7b1 100644 --- a/turborepo-tests/integration/tests/bad-turbo-json.t +++ b/turborepo-tests/integration/tests/bad-turbo-json.t @@ -5,23 +5,22 @@ Add turbo.json with unnecessary package task syntax to a package $ . ${TESTDIR}/../../helpers/replace_turbo_json.sh $(pwd)/apps/my-app "package-task.json" Run build with package task in non-root turbo.json - $ ${TURBO} build + $ ${TURBO} build | sed 's/\[\([^]]*\)\]/\(\1)/g' x invalid turbo json Error: unnecessary_package_task_syntax (https://turbo.build/messages/unnecessary-package-task-syntax) x "my-app#build". Use "build" instead - ,-\[apps[\\/]my-app[\\/]turbo.json:7:1\] (re) + ,-\(apps[\\/]my-app[\\/]turbo.json:7:1\) (re) 7 | // this comment verifies that turbo can read .json files with comments 8 | ,-> "my-app#build": { - 9 | | "outputs": ["banana.txt", "apple.json"], - 10 | | "inputs": ["$TURBO_DEFAULT$", ".env.local"] + 9 | | "outputs": ("banana.txt", "apple.json"), + 10 | | "inputs": ("$TURBO_DEFAULT$", ".env.local") 11 | |-> } : `---- unnecessary package syntax found here 12 | } `---- - [1] @@ -33,29 +32,28 @@ Use our custom turbo config with an invalid env var $ . ${TESTDIR}/../../helpers/replace_turbo_json.sh $(pwd) "invalid-env-var.json" Run build with invalid env var - $ ${TURBO} build + $ ${TURBO} build | sed 's/\[\([^]]*\)\]/\(\1)/g' invalid_env_prefix (https://turbo.build/messages/invalid-env-prefix) x Environment variables should not be prefixed with "$" - ,-[turbo.json:6:1] + ,-\(turbo.json:6:1\) (re) 6 | "build": { - 7 | "env": ["NODE_ENV", "$FOOBAR"], + 7 | "env": ("NODE_ENV", "$FOOBAR"), : ^^^^|^^^^ : `-- variable with invalid prefix declared here - 8 | "outputs": [] + 8 | "outputs": () `---- - [1] Run in single package mode even though we have a task with package syntax - $ ${TURBO} build --single-package + $ ${TURBO} build --single-package | sed 's/\[\([^]]*\)\]/\(\1)/g' package_task_in_single_package_mode (https://turbo.build/messages/package-task-in-single-package-mode) x Package tasks (#) are not allowed in single-package | repositories: found //#something - ,-[turbo.json:16:1] + ,-(turbo.json:16:1) 16 | "something": {}, 17 | "//#something": {}, : ^| @@ -63,7 +61,6 @@ Run in single package mode even though we have a task with package syntax 18 | `---- - [1] @@ -77,21 +74,21 @@ Run build with syntax errors in turbo.json x failed to parse turbo json Error: x Expected a property but instead found ','. - ,-[1:1] + ,-[turbo.json:1:1] 1 | { 2 | "$schema": "https://turbo.build/schema.json",, : ^ 3 | "globalDependencies": ["foo.txt"], `---- Error: x expected `,` but instead found `42` - ,-[11:1] + ,-[turbo.json:11:1] 11 | "my-app#build": { 12 | "outputs": ["banana.txt", "apple.json"]42, : ^^ 13 | "inputs": [".env.local" `---- Error: x expected `,` but instead found `}` - ,-[13:1] + ,-[turbo.json:13:1] 13 | "inputs": [".env.local" 14 | }, : ^ diff --git a/turborepo-tests/integration/tests/invalid-package-json.t b/turborepo-tests/integration/tests/invalid-package-json.t index 160e4ca8d33ca..de27f0df1066f 100644 --- a/turborepo-tests/integration/tests/invalid-package-json.t +++ b/turborepo-tests/integration/tests/invalid-package-json.t @@ -7,3 +7,19 @@ Build should fail due to missing name field $ ${TURBO} build 1> ERR [1] $ grep -F --quiet 'x package.json must have a name field:' ERR + +Add a trailing comma + $ echo "{ \"name\": \"foobar\", }" > package.json.new + $ mv package.json.new apps/my-app/package.json +Build should fail due to trailing comma (sed replaces square brackets with parentheses) + $ ${TURBO} build 2>&1 | sed 's/\[\([^]]*\)\]/\(\1)/g' + package_json_parse_error + + x unable to parse package.json + + Error: x Expected a property but instead found '}'. + ,-\(.*package.json:1:1\) (re) + 1 | { "name": "foobar", } + : ^ + `---- + From 1d6adcb5ec60f670267114dc71780d8d37240b79 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 17 Jul 2024 23:07:14 +0200 Subject: [PATCH 18/73] turbo-tasks this calls (#8735) ### Description Make this argument in turbo-tasks function calls explicit ### Testing Instructions --- crates/turbo-tasks-macros/src/func.rs | 131 ++++++--- .../turbo-tasks-macros/src/function_macro.rs | 6 +- crates/turbo-tasks-macros/src/lib.rs | 7 + .../src/value_impl_macro.rs | 2 + .../src/value_trait_macro.rs | 7 +- .../turbo-tasks-memory/src/memory_backend.rs | 35 ++- crates/turbo-tasks-memory/src/task.rs | 42 ++- crates/turbo-tasks-memory/tests/call_types.rs | 184 ++++++++++++ crates/turbo-tasks-testing/src/lib.rs | 34 ++- crates/turbo-tasks/src/backend.rs | 271 ++++++++++++------ crates/turbo-tasks/src/lib.rs | 9 +- crates/turbo-tasks/src/manager.rs | 110 ++++++- crates/turbo-tasks/src/native_function.rs | 24 +- crates/turbo-tasks/src/raw_vc.rs | 7 + .../src/task/concrete_task_input.rs | 72 +---- crates/turbo-tasks/src/task/function.rs | 172 ++++++++--- crates/turbo-tasks/src/task/mod.rs | 4 +- crates/turbo-tasks/src/trait_helpers.rs | 32 +++ crates/turbo-tasks/src/value_type.rs | 6 + 19 files changed, 878 insertions(+), 277 deletions(-) create mode 100644 crates/turbo-tasks-memory/tests/call_types.rs create mode 100644 crates/turbo-tasks/src/trait_helpers.rs diff --git a/crates/turbo-tasks-macros/src/func.rs b/crates/turbo-tasks-macros/src/func.rs index a02eb175ae06b..3e1a414cfa065 100644 --- a/crates/turbo-tasks-macros/src/func.rs +++ b/crates/turbo-tasks-macros/src/func.rs @@ -14,6 +14,7 @@ pub struct TurboFn { // block: Block, ident: Ident, output: Type, + this: Option, inputs: Vec, } @@ -56,6 +57,7 @@ impl TurboFn { } let mut raw_inputs = original_signature.inputs.iter(); + let mut this = None; let mut inputs = Vec::with_capacity(raw_inputs.len()); if let Some(possibly_receiver) = raw_inputs.next() { @@ -142,7 +144,7 @@ impl TurboFn { _ => {} } - inputs.push(Input { + this = Some(Input { ident: Ident::new("self", self_token.span()), ty: parse_quote! { turbo_tasks::Vc }, }); @@ -160,7 +162,7 @@ impl TurboFn { return None; } - let ident = if let Pat::Ident(ident) = &*typed.pat { + if let Pat::Ident(ident) = &*typed.pat { if ident.ident == "self" { if let DefinitionContext::NakedFn { .. } = definition_context { // The function is not associated. The compiler will emit an error @@ -174,6 +176,13 @@ impl TurboFn { // if the user provided an invalid receiver type // when // calling `into_concrete`. + + let ident = ident.ident.clone(); + + this = Some(Input { + ident, + ty: parse_quote! { turbo_tasks::Vc }, + }); } else { match definition_context { DefinitionContext::NakedFn { .. } @@ -192,18 +201,22 @@ impl TurboFn { return None; } } - } + let ident = ident.ident.clone(); - ident.ident.clone() + inputs.push(Input { + ident, + ty: (*typed.ty).clone(), + }); + } } else { // We can't support destructuring patterns (or other kinds of patterns). - Ident::new("arg1", typed.pat.span()) - }; + let ident = Ident::new("arg1", typed.pat.span()); - inputs.push(Input { - ident, - ty: (*typed.ty).clone(), - }); + inputs.push(Input { + ident, + ty: (*typed.ty).clone(), + }); + } } } } @@ -234,6 +247,7 @@ impl TurboFn { Some(TurboFn { ident: original_signature.ident.clone(), output, + this, inputs, }) } @@ -242,8 +256,10 @@ impl TurboFn { /// converted to a standard turbo_tasks function signature. pub fn signature(&self) -> Signature { let exposed_inputs: Punctuated<_, Token![,]> = self - .inputs - .iter() + .this + .as_ref() + .into_iter() + .chain(self.inputs.iter()) .map(|input| { FnArg::Typed(PatType { attrs: Default::default(), @@ -288,21 +304,38 @@ impl TurboFn { .collect() } + fn converted_this(&self) -> Option { + self.this.as_ref().map(|Input { ty: _, ident }| { + parse_quote! { + turbo_tasks::Vc::into_raw(#ident) + } + }) + } + /// The block of the exposed function for a dynamic dispatch call to the /// given trait. pub fn dynamic_block(&self, trait_type_id_ident: &Ident) -> Block { let ident = &self.ident; let output = &self.output; - let converted_inputs = self.converted_inputs(); - parse_quote! { - { - <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( - turbo_tasks::trait_call( - *#trait_type_id_ident, - std::borrow::Cow::Borrowed(stringify!(#ident)), - vec![#converted_inputs], + if let Some(converted_this) = self.converted_this() { + let converted_inputs = self.converted_inputs(); + parse_quote! { + { + <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( + turbo_tasks::trait_call( + *#trait_type_id_ident, + std::borrow::Cow::Borrowed(stringify!(#ident)), + #converted_this, + vec![#converted_inputs], + ) ) - ) + } + } + } else { + parse_quote! { + { + unimplemented!("trait methods without self are not yet supported") + } } } } @@ -312,17 +345,35 @@ impl TurboFn { pub fn static_block(&self, native_function_id_ident: &Ident) -> Block { let output = &self.output; let converted_inputs = self.converted_inputs(); - parse_quote! { - { - <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( - turbo_tasks::dynamic_call( - *#native_function_id_ident, - vec![#converted_inputs], + if let Some(converted_this) = self.converted_this() { + parse_quote! { + { + <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( + turbo_tasks::dynamic_this_call( + *#native_function_id_ident, + #converted_this, + vec![#converted_inputs], + ) ) - ) + } + } + } else { + parse_quote! { + { + <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( + turbo_tasks::dynamic_call( + *#native_function_id_ident, + vec![#converted_inputs], + ) + ) + } } } } + + pub(crate) fn is_method(&self) -> bool { + self.this.is_some() + } } fn return_type_to_type(return_type: &ReturnType) -> Type { @@ -454,13 +505,15 @@ impl DefinitionContext { pub struct NativeFn { function_path_string: String, function_path: ExprPath, + is_method: bool, } impl NativeFn { - pub fn new(function_path_string: &str, function_path: &ExprPath) -> NativeFn { + pub fn new(function_path_string: &str, function_path: &ExprPath, is_method: bool) -> NativeFn { NativeFn { function_path_string: function_path_string.to_owned(), function_path: function_path.clone(), + is_method, } } @@ -472,13 +525,23 @@ impl NativeFn { let Self { function_path_string, function_path, + is_method, } = self; - parse_quote! { - turbo_tasks::macro_helpers::Lazy::new(|| { - #[allow(deprecated)] - turbo_tasks::NativeFunction::new(#function_path_string.to_owned(), #function_path) - }) + if *is_method { + parse_quote! { + turbo_tasks::macro_helpers::Lazy::new(|| { + #[allow(deprecated)] + turbo_tasks::NativeFunction::new_method(#function_path_string.to_owned(), #function_path) + }) + } + } else { + parse_quote! { + turbo_tasks::macro_helpers::Lazy::new(|| { + #[allow(deprecated)] + turbo_tasks::NativeFunction::new_function(#function_path_string.to_owned(), #function_path) + }) + } } } diff --git a/crates/turbo-tasks-macros/src/function_macro.rs b/crates/turbo-tasks-macros/src/function_macro.rs index 4d805de9ad711..4c047d0e067a5 100644 --- a/crates/turbo-tasks-macros/src/function_macro.rs +++ b/crates/turbo-tasks-macros/src/function_macro.rs @@ -30,7 +30,11 @@ pub fn function(_args: TokenStream, input: TokenStream) -> TokenStream { let mut inline_signature = sig.clone(); inline_signature.ident = inline_function_ident; - let native_fn = NativeFn::new(&ident.to_string(), &inline_function_path); + let native_fn = NativeFn::new( + &ident.to_string(), + &inline_function_path, + turbo_fn.is_method(), + ); let native_function_ident = get_native_function_ident(ident); let native_function_ty = native_fn.ty(); let native_function_def = native_fn.definition(); diff --git a/crates/turbo-tasks-macros/src/lib.rs b/crates/turbo-tasks-macros/src/lib.rs index b7a0e3bcca25c..092eeb151b552 100644 --- a/crates/turbo-tasks-macros/src/lib.rs +++ b/crates/turbo-tasks-macros/src/lib.rs @@ -166,6 +166,13 @@ pub fn function(args: TokenStream, input: TokenStream) -> TokenStream { function_macro::function(args, input) } +#[allow_internal_unstable(min_specialization, into_future, trivial_bounds)] +#[proc_macro_error] +#[proc_macro_attribute] +pub fn test_tt(_args: TokenStream, input: TokenStream) -> TokenStream { + derive::derive_value_debug(input) +} + #[allow_internal_unstable(min_specialization, into_future, trivial_bounds)] #[proc_macro_error] #[proc_macro_attribute] diff --git a/crates/turbo-tasks-macros/src/value_impl_macro.rs b/crates/turbo-tasks-macros/src/value_impl_macro.rs index fc8773b79226a..235268169d125 100644 --- a/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -120,6 +120,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { let native_fn = NativeFn::new( &format!("{ty}::{ident}", ty = ty.to_token_stream()), &inline_function_path, + turbo_fn.is_method(), ); let native_function_ident = get_inherent_impl_function_ident(ty_ident, ident); @@ -225,6 +226,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { trait_path = trait_path.to_token_stream() ), &inline_function_path, + turbo_fn.is_method(), ); let native_function_ident = diff --git a/crates/turbo-tasks-macros/src/value_trait_macro.rs b/crates/turbo-tasks-macros/src/value_trait_macro.rs index 23ee201369b1f..931c26e69944d 100644 --- a/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -108,8 +108,11 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { let mut inline_signature = sig.clone(); inline_signature.ident = inline_function_ident; - let native_function = - NativeFn::new(&format!("{trait_ident}::{ident}"), &inline_function_path); + let native_function = NativeFn::new( + &format!("{trait_ident}::{ident}"), + &inline_function_path, + turbo_fn.is_method(), + ); let native_function_ident = get_trait_default_impl_function_ident(trait_ident, ident); let native_function_ty = native_function.ty(); diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index eccfc45e044cb..404a43f5a7a08 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -545,12 +545,25 @@ impl Backend for MemoryBackend { { // fast pass without creating a new task self.task_statistics().map(|stats| match &*task_type { - PersistentTaskType::ResolveNative(function_id, ..) - | PersistentTaskType::Native(function_id, ..) => { + PersistentTaskType::ResolveNative { + fn_type: function_id, + this: _, + args: _, + } + | PersistentTaskType::Native { + fn_type: function_id, + this: _, + args: _, + } => { stats.increment_cache_hit(*function_id); } - PersistentTaskType::ResolveTrait(trait_type, name, inputs) => { - // HACK: Resolve the first argument (`self`) in order to attribute the cache hit + PersistentTaskType::ResolveTrait { + trait_type, + method_name: name, + this, + args: _, + } => { + // HACK: Resolve the this argument (`self`) in order to attribute the cache hit // to the concrete trait implementation, rather than the dynamic trait method. // This ensures cache hits and misses are both attributed to the same thing. // @@ -565,10 +578,7 @@ impl Backend for MemoryBackend { // ResolveTrait tasks. let trait_type = *trait_type; let name = name.clone(); - let this = inputs - .first() - .cloned() - .expect("No arguments for trait call"); + let this = *this; let stats = Arc::clone(stats); turbo_tasks.run_once(Box::pin(async move { let function_id = @@ -582,10 +592,15 @@ impl Backend for MemoryBackend { task } else { self.task_statistics().map(|stats| match &*task_type { - PersistentTaskType::Native(function_id, ..) => { + PersistentTaskType::Native { + fn_type: function_id, + this: _, + args: _, + } => { stats.increment_cache_miss(*function_id); } - PersistentTaskType::ResolveTrait(..) | PersistentTaskType::ResolveNative(..) => { + PersistentTaskType::ResolveTrait { .. } + | PersistentTaskType::ResolveNative { .. } => { // these types re-execute themselves as `Native` after // resolving their arguments, skip counting their // executions here to avoid double-counting diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 8e508e42b6ac2..af0b69892707c 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -584,17 +584,30 @@ impl Task { TaskTypeForDescription::Root => format!("[{}] root", id), TaskTypeForDescription::Once => format!("[{}] once", id), TaskTypeForDescription::Persistent(ty) => match &***ty { - PersistentTaskType::Native(native_fn, _) => { + PersistentTaskType::Native { + fn_type: native_fn, + this: _, + args: _, + } => { format!("[{}] {}", id, registry::get_function(*native_fn).name) } - PersistentTaskType::ResolveNative(native_fn, _) => { + PersistentTaskType::ResolveNative { + fn_type: native_fn, + this: _, + args: _, + } => { format!( "[{}] [resolve] {}", id, registry::get_function(*native_fn).name ) } - PersistentTaskType::ResolveTrait(trait_type, fn_name, _) => { + PersistentTaskType::ResolveTrait { + trait_type, + method_name: fn_name, + this: _, + args: _, + } => { format!( "[{}] [resolve trait] {} in trait {}", id, @@ -741,16 +754,24 @@ impl Task { tracing::trace_span!("turbo_tasks::once_task"), ), TaskType::Persistent { ty, .. } => match &***ty { - PersistentTaskType::Native(native_fn, inputs) => { + PersistentTaskType::Native { + fn_type: native_fn, + this, + args: inputs, + } => { let func = registry::get_function(*native_fn); let span = func.span(); let entered = span.enter(); - let bound_fn = func.bind(inputs); + let bound_fn = func.bind(*this, inputs); let future = bound_fn(); drop(entered); (future, span) } - PersistentTaskType::ResolveNative(ref native_fn_id, inputs) => { + PersistentTaskType::ResolveNative { + fn_type: ref native_fn_id, + this, + args: inputs, + } => { let native_fn_id = *native_fn_id; let func = registry::get_function(native_fn_id); let span = func.resolve_span(); @@ -759,13 +780,19 @@ impl Task { let turbo_tasks = turbo_tasks.pin(); let future = Box::pin(PersistentTaskType::run_resolve_native( native_fn_id, + *this, inputs, turbo_tasks, )); drop(entered); (future, span) } - PersistentTaskType::ResolveTrait(trait_type_id, name, inputs) => { + PersistentTaskType::ResolveTrait { + trait_type: trait_type_id, + method_name: name, + this, + args: inputs, + } => { let trait_type_id = *trait_type_id; let trait_type = registry::get_trait(trait_type_id); let span = trait_type.resolve_span(name); @@ -776,6 +803,7 @@ impl Task { let future = Box::pin(PersistentTaskType::run_resolve_trait( trait_type_id, name, + *this, inputs, turbo_tasks, )); diff --git a/crates/turbo-tasks-memory/tests/call_types.rs b/crates/turbo-tasks-memory/tests/call_types.rs new file mode 100644 index 0000000000000..c5e2d7f3168ea --- /dev/null +++ b/crates/turbo-tasks-memory/tests/call_types.rs @@ -0,0 +1,184 @@ +#![feature(arbitrary_self_types)] + +use anyhow::Result; +use turbo_tasks::Vc; +use turbo_tasks_testing::{register, run}; + +register!(); + +#[tokio::test] +async fn functions() { + run! { + assert_eq!(*fn_plain().await?, 42); + assert_eq!(*fn_arg(43).await?, 43); + assert_eq!(*fn_vc_arg(Vc::cell(44)).await?, 44); + assert_eq!(*async_fn_plain().await?, 42); + assert_eq!(*async_fn_arg(43).await?, 43); + assert_eq!(*async_fn_vc_arg(Vc::cell(44)).await?, 44); + } +} + +#[turbo_tasks::function] +fn fn_plain() -> Vc { + Vc::cell(42) +} + +#[turbo_tasks::function] +fn fn_arg(n: u32) -> Vc { + Vc::cell(n) +} + +#[turbo_tasks::function] +fn fn_vc_arg(n: Vc) -> Vc { + n +} + +#[turbo_tasks::function] +async fn async_fn_plain() -> Result> { + Ok(Vc::cell(42)) +} + +#[turbo_tasks::function] +async fn async_fn_arg(n: u32) -> Result> { + Ok(Vc::cell(n)) +} + +#[turbo_tasks::function] +async fn async_fn_vc_arg(n: Vc) -> Result> { + Ok(Vc::cell(*n.await?)) +} + +#[tokio::test] +async fn methods() { + run! { + assert_eq!(*Value::static_method().await?, 42); + assert_eq!(*Value::async_static_method().await?, 42); + + let value = Value(43).cell(); + assert_eq!(*value.method().await?, 43); + assert_eq!(*value.async_method().await?, 43); + assert_eq!(*value.vc_method().await?, 42); + assert_eq!(*value.async_vc_method().await?, 43); + } +} + +#[turbo_tasks::value] +struct Value(u32); + +#[turbo_tasks::value_impl] +impl Value { + #[turbo_tasks::function] + fn static_method() -> Vc { + Vc::cell(42) + } + + #[turbo_tasks::function] + async fn async_static_method() -> Result> { + Ok(Vc::cell(42)) + } + + #[turbo_tasks::function] + fn method(&self) -> Vc { + Vc::cell(self.0) + } + + #[turbo_tasks::function] + async fn async_method(&self) -> Result> { + Ok(Vc::cell(self.0)) + } + + #[turbo_tasks::function] + fn vc_method(self: Vc) -> Vc { + Vc::cell(42) + } + + #[turbo_tasks::function] + async fn async_vc_method(self: Vc) -> Result> { + Ok(Vc::cell(self.await?.0)) + } +} + +#[tokio::test] +async fn trait_methods() { + run! { + assert_eq!(*Value::static_trait_method().await?, 42); + assert_eq!(*Value::async_static_trait_method().await?, 42); + + let value = Value(43).cell(); + assert_eq!(*value.trait_method().await?, 43); + assert_eq!(*value.async_trait_method().await?, 43); + assert_eq!(*value.default_trait_method().await?, 42); + assert_eq!(*value.default_async_trait_method().await?, 42); + + let trait_value: Vc> = Vc::upcast(value); + assert_eq!(*trait_value.trait_method().await?, 43); + assert_eq!(*trait_value.async_trait_method().await?, 43); + assert_eq!(*trait_value.default_trait_method().await?, 42); + assert_eq!(*trait_value.default_async_trait_method().await?, 42); + + let value = wrap_value(value); + assert_eq!(*value.trait_method().await?, 43); + assert_eq!(*value.async_trait_method().await?, 43); + assert_eq!(*value.default_trait_method().await?, 42); + assert_eq!(*value.default_async_trait_method().await?, 42); + + let trait_value = wrap_trait_value(trait_value); + assert_eq!(*trait_value.trait_method().await?, 43); + assert_eq!(*trait_value.async_trait_method().await?, 43); + assert_eq!(*trait_value.default_trait_method().await?, 42); + assert_eq!(*trait_value.default_async_trait_method().await?, 42); + } +} + +#[turbo_tasks::function] +fn wrap_value(v: Vc) -> Vc { + v +} + +#[turbo_tasks::function] +fn wrap_trait_value(v: Vc>) -> Vc> { + v +} + +#[turbo_tasks::value_trait] +trait ValueTrait { + fn static_trait_method() -> Vc; + async fn async_static_trait_method() -> Result>; + fn default_static_trait_method() -> Vc { + Vc::cell(42) + } + async fn default_async_static_trait_method() -> Result> { + Ok(Vc::cell(42)) + } + fn trait_method(&self) -> Vc; + fn async_trait_method(&self) -> Result>; + fn default_trait_method(self: Vc) -> Vc { + Vc::cell(42) + } + async fn default_async_trait_method(self: Vc) -> Result> { + Ok(Vc::cell(42)) + } +} + +#[turbo_tasks::value_impl] +impl ValueTrait for Value { + #[turbo_tasks::function] + fn static_trait_method() -> Vc { + Vc::cell(42) + } + + #[turbo_tasks::function] + async fn async_static_trait_method() -> Result> { + Ok(Vc::cell(42)) + } + + #[turbo_tasks::function] + fn trait_method(&self) -> Vc { + Vc::cell(self.0) + } + + #[turbo_tasks::function] + async fn async_trait_method(&self) -> Result> { + Ok(Vc::cell(self.0)) + } +} diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index da406efdfb645..7224e7db52fc9 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -36,14 +36,15 @@ pub struct VcStorage { tasks: Mutex>, } -impl TurboTasksCallApi for VcStorage { +impl VcStorage { fn dynamic_call( &self, func: turbo_tasks::FunctionId, + this_arg: Option, inputs: Vec, ) -> RawVc { let this = self.this.upgrade().unwrap(); - let func = registry::get_function(func).bind(&inputs); + let func = registry::get_function(func).bind(this_arg, &inputs); let handle = tokio::runtime::Handle::current(); let future = func(); let i = { @@ -77,6 +78,25 @@ impl TurboTasksCallApi for VcStorage { })); RawVc::TaskOutput(id) } +} + +impl TurboTasksCallApi for VcStorage { + fn dynamic_call( + &self, + func: turbo_tasks::FunctionId, + inputs: Vec, + ) -> RawVc { + self.dynamic_call(func, None, inputs) + } + + fn dynamic_this_call( + &self, + func: turbo_tasks::FunctionId, + this_arg: RawVc, + inputs: Vec, + ) -> RawVc { + self.dynamic_call(func, Some(this_arg), inputs) + } fn native_call( &self, @@ -86,10 +106,20 @@ impl TurboTasksCallApi for VcStorage { unreachable!() } + fn this_call( + &self, + _func: turbo_tasks::FunctionId, + _this: RawVc, + _inputs: Vec, + ) -> RawVc { + unreachable!() + } + fn trait_call( &self, _trait_type: turbo_tasks::TraitTypeId, _trait_fn_name: Cow<'static, str>, + _this: RawVc, _inputs: Vec, ) -> RawVc { unreachable!() diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index 5af52060a09b3..69aa087822de6 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -17,9 +17,13 @@ use tracing::Span; pub use crate::id::{BackendJobId, ExecutionId}; use crate::{ - event::EventListener, manager::TurboTasksBackendApi, raw_vc::CellId, registry, + event::EventListener, + manager::TurboTasksBackendApi, + raw_vc::CellId, + registry, + trait_helpers::{get_trait_method, has_trait, traits}, ConcreteTaskInput, FunctionId, RawVc, ReadRef, SharedReference, TaskId, TaskIdProvider, - TaskIdSet, TraitRef, TraitTypeId, VcValueTrait, VcValueType, + TaskIdSet, TraitRef, TraitTypeId, ValueTypeId, VcValueTrait, VcValueType, }; pub enum TaskType { @@ -64,17 +68,30 @@ impl Debug for TransientTaskType { #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum PersistentTaskType { /// A normal task execution a native (rust) function - Native(FunctionId, Vec), + Native { + fn_type: FunctionId, + this: Option, + args: Vec, + }, /// A resolve task, which resolves arguments and calls the function with /// resolve arguments. The inner function call will do a cache lookup. - ResolveNative(FunctionId, Vec), + ResolveNative { + fn_type: FunctionId, + this: Option, + args: Vec, + }, /// A trait method resolve task. It resolves the first (`self`) argument and /// looks up the trait method on that value. Then it calls that method. /// The method call will do a cache lookup and might resolve arguments /// before. - ResolveTrait(TraitTypeId, Cow<'static, str>, Vec), + ResolveTrait { + trait_type: TraitTypeId, + method_name: Cow<'static, str>, + this: RawVc, + args: Vec, + }, } impl Display for PersistentTaskType { @@ -86,37 +103,98 @@ impl Display for PersistentTaskType { impl PersistentTaskType { pub fn shrink_to_fit(&mut self) { match self { - Self::Native(_, inputs) => inputs.shrink_to_fit(), - Self::ResolveNative(_, inputs) => inputs.shrink_to_fit(), - Self::ResolveTrait(_, _, inputs) => inputs.shrink_to_fit(), + Self::Native { + fn_type: _, + this: _, + args: inputs, + } => inputs.shrink_to_fit(), + Self::ResolveNative { + fn_type: _, + this: _, + args: inputs, + } => inputs.shrink_to_fit(), + Self::ResolveTrait { + trait_type: _, + method_name: _, + this: _, + args: inputs, + } => inputs.shrink_to_fit(), } } pub fn len(&self) -> usize { match self { - PersistentTaskType::Native(_, v) - | PersistentTaskType::ResolveNative(_, v) - | PersistentTaskType::ResolveTrait(_, _, v) => v.len(), + PersistentTaskType::Native { + fn_type: _, + this: _, + args: v, + } + | PersistentTaskType::ResolveNative { + fn_type: _, + this: _, + args: v, + } + | PersistentTaskType::ResolveTrait { + trait_type: _, + method_name: _, + this: _, + args: v, + } => v.len(), } } pub fn is_empty(&self) -> bool { match self { - PersistentTaskType::Native(_, v) - | PersistentTaskType::ResolveNative(_, v) - | PersistentTaskType::ResolveTrait(_, _, v) => v.is_empty(), + PersistentTaskType::Native { + fn_type: _, + this: _, + args: v, + } + | PersistentTaskType::ResolveNative { + fn_type: _, + this: _, + args: v, + } + | PersistentTaskType::ResolveTrait { + trait_type: _, + method_name: _, + this: _, + args: v, + } => v.is_empty(), } } pub fn partial(&self, len: usize) -> Self { match self { - PersistentTaskType::Native(f, v) => PersistentTaskType::Native(*f, v[..len].to_vec()), - PersistentTaskType::ResolveNative(f, v) => { - PersistentTaskType::ResolveNative(*f, v[..len].to_vec()) - } - PersistentTaskType::ResolveTrait(f, n, v) => { - PersistentTaskType::ResolveTrait(*f, n.clone(), v[..len].to_vec()) - } + PersistentTaskType::Native { + fn_type: f, + this, + args: v, + } => PersistentTaskType::Native { + fn_type: *f, + this: *this, + args: v[..len].to_vec(), + }, + PersistentTaskType::ResolveNative { + fn_type: f, + this, + args: v, + } => PersistentTaskType::ResolveNative { + fn_type: *f, + this: *this, + args: v[..len].to_vec(), + }, + PersistentTaskType::ResolveTrait { + trait_type: f, + method_name: n, + this, + args: v, + } => PersistentTaskType::ResolveTrait { + trait_type: *f, + method_name: n.clone(), + this: *this, + args: v[..len].to_vec(), + }, } } @@ -127,13 +205,22 @@ impl PersistentTaskType { /// it can return a `&'static str` in many cases. pub fn get_name(&self) -> Cow<'static, str> { match self { - PersistentTaskType::Native(native_fn, _) - | PersistentTaskType::ResolveNative(native_fn, _) => { - Cow::Borrowed(®istry::get_function(*native_fn).name) - } - PersistentTaskType::ResolveTrait(trait_id, fn_name, _) => { - format!("{}::{}", registry::get_trait(*trait_id).name, fn_name).into() + PersistentTaskType::Native { + fn_type: native_fn, + this: _, + args: _, } + | PersistentTaskType::ResolveNative { + fn_type: native_fn, + this: _, + args: _, + } => Cow::Borrowed(®istry::get_function(*native_fn).name), + PersistentTaskType::ResolveTrait { + trait_type: trait_id, + method_name: fn_name, + this: _, + args: _, + } => format!("{}::{}", registry::get_trait(*trait_id).name, fn_name).into(), } } } @@ -362,83 +449,82 @@ pub trait Backend: Sync + Send { impl PersistentTaskType { pub async fn run_resolve_native( fn_id: FunctionId, + mut this: Option, mut inputs: Vec, turbo_tasks: Arc>, ) -> Result { - for i in 0..inputs.len() { - let input = unsafe { take(inputs.get_unchecked_mut(i)) }; - let input = input.resolve().await?; - unsafe { - *inputs.get_unchecked_mut(i) = input; - } + if let Some(this) = this.as_mut() { + *this = this.resolve().await?; + } + for input in inputs.iter_mut() { + *input = take(input).resolve().await?; } - Ok(turbo_tasks.native_call(fn_id, inputs)) + Ok(if let Some(this) = this { + turbo_tasks.this_call(fn_id, this, inputs) + } else { + turbo_tasks.native_call(fn_id, inputs) + }) } pub async fn resolve_trait_method( trait_type: TraitTypeId, name: Cow<'static, str>, - this: ConcreteTaskInput, + this: RawVc, ) -> Result { - Self::resolve_trait_method_from_value( - trait_type, - this.resolve().await?.resolve_to_value().await?, - name, - ) + let CellContent(Some(SharedReference(Some(value_type), _))) = this.into_read().await? + else { + bail!("Cell is empty or untyped"); + }; + Self::resolve_trait_method_from_value(trait_type, value_type, name) } pub async fn run_resolve_trait( trait_type: TraitTypeId, name: Cow<'static, str>, - inputs: Vec, + this: RawVc, + mut inputs: Vec, turbo_tasks: Arc>, ) -> Result { - let mut resolved_inputs = Vec::with_capacity(inputs.len()); - let mut iter = inputs.into_iter(); - - let this = iter - .next() - .expect("No arguments for trait call") - .resolve() - .await?; - let this_value = this.clone().resolve_to_value().await?; - - let native_fn = Self::resolve_trait_method_from_value(trait_type, this_value, name)?; - resolved_inputs.push(this); - for input in iter { - resolved_inputs.push(input) + let this = this.resolve().await?; + let CellContent(Some(SharedReference(this_ty, _))) = this.into_read().await? else { + bail!("Cell is empty"); + }; + let Some(this_ty) = this_ty else { + bail!("Cell is untyped"); + }; + + let native_fn = Self::resolve_trait_method_from_value(trait_type, this_ty, name)?; + for input in inputs.iter_mut() { + *input = take(input).resolve().await?; } - Ok(turbo_tasks.dynamic_call(native_fn, resolved_inputs)) + Ok(turbo_tasks.dynamic_this_call(native_fn, this, inputs)) } /// Shared helper used by [`Self::resolve_trait_method`] and /// [`Self::run_resolve_trait`]. fn resolve_trait_method_from_value( trait_type: TraitTypeId, - this_value: ConcreteTaskInput, + value_type: ValueTypeId, name: Cow<'static, str>, ) -> Result { - match this_value.get_trait_method(trait_type, name) { + match get_trait_method(trait_type, value_type, name) { Ok(native_fn) => Ok(native_fn), Err(name) => { - if !this_value.has_trait(trait_type) { - let traits = this_value - .traits() - .iter() - .fold(String::new(), |mut out, t| { - let _ = write!(out, " {}", t); - out - }); + if !has_trait(value_type, trait_type) { + let traits = traits(value_type).iter().fold(String::new(), |mut out, t| { + let _ = write!(out, " {}", t); + out + }); Err(anyhow!( "{} doesn't implement {} (only{})", - this_value, + registry::get_value_type(value_type), registry::get_trait(trait_type), traits, )) } else { Err(anyhow!( "{} implements trait {}, but method {} is missing", - this_value, + registry::get_value_type(value_type), registry::get_trait(trait_type), name )) @@ -452,17 +538,32 @@ impl PersistentTaskType { turbo_tasks: Arc>, ) -> Pin> + Send>> { match self { - PersistentTaskType::Native(fn_id, inputs) => { + PersistentTaskType::Native { + fn_type: fn_id, + this, + args: inputs, + } => { let native_fn = registry::get_function(fn_id); - let bound = native_fn.bind(&inputs); + let bound = native_fn.bind(this, &inputs); (bound)() } - PersistentTaskType::ResolveNative(fn_id, inputs) => { - Box::pin(Self::run_resolve_native(fn_id, inputs, turbo_tasks)) - } - PersistentTaskType::ResolveTrait(trait_type, name, inputs) => Box::pin( - Self::run_resolve_trait(trait_type, name, inputs, turbo_tasks), - ), + PersistentTaskType::ResolveNative { + fn_type: fn_id, + this, + args: inputs, + } => Box::pin(Self::run_resolve_native(fn_id, this, inputs, turbo_tasks)), + PersistentTaskType::ResolveTrait { + trait_type, + method_name: name, + this, + args: inputs, + } => Box::pin(Self::run_resolve_trait( + trait_type, + name, + this, + inputs, + turbo_tasks, + )), } } } @@ -486,15 +587,21 @@ pub(crate) mod tests { fn test_get_name() { crate::register(); assert_eq!( - PersistentTaskType::Native(*MOCK_FUNC_TASK_FUNCTION_ID, Vec::new()).get_name(), + PersistentTaskType::Native { + fn_type: *MOCK_FUNC_TASK_FUNCTION_ID, + this: None, + args: Vec::new() + } + .get_name(), "mock_func_task", ); assert_eq!( - PersistentTaskType::ResolveTrait( - *MOCKTRAIT_TRAIT_TYPE_ID, - "mock_method_task".into(), - Vec::new() - ) + PersistentTaskType::ResolveTrait { + trait_type: *MOCKTRAIT_TRAIT_TYPE_ID, + method_name: "mock_method_task".into(), + this: RawVc::TaskOutput(unsafe { TaskId::new_unchecked(1) }), + args: Vec::new() + } .get_name(), "MockTrait::mock_method_task", ); diff --git a/crates/turbo-tasks/src/lib.rs b/crates/turbo-tasks/src/lib.rs index 20406afd422e5..aa60ab25ab6da 100644 --- a/crates/turbo-tasks/src/lib.rs +++ b/crates/turbo-tasks/src/lib.rs @@ -65,6 +65,7 @@ pub mod small_duration; mod state; pub mod task; pub mod trace; +mod trait_helpers; mod trait_ref; mod triomphe_utils; pub mod util; @@ -85,10 +86,10 @@ pub use invalidation::{ }; pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt}; pub use manager::{ - dynamic_call, emit, get_invalidator, mark_finished, mark_stateful, prevent_gc, run_once, - run_once_with_reason, spawn_blocking, spawn_thread, trait_call, turbo_tasks, CurrentCellRef, - Invalidator, TaskIdProvider, TurboTasks, TurboTasksApi, TurboTasksBackendApi, - TurboTasksCallApi, Unused, UpdateInfo, + dynamic_call, dynamic_this_call, emit, get_invalidator, mark_finished, mark_stateful, + prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call, + turbo_tasks, CurrentCellRef, Invalidator, TaskIdProvider, TurboTasks, TurboTasksApi, + TurboTasksBackendApi, TurboTasksCallApi, Unused, UpdateInfo, }; pub use native_function::NativeFunction; pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError}; diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 88ebb08acff09..3ee524950bd1f 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -30,8 +30,8 @@ use crate::{ id::{BackendJobId, FunctionId, TraitTypeId}, id_factory::IdFactoryWithReuse, raw_vc::{CellId, RawVc}, - registry, trace::TraceRawVcs, + trait_helpers::get_trait_method, util::StaticOrArc, vc::ReadVcFuture, Completion, ConcreteTaskInput, InvalidationReason, InvalidationReasonSet, SharedReference, @@ -40,11 +40,19 @@ use crate::{ pub trait TurboTasksCallApi: Sync + Send { fn dynamic_call(&self, func: FunctionId, inputs: Vec) -> RawVc; + fn dynamic_this_call( + &self, + func: FunctionId, + this: RawVc, + inputs: Vec, + ) -> RawVc; fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc; + fn this_call(&self, func: FunctionId, this: RawVc, inputs: Vec) -> RawVc; fn trait_call( &self, trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, + this: RawVc, inputs: Vec, ) -> RawVc; @@ -369,7 +377,30 @@ impl TurboTasks { /// All inputs must be resolved. pub(crate) fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( - PersistentTaskType::Native(func, inputs), + PersistentTaskType::Native { + fn_type: func, + this: None, + args: inputs, + }, + current_task("turbo_function calls"), + self, + )) + } + + /// Call a native function with arguments. + /// All inputs must be resolved. + pub(crate) fn this_call( + &self, + func: FunctionId, + this: RawVc, + inputs: Vec, + ) -> RawVc { + RawVc::TaskOutput(self.backend.get_or_create_persistent_task( + PersistentTaskType::Native { + fn_type: func, + this: Some(this), + args: inputs, + }, current_task("turbo_function calls"), self, )) @@ -382,7 +413,34 @@ impl TurboTasks { self.native_call(func, inputs) } else { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( - PersistentTaskType::ResolveNative(func, inputs), + PersistentTaskType::ResolveNative { + fn_type: func, + this: None, + args: inputs, + }, + current_task("turbo_function calls"), + self, + )) + } + } + + /// Calls a native function with arguments. Resolves arguments when needed + /// with a wrapper task. + pub fn dynamic_this_call( + &self, + func: FunctionId, + this: RawVc, + inputs: Vec, + ) -> RawVc { + if this.is_resolved() && inputs.iter().all(|i| i.is_resolved()) { + self.this_call(func, this, inputs) + } else { + RawVc::TaskOutput(self.backend.get_or_create_persistent_task( + PersistentTaskType::ResolveNative { + fn_type: func, + this: Some(this), + args: inputs, + }, current_task("turbo_function calls"), self, )) @@ -395,24 +453,31 @@ impl TurboTasks { &self, trait_type: TraitTypeId, mut trait_fn_name: Cow<'static, str>, + this: RawVc, inputs: Vec, ) -> RawVc { // avoid creating a wrapper task if self is already resolved // for resolved cells we already know the value type so we can lookup the // function - let first_input = inputs.first().expect("trait call without self argument"); - if let &ConcreteTaskInput::TaskCell(_, CellId { type_id, .. }) = first_input { - let value_type = registry::get_value_type(type_id); - let key = (trait_type, trait_fn_name); - if let Some(native_fn) = value_type.get_trait_method(&key) { - return self.dynamic_call(*native_fn, inputs); + if let RawVc::TaskCell(_, CellId { type_id, .. }) = this { + match get_trait_method(trait_type, type_id, trait_fn_name) { + Ok(native_fn) => { + return self.dynamic_this_call(native_fn, this, inputs); + } + Err(name) => { + trait_fn_name = name; + } } - trait_fn_name = key.1; } // create a wrapper task to resolve all inputs RawVc::TaskOutput(self.backend.get_or_create_persistent_task( - PersistentTaskType::ResolveTrait(trait_type, trait_fn_name, inputs), + PersistentTaskType::ResolveTrait { + trait_type, + method_name: trait_fn_name, + this, + args: inputs, + }, current_task("turbo_function calls"), self, )) @@ -794,16 +859,28 @@ impl TurboTasksCallApi for TurboTasks { fn dynamic_call(&self, func: FunctionId, inputs: Vec) -> RawVc { self.dynamic_call(func, inputs) } + fn dynamic_this_call( + &self, + func: FunctionId, + this: RawVc, + inputs: Vec, + ) -> RawVc { + self.dynamic_this_call(func, this, inputs) + } fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc { self.native_call(func, inputs) } + fn this_call(&self, func: FunctionId, this: RawVc, inputs: Vec) -> RawVc { + self.this_call(func, this, inputs) + } fn trait_call( &self, trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, + this: RawVc, inputs: Vec, ) -> RawVc { - self.trait_call(trait_type, trait_fn_name, inputs) + self.trait_call(trait_type, trait_fn_name, this, inputs) } #[track_caller] @@ -1282,13 +1359,20 @@ pub fn dynamic_call(func: FunctionId, inputs: Vec) -> RawVc { with_turbo_tasks(|tt| tt.dynamic_call(func, inputs)) } +/// Calls [`TurboTasks::dynamic_this_call`] for the current turbo tasks +/// instance. +pub fn dynamic_this_call(func: FunctionId, this: RawVc, inputs: Vec) -> RawVc { + with_turbo_tasks(|tt| tt.dynamic_this_call(func, this, inputs)) +} + /// Calls [`TurboTasks::trait_call`] for the current turbo tasks instance. pub fn trait_call( trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, + this: RawVc, inputs: Vec, ) -> RawVc { - with_turbo_tasks(|tt| tt.trait_call(trait_type, trait_fn_name, inputs)) + with_turbo_tasks(|tt| tt.trait_call(trait_type, trait_fn_name, this, inputs)) } pub fn turbo_tasks() -> Arc { diff --git a/crates/turbo-tasks/src/native_function.rs b/crates/turbo-tasks/src/native_function.rs index 1a17956222596..c43910288fc99 100644 --- a/crates/turbo-tasks/src/native_function.rs +++ b/crates/turbo-tasks/src/native_function.rs @@ -3,10 +3,14 @@ use std::{fmt::Debug, hash::Hash}; use tracing::Span; use crate::{ + self as turbo_tasks, registry::register_function, - task::{function::NativeTaskFn, IntoTaskFn, TaskFn}, + task::{ + function::{IntoTaskFnWithThis, NativeTaskFn}, + IntoTaskFn, TaskFn, + }, util::SharedError, - ConcreteTaskInput, {self as turbo_tasks}, + ConcreteTaskInput, RawVc, }; /// A native (rust) turbo-tasks function. It's used internally by @@ -30,7 +34,7 @@ impl Debug for NativeFunction { } impl NativeFunction { - pub fn new(name: String, implementation: I) -> Self + pub fn new_function(name: String, implementation: I) -> Self where I: IntoTaskFn, { @@ -40,9 +44,19 @@ impl NativeFunction { } } + pub fn new_method(name: String, implementation: I) -> Self + where + I: IntoTaskFnWithThis, + { + Self { + name, + implementation: Box::new(implementation.into_task_fn_with_this()), + } + } + /// Creates a functor for execution from a fixed set of inputs. - pub fn bind(&'static self, inputs: &[ConcreteTaskInput]) -> NativeTaskFn { - match (self.implementation).functor(inputs) { + pub fn bind(&'static self, this: Option, inputs: &[ConcreteTaskInput]) -> NativeTaskFn { + match (self.implementation).functor(this, inputs) { Ok(functor) => functor, Err(err) => { let err = SharedError::new(err); diff --git a/crates/turbo-tasks/src/raw_vc.rs b/crates/turbo-tasks/src/raw_vc.rs index e36b2894626ea..50c4a8ed16c3f 100644 --- a/crates/turbo-tasks/src/raw_vc.rs +++ b/crates/turbo-tasks/src/raw_vc.rs @@ -59,6 +59,13 @@ pub enum RawVc { } impl RawVc { + pub(crate) fn is_resolved(&self) -> bool { + match self { + RawVc::TaskOutput(_) => false, + RawVc::TaskCell(_, _) => true, + } + } + pub(crate) fn into_read(self) -> ReadRawVcFuture { // returns a custom future to have something concrete and sized // this avoids boxing in IntoFuture diff --git a/crates/turbo-tasks/src/task/concrete_task_input.rs b/crates/turbo-tasks/src/task/concrete_task_input.rs index 8f0a94693c918..e0982858c744a 100644 --- a/crates/turbo-tasks/src/task/concrete_task_input.rs +++ b/crates/turbo-tasks/src/task/concrete_task_input.rs @@ -1,6 +1,5 @@ use std::{ any::Any, - borrow::Cow, fmt::{Debug, Display}, future::Future, hash::Hash, @@ -14,12 +13,11 @@ use unsize::CoerceUnsize; use crate::{ backend::CellContent, - id::{FunctionId, TraitTypeId}, magic_any::MagicAny, manager::{read_task_cell, read_task_output}, registry, triomphe_utils::{coerce_to_any_send_sync, downcast_triomphe_arc}, - turbo_tasks, CellId, RawVc, RcStr, TaskId, TraitType, ValueTypeId, + turbo_tasks, CellId, RawVc, RcStr, TaskId, ValueTypeId, }; /// A type-erased wrapper for [`triomphe::Arc`]. @@ -405,74 +403,6 @@ impl ConcreteTaskInput { } } - pub fn get_trait_method( - &self, - trait_type: TraitTypeId, - name: Cow<'static, str>, - ) -> Result> { - match self { - ConcreteTaskInput::TaskOutput(_) | ConcreteTaskInput::TaskCell(_, _) => { - panic!("get_trait_method must be called on a resolved TaskInput") - } - ConcreteTaskInput::SharedValue(SharedValue(ty, _)) - | ConcreteTaskInput::SharedReference(SharedReference(ty, _)) => { - if let Some(ty) = *ty { - let key = (trait_type, name); - if let Some(func) = registry::get_value_type(ty).get_trait_method(&key) { - Ok(*func) - } else if let Some(func) = registry::get_trait(trait_type) - .default_trait_methods - .get(&key.1) - { - Ok(*func) - } else { - Err(key.1) - } - } else { - Err(name) - } - } - _ => Err(name), - } - } - - pub fn has_trait(&self, trait_type: TraitTypeId) -> bool { - match self { - ConcreteTaskInput::TaskOutput(_) | ConcreteTaskInput::TaskCell(_, _) => { - panic!("has_trait() must be called on a resolved TaskInput") - } - ConcreteTaskInput::SharedValue(SharedValue(ty, _)) - | ConcreteTaskInput::SharedReference(SharedReference(ty, _)) => { - if let Some(ty) = *ty { - registry::get_value_type(ty).has_trait(&trait_type) - } else { - false - } - } - _ => false, - } - } - - pub fn traits(&self) -> Vec<&'static TraitType> { - match self { - ConcreteTaskInput::TaskOutput(_) | ConcreteTaskInput::TaskCell(_, _) => { - panic!("traits() must be called on a resolved TaskInput") - } - ConcreteTaskInput::SharedValue(SharedValue(ty, _)) - | ConcreteTaskInput::SharedReference(SharedReference(ty, _)) => { - if let Some(ty) = *ty { - registry::get_value_type(ty) - .traits_iter() - .map(registry::get_trait) - .collect() - } else { - Vec::new() - } - } - _ => Vec::new(), - } - } - pub fn is_resolved(&self) -> bool { match self { ConcreteTaskInput::TaskOutput(_) => false, diff --git a/crates/turbo-tasks/src/task/function.rs b/crates/turbo-tasks/src/task/function.rs index c1bfcaac41e39..aa436bf6cef39 100644 --- a/crates/turbo-tasks/src/task/function.rs +++ b/crates/turbo-tasks/src/task/function.rs @@ -32,7 +32,7 @@ pub type NativeTaskFuture = Pin> + Send>>; pub type NativeTaskFn = Box NativeTaskFuture + Send + Sync>; pub trait TaskFn: Send + Sync + 'static { - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result; + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; } pub trait IntoTaskFn { @@ -58,6 +58,29 @@ where } } +pub trait IntoTaskFnWithThis { + type TaskFn: TaskFn; + + fn into_task_fn_with_this(self) -> Self::TaskFn; +} + +impl IntoTaskFnWithThis for F +where + F: TaskFnInputFunctionWithThis, + Mode: TaskFnMode, + Inputs: TaskInputs, +{ + type TaskFn = FunctionTaskFnWithThis; + + fn into_task_fn_with_this(self) -> Self::TaskFn { + FunctionTaskFnWithThis { + task_fn: self, + mode: PhantomData, + inputs: PhantomData, + } + } +} + pub struct FunctionTaskFn { task_fn: F, mode: PhantomData, @@ -70,13 +93,36 @@ where Mode: TaskFnMode, Inputs: TaskInputs, { - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { - TaskFnInputFunction::functor(&self.task_fn, inputs) + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + TaskFnInputFunction::functor(&self.task_fn, this, inputs) + } +} + +pub struct FunctionTaskFnWithThis { + task_fn: F, + mode: PhantomData, + inputs: PhantomData, +} + +impl TaskFn for FunctionTaskFnWithThis +where + F: TaskFnInputFunctionWithThis, + Mode: TaskFnMode, + Inputs: TaskInputs, +{ + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + TaskFnInputFunctionWithThis::functor(&self.task_fn, this, inputs) } } trait TaskFnInputFunction: Send + Sync + Clone + 'static { - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result; + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; +} + +trait TaskFnInputFunctionWithThis: + Send + Sync + Clone + 'static +{ + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; } pub trait TaskInputs: Send + Sync + 'static {} @@ -91,12 +137,12 @@ pub trait TaskFnMode: Send + Sync + 'static {} pub struct FunctionMode; impl TaskFnMode for FunctionMode {} -pub struct MethodMode; -impl TaskFnMode for MethodMode {} - pub struct AsyncFunctionMode; impl TaskFnMode for AsyncFunctionMode {} +pub struct MethodMode; +impl TaskFnMode for MethodMode {} + pub struct AsyncMethodMode; impl TaskFnMode for AsyncMethodMode {} @@ -128,14 +174,6 @@ macro_rules! task_fn_impl { get_args_iter(inputs.iter()) } - pub fn get_method_args( - inputs: &[ConcreteTaskInput], - ) -> Result<(&ConcreteTaskInput, ($(&as_concrete_task_input!($arg),)*))> { - let mut iter = inputs.iter(); - let recv = iter.next().context("task is missing receiver")?; - Ok((recv, get_args_iter(iter)?)) - } - fn get_args_iter( mut iter: std::slice::Iter<'_, ConcreteTaskInput>, ) -> Result<($(&as_concrete_task_input!($arg),)*)> { @@ -154,7 +192,7 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, _this: Option, inputs: &[ConcreteTaskInput]) -> Result { let ($($arg,)*) = $helper_module::get_args(inputs)?; let task_fn = self.clone(); @@ -183,7 +221,7 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, _this: Option, inputs: &[ConcreteTaskInput]) -> Result { let ($($arg,)*) = $helper_module::get_args(inputs)?; let task_fn = self.clone(); @@ -204,7 +242,7 @@ macro_rules! task_fn_impl { } } - impl TaskFnInputFunction, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis, $($arg,)*)> for F where Recv: VcValueType, $($arg: TaskInput + 'static,)* @@ -212,18 +250,17 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { - let (recv, ($($arg,)*)) = $helper_module::get_method_args(inputs)?; - + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { let task_fn = self.clone(); - let recv = Vc::::try_from_concrete(recv)?; + let recv = Vc::::from(this.expect("Method need to have a `self` argument")); + + let ($($arg,)*) = $helper_module::get_args(inputs)?; $( let $arg = $arg::try_from_concrete($arg)?; )* Ok(Box::new(move || { let task_fn = task_fn.clone(); - let recv = recv.clone(); $( let $arg = $arg.clone(); )* @@ -237,6 +274,36 @@ macro_rules! task_fn_impl { } } + impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + where + Recv: Send + 'static, + $($arg: TaskInput + 'static,)* + F: Fn(Vc, $($arg,)*) -> Output + Send + Sync + Clone + 'static, + Output: TaskOutput + 'static, + { + #[allow(non_snake_case)] + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + let task_fn = self.clone(); + let recv = Vc::::from(this.expect("Method need to have a `self` argument")); + + let ($($arg,)*) = $helper_module::get_args(inputs)?; + $( + let $arg = $arg::try_from_concrete($arg)?; + )* + + Ok(Box::new(move || { + let task_fn = task_fn.clone(); + $( + let $arg = $arg.clone(); + )* + + Box::pin(async move { + Output::try_into_raw_vc((task_fn)(recv, $($arg),*)) + }) + })) + } + } + pub trait $async_fn_trait: Fn(A0, $($arg,)*) -> Self::OutputFuture { type OutputFuture: Future>::Output> + Send; type Output: TaskOutput; @@ -252,42 +319,61 @@ macro_rules! task_fn_impl { type Output = Fut::Output; } - impl TaskFnInputFunction, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis, $($arg,)*)> for F where Recv: VcValueType, $($arg: TaskInput + 'static,)* F: for<'a> $async_fn_trait<&'a Recv, $($arg,)*> + Clone + Send + Sync + 'static, { #[allow(non_snake_case)] - fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { let task_fn = self.clone(); - let mut iter = inputs.iter(); + let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let recv = iter.next().context("task is missing receiver")?; + let ($($arg,)*) = $helper_module::get_args(inputs)?; $( - let $arg = next_arg(&mut iter, stringify!($arg))?; + let $arg = $arg::try_from_concrete($arg)?; )* - if iter.next().is_some() { - bail!("task was called with too many arguments"); - } + Ok(Box::new(move || { + let task_fn = task_fn.clone(); + $( + let $arg = $arg.clone(); + )* + + Box::pin(async move { + let recv = recv.await?; + let recv = <::Read as VcRead>::target_to_value_ref(&*recv); + >::Output::try_into_raw_vc((task_fn)(recv, $($arg),*).await) + }) + })) + } + } + + impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + where + Recv: Send + 'static, + $($arg: TaskInput + 'static,)* + F: $async_fn_trait, $($arg,)*> + Clone + Send + Sync + 'static, + { + #[allow(non_snake_case)] + fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + let task_fn = self.clone(); + let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let recv = Vc::::try_from_concrete(recv)?; + let ($($arg,)*) = $helper_module::get_args(inputs)?; $( let $arg = $arg::try_from_concrete($arg)?; )* Ok(Box::new(move || { let task_fn = task_fn.clone(); - let recv = recv.clone(); $( let $arg = $arg.clone(); )* Box::pin(async move { - let recv = recv.await?; - let recv = <::Read as VcRead>::target_to_value_ref(&*recv); - >::Output::try_into_raw_vc((task_fn)(recv, $($arg),*).await) + , $($arg,)*>>::Output::try_into_raw_vc((task_fn)(recv, $($arg),*).await) }) })) } @@ -439,19 +525,19 @@ mod tests { accepts_task_fn(one_arg.into_task_fn()); let _task_fn = async_one_arg.into_task_fn(); accepts_task_fn(async_one_arg.into_task_fn()); - let task_fn = with_recv.into_task_fn(); + let task_fn = with_recv.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = async_with_recv.into_task_fn(); + let task_fn = async_with_recv.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = with_recv_and_str.into_task_fn(); + let task_fn = with_recv_and_str.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = async_with_recv_and_str.into_task_fn(); + let task_fn = async_with_recv_and_str.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = async_with_recv_and_str_and_result.into_task_fn(); + let task_fn = async_with_recv_and_str_and_result.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = ::async_method.into_task_fn(); + let task_fn = ::async_method.into_task_fn_with_this(); accepts_task_fn(task_fn); - let task_fn = Struct::inherent_method.into_task_fn(); + let task_fn = Struct::inherent_method.into_task_fn_with_this(); accepts_task_fn(task_fn); /* diff --git a/crates/turbo-tasks/src/task/mod.rs b/crates/turbo-tasks/src/task/mod.rs index 067a16429d9a0..2fa600f9a502a 100644 --- a/crates/turbo-tasks/src/task/mod.rs +++ b/crates/turbo-tasks/src/task/mod.rs @@ -4,8 +4,6 @@ pub(crate) mod task_input; pub(crate) mod task_output; pub use concrete_task_input::ConcreteTaskInput; -pub use function::{ - AsyncFunctionMode, AsyncMethodMode, FunctionMode, IntoTaskFn, MethodMode, NativeTaskFn, TaskFn, -}; +pub use function::{AsyncFunctionMode, FunctionMode, IntoTaskFn, NativeTaskFn, TaskFn}; pub use task_input::TaskInput; pub use task_output::TaskOutput; diff --git a/crates/turbo-tasks/src/trait_helpers.rs b/crates/turbo-tasks/src/trait_helpers.rs new file mode 100644 index 0000000000000..370443acac31e --- /dev/null +++ b/crates/turbo-tasks/src/trait_helpers.rs @@ -0,0 +1,32 @@ +use std::borrow::Cow; + +use crate::{registry, FunctionId, TraitType, TraitTypeId, ValueTypeId}; + +pub fn get_trait_method( + trait_type: TraitTypeId, + value_type: ValueTypeId, + name: Cow<'static, str>, +) -> Result> { + let key = (trait_type, name); + if let Some(func) = registry::get_value_type(value_type).get_trait_method(&key) { + Ok(*func) + } else if let Some(func) = registry::get_trait(trait_type) + .default_trait_methods + .get(&key.1) + { + Ok(*func) + } else { + Err(key.1) + } +} + +pub fn has_trait(value_type: ValueTypeId, trait_type: TraitTypeId) -> bool { + registry::get_value_type(value_type).has_trait(&trait_type) +} + +pub fn traits(value_type: ValueTypeId) -> Vec<&'static TraitType> { + registry::get_value_type(value_type) + .traits_iter() + .map(registry::get_trait) + .collect() +} diff --git a/crates/turbo-tasks/src/value_type.rs b/crates/turbo-tasks/src/value_type.rs index 17b93376da928..4d0301aacc2a1 100644 --- a/crates/turbo-tasks/src/value_type.rs +++ b/crates/turbo-tasks/src/value_type.rs @@ -79,6 +79,12 @@ impl Debug for ValueType { } } +impl Display for ValueType { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.write_str(&self.name) + } +} + pub fn any_as_serialize( this: &(dyn Any + Send + Sync), ) -> &dyn erased_serde::Serialize { From 21dbfaacc69102842249fb4395c0efb60fbc7762 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 17 Jul 2024 23:22:58 +0200 Subject: [PATCH 19/73] improve failsafe_analyse (#8775) ### Description This puts the results into the same cells to avoid unnecessary invalidations Improves performance ### Testing Instructions --- crates/turbopack-ecmascript/src/lib.rs | 80 ++++++++++++++------------ 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index 51fc0bc516f36..aeb15d0b583a2 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -391,24 +391,30 @@ impl EcmascriptModuleAsset { let result = self.analyze(); let result_value = result.await?; - if result_value.successful { - this.last_successful_analysis - .set(Some(MemoizedSuccessfulAnalysis { - operation: result, - // We need to store the ReadRefs since we want to keep a snapshot. - references: result_value.references.await?, - local_references: result_value.local_references.await?, - reexport_references: result_value.reexport_references.await?, - evaluation_references: result_value.evaluation_references.await?, - exports: result_value.exports.await?, - async_module: result_value.async_module.await?, - source_map: if let Some(map) = *result_value.source_map.await? { - Some(map.await?) - } else { - None - }, - })); - } else if let Some(MemoizedSuccessfulAnalysis { + let successful = result_value.successful; + let current_memo = MemoizedSuccessfulAnalysis { + operation: result, + // We need to store the ReadRefs since we want to keep a snapshot. + references: result_value.references.await?, + local_references: result_value.local_references.await?, + reexport_references: result_value.reexport_references.await?, + evaluation_references: result_value.evaluation_references.await?, + exports: result_value.exports.await?, + async_module: result_value.async_module.await?, + source_map: if let Some(map) = *result_value.source_map.await? { + Some(map.await?) + } else { + None + }, + }; + let state_ref; + let best_value = if successful { + ¤t_memo + } else { + state_ref = this.last_successful_analysis.get(); + state_ref.as_ref().unwrap_or(¤t_memo) + }; + let MemoizedSuccessfulAnalysis { operation, references, local_references, @@ -417,26 +423,26 @@ impl EcmascriptModuleAsset { exports, async_module, source_map, - }) = &*this.last_successful_analysis.get() - { - // It's important to connect to the last operation here to keep it active, so - // it's potentially recomputed when garbage collected - Vc::connect(*operation); - return Ok(AnalyzeEcmascriptModuleResult { - references: ReadRef::cell(references.clone()), - local_references: ReadRef::cell(local_references.clone()), - reexport_references: ReadRef::cell(reexport_references.clone()), - evaluation_references: ReadRef::cell(evaluation_references.clone()), - exports: ReadRef::cell(exports.clone()), - code_generation: result_value.code_generation, - async_module: ReadRef::cell(async_module.clone()), - source_map: Vc::cell(source_map.clone().map(ReadRef::cell)), - successful: false, - } - .cell()); + } = best_value; + // It's important to connect to the last operation here to keep it active, so + // it's potentially recomputed when garbage collected + Vc::connect(*operation); + let result = AnalyzeEcmascriptModuleResult { + references: ReadRef::cell(references.clone()), + local_references: ReadRef::cell(local_references.clone()), + reexport_references: ReadRef::cell(reexport_references.clone()), + evaluation_references: ReadRef::cell(evaluation_references.clone()), + exports: ReadRef::cell(exports.clone()), + code_generation: result_value.code_generation, + async_module: ReadRef::cell(async_module.clone()), + source_map: Vc::cell(source_map.clone().map(ReadRef::cell)), + successful, } - - Ok(ReadRef::cell(result_value)) + .cell(); + if successful { + this.last_successful_analysis.set(Some(current_memo)); + } + Ok(result) } #[turbo_tasks::function] From 253062cf8827836e699331a79c53b47d4e10d7d6 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 17 Jul 2024 23:23:14 +0200 Subject: [PATCH 20/73] notify tasks when collectibles change (#8776) ### Description Collectibles are removed in `execution_completed` and that might add some tasks to the task local of tasks_to_notify. We need to make sure to notify these tasks otherwise changes get lost. ### Testing Instructions --- crates/turbo-tasks-memory/src/memory_backend.rs | 1 + crates/turbo-tasks/src/manager.rs | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 404a43f5a7a08..624f6fe764e50 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -471,6 +471,7 @@ impl Backend for MemoryBackend { reader: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, ) -> AutoMap { + Task::add_dependency_to_current(TaskEdge::Collectibles(id, trait_id)); Task::read_collectibles(id, trait_id, reader, self, turbo_tasks) } diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 3ee524950bd1f..d6ff7ee10dfc7 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -523,13 +523,16 @@ impl TurboTasks { }); this.backend.task_execution_result(task_id, result, &*this); let stateful = this.finish_current_task_state(); - this.backend.task_execution_completed( + let schedule_again = this.backend.task_execution_completed( task_id, duration, memory_usage, stateful, &*this, - ) + ); + // task_execution_completed might need to notify tasks + this.notify_scheduled_tasks(); + schedule_again } .instrument(span) .await From 9c02e35c0a4707ae8e17fa5f5ded44c9f8713cca Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 18 Jul 2024 00:21:09 +0200 Subject: [PATCH 21/73] fix collectibles counting (#8778) ### Description fix a bunch of cases where collectibles were not correctly counted ### Testing Instructions --- Cargo.lock | 1 + .../turbo-tasks-memory/src/memory_backend.rs | 7 +- .../src/memory_backend_with_pg.rs | 8 +- crates/turbo-tasks-memory/src/task.rs | 4 +- .../src/task/aggregation.rs | 59 ++++++------ .../tests/recompute_collectibles.rs | 92 +++++++++++++++++++ crates/turbo-tasks-testing/Cargo.toml | 1 + crates/turbo-tasks-testing/src/lib.rs | 7 +- crates/turbo-tasks/src/backend.rs | 9 +- crates/turbo-tasks/src/manager.rs | 13 ++- 10 files changed, 152 insertions(+), 49 deletions(-) create mode 100644 crates/turbo-tasks-memory/tests/recompute_collectibles.rs diff --git a/Cargo.lock b/Cargo.lock index 8ea9451c639cc..06a2b151a3e03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10314,6 +10314,7 @@ dependencies = [ "auto-hash-map", "futures", "lazy_static", + "rustc-hash", "tokio", "turbo-tasks", ] diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 624f6fe764e50..249bf4b8a2ca3 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -13,7 +13,6 @@ use std::{ }; use anyhow::{bail, Result}; -use auto_hash_map::AutoMap; use dashmap::{mapref::entry::Entry, DashMap}; use rustc_hash::FxHasher; use tokio::task::futures::TaskLocalFuture; @@ -21,8 +20,8 @@ use tracing::trace_span; use turbo_prehash::{BuildHasherExt, PassThroughHash, PreHashed}; use turbo_tasks::{ backend::{ - Backend, BackendJobId, CellContent, PersistentTaskType, TaskExecutionSpec, - TransientTaskType, + Backend, BackendJobId, CellContent, PersistentTaskType, TaskCollectiblesMap, + TaskExecutionSpec, TransientTaskType, }, event::EventListener, util::{IdFactoryWithReuse, NoMoveVec}, @@ -470,7 +469,7 @@ impl Backend for MemoryBackend { trait_id: TraitTypeId, reader: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> AutoMap { + ) -> TaskCollectiblesMap { Task::add_dependency_to_current(TaskEdge::Collectibles(id, trait_id)); Task::read_collectibles(id, trait_id, reader, self, turbo_tasks) } diff --git a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs b/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs index 19ee36169a778..3c2c5e8c91983 100644 --- a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs +++ b/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs @@ -13,13 +13,13 @@ use std::{ }; use anyhow::{anyhow, Result}; -use auto_hash_map::{AutoMap, AutoSet}; +use auto_hash_map::AutoSet; use concurrent_queue::ConcurrentQueue; use dashmap::{mapref::entry::Entry, DashMap, DashSet}; use turbo_tasks::{ backend::{ - Backend, BackendJobId, CellContent, PersistentTaskType, TaskExecutionSpec, - TransientTaskType, + Backend, BackendJobId, CellContent, PersistentTaskType, TaskCollectiblesMap, + TaskExecutionSpec, TransientTaskType, }, event::{Event, EventListener}, persisted_graph::{ @@ -1446,7 +1446,7 @@ impl Backend for MemoryBackendWithPersistedGraph

{ _trait_id: TraitTypeId, _reader: TaskId, _turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> AutoMap { + ) -> TaskCollectiblesMap { todo!() } diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index af0b69892707c..81eef31114c1f 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -21,7 +21,7 @@ use tokio::task_local; use tracing::Span; use turbo_prehash::PreHashed; use turbo_tasks::{ - backend::{PersistentTaskType, TaskExecutionSpec}, + backend::{PersistentTaskType, TaskCollectiblesMap, TaskExecutionSpec}, event::{Event, EventListener}, get_invalidator, registry, CellId, Invalidator, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, ValueTypeId, @@ -1573,7 +1573,7 @@ impl Task { reader: TaskId, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> AutoMap { + ) -> TaskCollectiblesMap { let aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); let mut aggregation_data = aggregation_context.aggregation_data(id); aggregation_data.read_collectibles(trait_type, reader) diff --git a/crates/turbo-tasks-memory/src/task/aggregation.rs b/crates/turbo-tasks-memory/src/task/aggregation.rs index f4188b2a0caeb..581768a7a753a 100644 --- a/crates/turbo-tasks-memory/src/task/aggregation.rs +++ b/crates/turbo-tasks-memory/src/task/aggregation.rs @@ -10,7 +10,10 @@ use auto_hash_map::{map::Entry, AutoMap}; use either::Either; use parking_lot::Mutex; use rustc_hash::FxHasher; -use turbo_tasks::{event::Event, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi}; +use turbo_tasks::{ + backend::TaskCollectiblesMap, event::Event, RawVc, TaskId, TaskIdSet, TraitTypeId, + TurboTasksBackendApi, +}; use super::{ meta_state::{FullTaskWriteGuard, TaskMetaStateWriteGuard}, @@ -32,7 +35,7 @@ pub enum RootType { #[derive(Debug, Default)] pub struct CollectiblesInfo { - collectibles: AutoMap, + collectibles: TaskCollectiblesMap, dependent_tasks: TaskIdSet, } @@ -90,8 +93,8 @@ impl Aggregated { ) { if let Entry::Occupied(mut entry) = self.collectibles.entry(trait_type) { let info = entry.get_mut(); - info.dependent_tasks.remove(&reader); - if info.is_unset() { + let removed = info.dependent_tasks.remove(&reader); + if removed && info.is_unset() { entry.remove(); } } @@ -101,7 +104,7 @@ impl Aggregated { &mut self, trait_type: TraitTypeId, reader: TaskId, - ) -> AutoMap { + ) -> TaskCollectiblesMap { match self.collectibles.entry(trait_type) { Entry::Occupied(mut e) => { let info = e.get_mut(); @@ -293,7 +296,7 @@ impl<'a> AggregationContext for TaskAggregationContext<'a> { } Entry::Vacant(e) => { let mut collectibles_info = CollectiblesInfo::default(); - update_count_entry(collectibles_info.collectibles.entry(collectible), count); + collectibles_info.collectibles.insert(collectible, count); e.insert(collectibles_info); } } @@ -489,8 +492,10 @@ impl<'l> AggregationNodeGuard for TaskGuard<'l> { change.dirty_tasks_update.push((self.id, 1)); } if let Some(collectibles) = guard.collectibles.as_ref() { - for (&(trait_type_id, collectible), _) in collectibles.iter() { - change.collectibles.push((trait_type_id, collectible, 1)); + for (&(trait_type_id, collectible), count) in collectibles.iter() { + change + .collectibles + .push((trait_type_id, collectible, *count)); } } if let TaskStateType::InProgress(box InProgressState { @@ -499,8 +504,10 @@ impl<'l> AggregationNodeGuard for TaskGuard<'l> { }) = &guard.state_type { if let Some(collectibles) = outdated_collectibles.as_ref() { - for (&(trait_type_id, collectible), _) in collectibles.iter() { - change.collectibles.push((trait_type_id, collectible, 1)); + for (&(trait_type_id, collectible), count) in collectibles.iter() { + change + .collectibles + .push((trait_type_id, collectible, *count)); } } } @@ -541,8 +548,10 @@ impl<'l> AggregationNodeGuard for TaskGuard<'l> { change.dirty_tasks_update.push((self.id, -1)); } if let Some(collectibles) = guard.collectibles.as_ref() { - for (&(trait_type_id, collectible), _) in collectibles.iter() { - change.collectibles.push((trait_type_id, collectible, -1)); + for (&(trait_type_id, collectible), count) in collectibles.iter() { + change + .collectibles + .push((trait_type_id, collectible, -count)); } } if let TaskStateType::InProgress(box InProgressState { @@ -551,8 +560,10 @@ impl<'l> AggregationNodeGuard for TaskGuard<'l> { }) = &guard.state_type { if let Some(collectibles) = outdated_collectibles.as_ref() { - for (&(trait_type_id, collectible), _) in collectibles.iter() { - change.collectibles.push((trait_type_id, collectible, -1)); + for (&(trait_type_id, collectible), count) in collectibles.iter() { + change + .collectibles + .push((trait_type_id, collectible, -*count)); } } } @@ -588,19 +599,13 @@ impl<'l> AggregationNodeGuard for TaskGuard<'l> { { data.unfinished_tasks = unfinished_tasks_update.into_iter().collect(); } - data.dirty_tasks = dirty_tasks_update.into_iter().collect(); - data.collectibles = collectibles - .into_iter() - .map(|(trait_type_id, collectible, count)| { - ( - trait_type_id, - CollectiblesInfo { - collectibles: [(collectible, count)].iter().cloned().collect(), - dependent_tasks: TaskIdSet::default(), - }, - ) - }) - .collect(); + for (t, n) in dirty_tasks_update.into_iter() { + data.dirty_tasks.insert(t, n); + } + for (trait_type_id, collectible, count) in collectibles.into_iter() { + let info = data.collectibles.entry(trait_type_id).or_default(); + update_count_entry(info.collectibles.entry(collectible), count); + } } data } diff --git a/crates/turbo-tasks-memory/tests/recompute_collectibles.rs b/crates/turbo-tasks-memory/tests/recompute_collectibles.rs new file mode 100644 index 0000000000000..7771df738fd15 --- /dev/null +++ b/crates/turbo-tasks-memory/tests/recompute_collectibles.rs @@ -0,0 +1,92 @@ +#![feature(arbitrary_self_types)] + +use anyhow::{bail, Result}; +use turbo_tasks::{emit, CollectiblesSource, RcStr, State, ValueToString, Vc}; +use turbo_tasks_testing::{register, run}; + +register!(); + +#[tokio::test] +async fn recompute() { + run! { + let input = ChangingInput { + state: State::new(1), + }.cell(); + let output = compute(input, 100); + let read = output.await?; + assert_eq!(read.value, 42); + assert_eq!(read.collectible, "1"); + + for i in 2..100 { + input.await?.state.set(i); + let read = output.strongly_consistent().await?; + assert_eq!(read.value, 42); + assert_eq!(read.collectible, i.to_string()); + } + } +} + +#[turbo_tasks::value] +struct ChangingInput { + state: State, +} + +#[turbo_tasks::value] +struct Output { + value: u32, + collectible: String, +} + +#[turbo_tasks::value] +struct Collectible { + value: u32, +} + +#[turbo_tasks::value_impl] +impl ValueToString for Collectible { + #[turbo_tasks::function] + fn to_string(&self) -> Vc { + Vc::cell(self.value.to_string().into()) + } +} + +#[turbo_tasks::function] +fn inner_compute(input: Vc) -> Vc { + inner_compute2(input, 1000) +} + +#[turbo_tasks::function] +async fn inner_compute2(input: Vc, innerness: u32) -> Result> { + if innerness > 0 { + return Ok(inner_compute2(input, innerness - 1)); + } + let collectible: Vc> = Vc::upcast( + Collectible { + value: *input.await?.state.get(), + } + .cell(), + ); + emit(collectible); + + Ok(Vc::cell(42)) +} + +#[turbo_tasks::function] +async fn compute(input: Vc, innerness: u32) -> Result> { + if innerness > 0 { + return Ok(compute(input, innerness - 1)); + } + let operation = inner_compute(input); + let value = *operation.await?; + let collectibles = operation.peek_collectibles::>(); + if collectibles.len() != 1 { + bail!("expected 1 collectible, found {}", collectibles.len()); + } + let first = *collectibles.iter().next().unwrap(); + let collectible = first.to_string().await?; + Ok(Output { + value, + collectible: collectible.to_string(), + } + .cell()) +} diff --git a/crates/turbo-tasks-testing/Cargo.toml b/crates/turbo-tasks-testing/Cargo.toml index 82b185512083c..71f1f31d9c6fc 100644 --- a/crates/turbo-tasks-testing/Cargo.toml +++ b/crates/turbo-tasks-testing/Cargo.toml @@ -17,5 +17,6 @@ anyhow = { workspace = true } auto-hash-map = { workspace = true } futures = { workspace = true } lazy_static = { workspace = true } +rustc-hash = { workspace = true } tokio = { workspace = true } turbo-tasks = { workspace = true } diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index 7224e7db52fc9..5088018b5daca 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -13,10 +13,9 @@ use std::{ }; use anyhow::{anyhow, Result}; -use auto_hash_map::AutoMap; use futures::FutureExt; use turbo_tasks::{ - backend::CellContent, + backend::{CellContent, TaskCollectiblesMap}, event::{Event, EventListener}, registry, test_helpers::with_turbo_tasks_for_testing, @@ -244,12 +243,12 @@ impl TurboTasksApi for VcStorage { fn unemit_collectibles( &self, _trait_type: turbo_tasks::TraitTypeId, - _collectibles: &AutoMap, + _collectibles: &TaskCollectiblesMap, ) { unimplemented!() } - fn read_task_collectibles(&self, _task: TaskId, _trait_id: TraitTypeId) -> AutoMap { + fn read_task_collectibles(&self, _task: TaskId, _trait_id: TraitTypeId) -> TaskCollectiblesMap { unimplemented!() } diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index 69aa087822de6..b5c8c8eabe415 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -1,9 +1,9 @@ use std::{ any::Any, borrow::Cow, - fmt, - fmt::{Debug, Display, Write}, + fmt::{self, Debug, Display, Write}, future::Future, + hash::BuildHasherDefault, mem::take, pin::Pin, sync::Arc, @@ -12,6 +12,7 @@ use std::{ use anyhow::{anyhow, bail, Result}; use auto_hash_map::AutoMap; +use rustc_hash::FxHasher; use serde::{Deserialize, Serialize}; use tracing::Span; @@ -276,6 +277,8 @@ impl CellContent { } } +pub type TaskCollectiblesMap = AutoMap, 1>; + pub trait Backend: Sync + Send { #[allow(unused_variables)] fn initialize(&mut self, task_id_provider: &dyn TaskIdProvider) {} @@ -388,7 +391,7 @@ pub trait Backend: Sync + Send { trait_id: TraitTypeId, reader: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> AutoMap; + ) -> TaskCollectiblesMap; fn emit_collectible( &self, diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index d6ff7ee10dfc7..2738a633e3948 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -24,7 +24,10 @@ use tracing::{info_span, instrument, trace_span, Instrument, Level}; use turbo_tasks_malloc::TurboMalloc; use crate::{ - backend::{Backend, CellContent, PersistentTaskType, TaskExecutionSpec, TransientTaskType}, + backend::{ + Backend, CellContent, PersistentTaskType, TaskCollectiblesMap, TaskExecutionSpec, + TransientTaskType, + }, capture_future::{self, CaptureFuture}, event::{Event, EventListener}, id::{BackendJobId, FunctionId, TraitTypeId}, @@ -109,11 +112,11 @@ pub trait TurboTasksApi: TurboTasksCallApi + Sync + Send { index: CellId, ) -> Result>; - fn read_task_collectibles(&self, task: TaskId, trait_id: TraitTypeId) -> AutoMap; + fn read_task_collectibles(&self, task: TaskId, trait_id: TraitTypeId) -> TaskCollectiblesMap; fn emit_collectible(&self, trait_type: TraitTypeId, collectible: RawVc); fn unemit_collectible(&self, trait_type: TraitTypeId, collectible: RawVc, count: u32); - fn unemit_collectibles(&self, trait_type: TraitTypeId, collectibles: &AutoMap); + fn unemit_collectibles(&self, trait_type: TraitTypeId, collectibles: &TaskCollectiblesMap); /// INVALIDATION: Be careful with this, it will not track dependencies, so /// using it could break cache invalidation. @@ -1010,7 +1013,7 @@ impl TurboTasksApi for TurboTasks { .try_read_own_task_cell_untracked(current_task, index, self) } - fn read_task_collectibles(&self, task: TaskId, trait_id: TraitTypeId) -> AutoMap { + fn read_task_collectibles(&self, task: TaskId, trait_id: TraitTypeId) -> TaskCollectiblesMap { self.backend.read_task_collectibles( task, trait_id, @@ -1038,7 +1041,7 @@ impl TurboTasksApi for TurboTasks { ); } - fn unemit_collectibles(&self, trait_type: TraitTypeId, collectibles: &AutoMap) { + fn unemit_collectibles(&self, trait_type: TraitTypeId, collectibles: &TaskCollectiblesMap) { for (&collectible, &count) in collectibles { if count > 0 { self.backend.unemit_collectible( From b3460d1d0fd072a3e5e9a97179a7efc1e1bf264b Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 18 Jul 2024 01:45:13 +0200 Subject: [PATCH 22/73] Refactor task arguments to be a single one (#8736) ### Description As preparation to pass a struct only, we change the task arguments to be a single one ### Testing Instructions --- .../src/derive/task_input_macro.rs | 4 +- crates/turbo-tasks-macros/src/func.rs | 6 +- crates/turbo-tasks-memory/src/lib.rs | 2 - .../turbo-tasks-memory/src/memory_backend.rs | 8 +- .../src/memory_backend_with_pg.rs | 1928 ----------------- crates/turbo-tasks-memory/src/task.rs | 12 +- crates/turbo-tasks-testing/src/lib.rs | 18 +- crates/turbo-tasks/src/backend.rs | 131 +- crates/turbo-tasks/src/manager.rs | 87 +- crates/turbo-tasks/src/native_function.rs | 4 +- .../src/task/concrete_task_input.rs | 7 + crates/turbo-tasks/src/task/function.rs | 136 +- crates/turbo-tasks/src/task/task_input.rs | 21 +- 13 files changed, 157 insertions(+), 2207 deletions(-) delete mode 100644 crates/turbo-tasks-memory/src/memory_backend_with_pg.rs diff --git a/crates/turbo-tasks-macros/src/derive/task_input_macro.rs b/crates/turbo-tasks-macros/src/derive/task_input_macro.rs index 04c60ee76389a..a6c0169096c66 100644 --- a/crates/turbo-tasks-macros/src/derive/task_input_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/task_input_macro.rs @@ -123,7 +123,7 @@ pub fn derive_task_input(input: TokenStream) -> TokenStream { _ => return Err(anyhow::anyhow!("invalid discriminant for {}", stringify!(#ident))), }) }, - _ => Err(anyhow::anyhow!("invalid task input type, expected list")), + _ => Err(anyhow::anyhow!("invalid task input type, expected list (enum)")), } }, quote! { @@ -155,7 +155,7 @@ pub fn derive_task_input(input: TokenStream) -> TokenStream { #try_from_expansion Ok(#ident #destructuring) }, - _ => Err(anyhow::anyhow!("invalid task input type, expected list")), + _ => Err(anyhow::anyhow!("invalid task input type, expected list (struct)")), } }, quote! { diff --git a/crates/turbo-tasks-macros/src/func.rs b/crates/turbo-tasks-macros/src/func.rs index 3e1a414cfa065..6c8129cd634b4 100644 --- a/crates/turbo-tasks-macros/src/func.rs +++ b/crates/turbo-tasks-macros/src/func.rs @@ -326,7 +326,7 @@ impl TurboFn { *#trait_type_id_ident, std::borrow::Cow::Borrowed(stringify!(#ident)), #converted_this, - vec![#converted_inputs], + turbo_tasks::TaskInput::into_concrete((#converted_inputs)), ) ) } @@ -352,7 +352,7 @@ impl TurboFn { turbo_tasks::dynamic_this_call( *#native_function_id_ident, #converted_this, - vec![#converted_inputs], + turbo_tasks::TaskInput::into_concrete((#converted_inputs)), ) ) } @@ -363,7 +363,7 @@ impl TurboFn { <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( turbo_tasks::dynamic_call( *#native_function_id_ident, - vec![#converted_inputs], + turbo_tasks::TaskInput::into_concrete((#converted_inputs)), ) ) } diff --git a/crates/turbo-tasks-memory/src/lib.rs b/crates/turbo-tasks-memory/src/lib.rs index 6dbce8623bc1c..b699dbaa71a70 100644 --- a/crates/turbo-tasks-memory/src/lib.rs +++ b/crates/turbo-tasks-memory/src/lib.rs @@ -14,11 +14,9 @@ mod edges_set; mod gc; mod map_guard; mod memory_backend; -mod memory_backend_with_pg; mod output; mod task; mod task_statistics; pub use memory_backend::MemoryBackend; -pub use memory_backend_with_pg::MemoryBackendWithPersistedGraph; pub use task_statistics::{TaskStatistics, TaskStatisticsApi}; diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 249bf4b8a2ca3..19560c4ae809c 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -548,12 +548,12 @@ impl Backend for MemoryBackend { PersistentTaskType::ResolveNative { fn_type: function_id, this: _, - args: _, + arg: _, } | PersistentTaskType::Native { fn_type: function_id, this: _, - args: _, + arg: _, } => { stats.increment_cache_hit(*function_id); } @@ -561,7 +561,7 @@ impl Backend for MemoryBackend { trait_type, method_name: name, this, - args: _, + arg: _, } => { // HACK: Resolve the this argument (`self`) in order to attribute the cache hit // to the concrete trait implementation, rather than the dynamic trait method. @@ -595,7 +595,7 @@ impl Backend for MemoryBackend { PersistentTaskType::Native { fn_type: function_id, this: _, - args: _, + arg: _, } => { stats.increment_cache_miss(*function_id); } diff --git a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs b/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs deleted file mode 100644 index 3c2c5e8c91983..0000000000000 --- a/crates/turbo-tasks-memory/src/memory_backend_with_pg.rs +++ /dev/null @@ -1,1928 +0,0 @@ -use std::{ - borrow::Cow, - collections::{BinaryHeap, HashMap}, - fmt::Debug, - future::Future, - mem::{replace, take}, - pin::Pin, - sync::{ - atomic::{AtomicU32, AtomicUsize, Ordering}, - Mutex, MutexGuard, - }, - time::Duration, -}; - -use anyhow::{anyhow, Result}; -use auto_hash_map::AutoSet; -use concurrent_queue::ConcurrentQueue; -use dashmap::{mapref::entry::Entry, DashMap, DashSet}; -use turbo_tasks::{ - backend::{ - Backend, BackendJobId, CellContent, PersistentTaskType, TaskCollectiblesMap, - TaskExecutionSpec, TransientTaskType, - }, - event::{Event, EventListener}, - persisted_graph::{ - ActivateResult, DeactivateResult, PersistResult, PersistTaskState, PersistedGraph, - PersistedGraphApi, ReadTaskState, TaskCell, TaskData, - }, - util::{IdFactoryWithReuse, NoMoveVec, SharedError}, - CellId, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, Unused, -}; - -type RootTaskFn = - Box Pin> + Send>> + Send + Sync>; - -enum TaskType { - Persistent(PersistentTaskType), - Root(RootTaskFn), - Once(Mutex> + Send + 'static>>>), -} - -impl Debug for TaskType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Persistent(ty) => f.debug_tuple("Persistent").field(ty).finish(), - Self::Root(_) => f.debug_tuple("Root").finish(), - Self::Once(_) => f.debug_tuple("Once").finish(), - } - } -} - -// dirty+active+scheduled -> clean+active+done -> dirty+active+done+scheduled - -#[derive(PartialEq, Eq, Copy, Clone, Debug, Default)] -enum TaskFreshness { - #[default] - NeverExecuted, - Dirty, - Done, -} - -#[derive(Debug)] -struct MemoryTaskState { - need_persist: bool, - has_changes: bool, - freshness: TaskFreshness, - cells: HashMap, - output: Option>, - output_dependent: TaskIdSet, - dependencies: AutoSet, - children: TaskIdSet, - event: Event, - event_cells: Event, -} - -impl MemoryTaskState { - fn new(task: TaskId, freshness: TaskFreshness) -> Self { - Self { - freshness, - need_persist: Default::default(), - has_changes: Default::default(), - cells: HashMap::default(), - output: Default::default(), - output_dependent: Default::default(), - dependencies: Default::default(), - children: Default::default(), - event: Event::new(move || format!("MemoryTaskState({task})::event")), - event_cells: Event::new(move || format!("MemoryTaskState({task})::event_cells")), - } - } -} - -#[derive(Default, Debug)] -struct PersistedTaskState { - clean: Option, -} - -#[derive(Default, Debug)] -struct TaskState { - memory: Option, - persisted: Option, - - /// the memory version is considered as active - active: bool, - - // cross activeness: - /// There are active parents in memory graph - /// that keep the persisted version active too - mem_to_persisted_active: bool, - - /// There are active parents in persisted graph - /// that keep the memory version active - persisted_to_mem_active: bool, - - scheduled: bool, -} - -struct Task { - task_type: TaskType, - task_state: Mutex, - active_parents: AtomicU32, -} - -enum BackgroundJob { - DeactivateTasks(Vec), - ActivatePersisted(TaskId), - DeactivatePersisted(TaskId), -} - -pub struct MemoryBackendWithPersistedGraph { - pub pg: P, - tasks: NoMoveVec, - cache: DashMap, - background_job_id_factory: IdFactoryWithReuse, - background_jobs: NoMoveVec, - only_known_to_memory_tasks: DashSet, - /// Tasks that were selected to persist - persist_queue1: ConcurrentQueue, - persist_queue1_queued: DashSet, - need_persisting: DashSet, - /// Task sorted by importance, sharded to avoid lock contention - persist_queue_by_duration: [Mutex>; 64], - persist_capacity: AtomicUsize, - persist_job: BackendJobId, - partial_lookups: DashMap, - #[cfg(feature = "unsafe_once_map")] - partial_lookup: turbo_tasks::util::OnceConcurrentlyMap, - #[cfg(not(feature = "unsafe_once_map"))] - partial_lookup: turbo_tasks::util::SafeOnceConcurrentlyMap, - - #[cfg(feature = "log_running_tasks")] - in_progress_tasks: Mutex>, -} - -impl MemoryBackendWithPersistedGraph

{ - pub fn new(pg: P) -> Self { - let background_job_id_factory = IdFactoryWithReuse::new(); - let persist_job = background_job_id_factory.get(); - Self { - pg, - tasks: NoMoveVec::new(), - cache: DashMap::new(), - background_job_id_factory, - background_jobs: NoMoveVec::new(), - only_known_to_memory_tasks: DashSet::new(), - persist_queue1: ConcurrentQueue::unbounded(), - persist_queue1_queued: DashSet::new(), - need_persisting: DashSet::new(), - persist_queue_by_duration: [(); 64].map(|_| Mutex::new(BinaryHeap::new())), - persist_capacity: AtomicUsize::new(num_cpus::get()), - persist_job, - partial_lookups: DashMap::new(), - #[cfg(feature = "unsafe_once_map")] - partial_lookup: turbo_tasks::util::OnceConcurrentlyMap::new(), - #[cfg(not(feature = "unsafe_once_map"))] - partial_lookup: turbo_tasks::util::SafeOnceConcurrentlyMap::new(), - #[cfg(feature = "log_running_tasks")] - in_progress_tasks: Mutex::new(HashSet::new()), - } - } - - fn state_mut( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> (MutexGuard<'_, TaskState>, &Task) { - let task_info = self.tasks.get(*task as usize).unwrap(); - let mut state = task_info.task_state.lock().unwrap(); - self.ensure_task_initialized(task, task_info, &mut state, turbo_tasks); - (state, task_info) - } - - fn mem_state_mut( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> (MutexGuard<'_, TaskState>, &Task) { - let task_info = self.tasks.get(*task as usize).unwrap(); - loop { - let mut delayed_activate = Vec::new(); - let mut state = task_info.task_state.lock().unwrap(); - self.ensure_task_in_memory(task, &mut state, &mut delayed_activate, turbo_tasks); - if delayed_activate.is_empty() { - return (state, task_info); - } - drop(state); - loop { - for task in take(&mut delayed_activate) { - let (state, task_info) = self.state_mut(task, turbo_tasks); - self.activate_task_inner( - task, - state, - task_info, - &mut delayed_activate, - turbo_tasks, - ); - } - if delayed_activate.is_empty() { - break; - } - } - } - } - - fn ensure_task_initialized( - &self, - task: TaskId, - task_info: &Task, - task_state: &mut TaskState, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - if task_state.memory.is_none() && task_state.persisted.is_none() { - if let TaskType::Persistent(_) = &task_info.task_type { - if self.pg_is_persisted(task, turbo_tasks) { - task_state.persisted = Some(PersistedTaskState { clean: None }); - } else { - task_state.memory = - Some(MemoryTaskState::new(task, TaskFreshness::NeverExecuted)); - } - } else { - // We must never have not initizalized transient task in the cache - // This is ensured by initializing the task when creating it - unreachable!(); - } - } - } - - fn ensure_task_in_memory( - &self, - task: TaskId, - task_state: &mut TaskState, - delayed_activate: &mut Vec, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - if task_state.memory.is_none() { - if let Some((data, state)) = self.pg_read(task, turbo_tasks) { - task_state.persisted = Some(PersistedTaskState { - clean: Some(state.clean), - }); - let mem_state = MemoryTaskState { - freshness: if state.clean { - TaskFreshness::Done - } else { - TaskFreshness::Dirty - }, - cells: data - .cells - .into_iter() - .map(|(k, s)| (k, (s, AutoSet::default()))) - .collect(), - output: Some(Ok(data.output)), - output_dependent: AutoSet::default(), - dependencies: data.dependencies.into_iter().collect(), - children: data.children.into_iter().collect(), - need_persist: Default::default(), - has_changes: Default::default(), - event: Event::new(move || format!("MemoryTaskState({task})::event")), - event_cells: Event::new(move || { - format!("MemoryTaskState({task})::event_cells") - }), - }; - if task_state.active { - for &child in mem_state.children.iter() { - self.try_increment_active_parents( - child, - false, - 1, - delayed_activate, - turbo_tasks, - ); - } - } - if !task_state.persisted_to_mem_active && state.keeps_external_active { - delayed_activate.push(task); - } - task_state.persisted_to_mem_active = state.keeps_external_active; - task_state.memory = Some(mem_state); - if !state.clean && task_state.active && !task_state.scheduled { - task_state.scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in ensure_task_in_memory"); - turbo_tasks.schedule(task); - } - } else { - task_state.memory = Some(MemoryTaskState::new(task, TaskFreshness::NeverExecuted)); - } - } - } - - fn lookup( - &self, - task_type: &PersistentTaskType, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - for i in 0..task_type.len() { - let partial = task_type.partial(i); - let complete_cached = self.partial_lookups.get(&partial).map(|x| *x); - let complete = complete_cached.unwrap_or_else(|| { - self.partial_lookup.action(&partial, || { - let complete = self.pg_lookup(&partial, turbo_tasks); - self.partial_lookups.insert(partial.clone(), complete); - complete - }) - }); - if complete { - return self.cache.get(task_type).map(|x| *x); - } - } - self.pg_lookup_one(task_type, turbo_tasks) - } - - fn connect( - &self, - parent_task: TaskId, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - // connect() will never be called concurrently for the same parent_task - // therefore it's safe to add the task into children before incrementing - // active_parents. - // An active_parents underflow can't happen because of that. - - let (mut state, _) = self.mem_state_mut(parent_task, turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - if !mem_state.children.insert(task) { - return; - } - let memory_active = state.active; - drop(state); - - #[cfg(feature = "log_connect_tasks")] - println!("connect({parent_task} -> {task}) (memory_active={memory_active})"); - if memory_active { - self.increment_active_parents(task, 1, turbo_tasks); - } - } - - fn connect_already_counted( - &self, - parent_task: TaskId, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - // The active_parents count was already initialized with 1 - // When this was incorrect, we need to revert that. - let (mut state, _) = self.mem_state_mut(parent_task, turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - if !mem_state.children.insert(task) { - // revert already increased count as it has already been added a child before - drop(state); - self.decrement_active_parents(task, 1, turbo_tasks); - return; - } - #[cfg(feature = "log_connect_tasks")] - println!( - "connect_already_counted({parent_task} -> {task}) (memory_active={})", - state.active - ); - if !state.active { - // revert already increased count as the parent task is not active - drop(state); - self.decrement_active_parents(task, 1, turbo_tasks); - } - } - - fn schedule_background_job( - &self, - job: BackgroundJob, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let id = self.background_job_id_factory.get(); - // SAFETY: It's a fresh id - unsafe { - self.background_jobs.insert(*id as usize, job); - } - turbo_tasks.schedule_backend_background_job(id); - } - - fn activate_persisted( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - if let Some(ActivateResult { - keeps_external_active, - external, - dirty, - more_tasks_to_activate, - }) = self.pg_activate_when_needed(task, turbo_tasks) - { - for task in more_tasks_to_activate { - self.schedule_background_job(BackgroundJob::ActivatePersisted(task), turbo_tasks); - } - let (mut state, task_info) = self.state_mut(task, turbo_tasks); - if dirty && state.memory.is_none() && !state.scheduled { - state.scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in activate_persisted"); - turbo_tasks.schedule(task); - } - if (external || state.memory.is_some()) - && state.persisted_to_mem_active != keeps_external_active - { - state.persisted_to_mem_active = keeps_external_active; - if keeps_external_active { - self.activate_task(task, state, task_info, turbo_tasks) - } else { - self.deactivate_task(task, state, task_info, turbo_tasks) - } - } - } - } - - fn deactivate_persisted( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - if let Some(DeactivateResult { - more_tasks_to_deactivate, - }) = self.pg_deactivate_when_needed(task, turbo_tasks) - { - for task in more_tasks_to_deactivate { - self.schedule_background_job(BackgroundJob::DeactivatePersisted(task), turbo_tasks); - } - let (mut state, task_info) = self.state_mut(task, turbo_tasks); - if state.persisted_to_mem_active { - state.persisted_to_mem_active = false; - self.deactivate_task(task, state, task_info, turbo_tasks); - } - } - } - - fn increment_active_parents( - &self, - task: TaskId, - by: u32, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut delayed_activate = Vec::new(); - self.try_increment_active_parents(task, true, by, &mut delayed_activate, turbo_tasks); - while !delayed_activate.is_empty() { - for task in take(&mut delayed_activate) { - let (state, task_info) = self.state_mut(task, turbo_tasks); - self.activate_task_inner( - task, - state, - task_info, - &mut delayed_activate, - turbo_tasks, - ); - } - } - } - - fn try_increment_active_parents( - &self, - task: TaskId, - force: bool, - by: u32, - delayed_activate: &mut Vec, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let task_info = self.tasks.get(*task as usize).unwrap(); - let prev = task_info.active_parents.fetch_add(by, Ordering::Relaxed); - if prev == 0 { - // only the connect() call that increases from 0 is responsible for activating - let mut state = if force { - task_info.task_state.lock().unwrap() - } else { - match task_info.task_state.try_lock() { - Ok(state) => state, - Err(_) => { - delayed_activate.push(task); - return; - } - } - }; - self.ensure_task_initialized(task, task_info, &mut state, turbo_tasks); - self.activate_task_inner(task, state, task_info, delayed_activate, turbo_tasks); - } - } - - fn activate_task( - &self, - task: TaskId, - state: MutexGuard, - task_info: &Task, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut delayed_activate = Vec::new(); - self.activate_task_inner(task, state, task_info, &mut delayed_activate, turbo_tasks); - while !delayed_activate.is_empty() { - for task in take(&mut delayed_activate) { - let (state, task_info) = self.state_mut(task, turbo_tasks); - self.activate_task_inner( - task, - state, - task_info, - &mut delayed_activate, - turbo_tasks, - ); - } - } - } - - fn activate_task_inner( - &self, - task: TaskId, - mut state: MutexGuard, - task_info: &Task, - delayed_activate: &mut Vec, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let TaskState { - ref mut active, - ref persisted_to_mem_active, - ref persisted, - ref mut mem_to_persisted_active, - ref mut scheduled, - ref memory, - .. - } = *state; - let mut activate_persisted = false; - let mut deactivate_persisted = false; - let has_active_parents = task_info.active_parents.load(Ordering::Acquire) > 0; - if persisted.is_some() && !*mem_to_persisted_active && has_active_parents { - *mem_to_persisted_active = true; - if self.pg_set_externally_active(task, turbo_tasks) { - activate_persisted = true; - } - } - if *mem_to_persisted_active && !has_active_parents { - *mem_to_persisted_active = false; - if self.pg_unset_externally_active(task, turbo_tasks) { - deactivate_persisted = true; - } - } - if !*active && (has_active_parents || *persisted_to_mem_active) { - *active = true; - #[cfg(feature = "log_activate_tasks")] - println!("activate {task}"); - if let Some(MemoryTaskState { - freshness, - children, - .. - }) = memory - { - if !*scheduled && *freshness != TaskFreshness::Done { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in activate_task_inner"); - turbo_tasks.schedule(task); - } - for child in children.iter() { - self.try_increment_active_parents( - *child, - false, - 1, - delayed_activate, - turbo_tasks, - ); - } - } - } - drop(state); - if activate_persisted { - self.activate_persisted(task, turbo_tasks); - } - if deactivate_persisted { - self.deactivate_persisted(task, turbo_tasks); - } - } - - fn decrement_active_parents( - &self, - task: TaskId, - by: u32, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - self.decrement_active_parents_limited(&[(task, by)], 0, turbo_tasks); - } - - fn decrement_active_parents_limited( - &self, - tasks: &[(TaskId, u32)], - remaining_depth: u8, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut delayed_deactivate = Vec::new(); - for (task, by) in tasks { - self.try_decrement_active_parents( - *task, - *by, - remaining_depth, - &mut delayed_deactivate, - turbo_tasks, - ); - } - if !delayed_deactivate.is_empty() { - self.schedule_background_job( - BackgroundJob::DeactivateTasks(delayed_deactivate), - turbo_tasks, - ); - } - } - - fn try_decrement_active_parents( - &self, - task: TaskId, - by: u32, - remaining_depth: u8, - delayed_deactivate: &mut Vec, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let task_info = self.tasks.get(*task as usize).unwrap(); - let prev = task_info.active_parents.fetch_sub(by, Ordering::Relaxed); - if prev == by { - // count reached zero - let mut state = if remaining_depth > 0 { - match task_info.task_state.try_lock() { - Ok(state) => state, - Err(_) => { - delayed_deactivate.push(task); - return; - } - } - } else { - delayed_deactivate.push(task); - return; - }; - self.ensure_task_initialized(task, task_info, &mut state, turbo_tasks); - self.deactivate_task_inner( - task, - state, - task_info, - remaining_depth - 1, - delayed_deactivate, - turbo_tasks, - ); - } - } - - fn deactivate_task( - &self, - task: TaskId, - state: MutexGuard, - task_info: &Task, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut delayed_deactivate = Vec::new(); - self.deactivate_task_inner( - task, - state, - task_info, - 2, - &mut delayed_deactivate, - turbo_tasks, - ); - if !delayed_deactivate.is_empty() { - self.schedule_background_job( - BackgroundJob::DeactivateTasks(delayed_deactivate), - turbo_tasks, - ); - } - } - - fn deactivate_tasks( - &self, - tasks: &[TaskId], - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut delayed_deactivate = Vec::new(); - for task in tasks { - let (state, task_info) = self.state_mut(*task, turbo_tasks); - self.deactivate_task_inner( - *task, - state, - task_info, - 2, - &mut delayed_deactivate, - turbo_tasks, - ); - } - if !delayed_deactivate.is_empty() { - self.schedule_background_job( - BackgroundJob::DeactivateTasks(delayed_deactivate), - turbo_tasks, - ); - } - } - - fn deactivate_task_inner( - &self, - task: TaskId, - mut state: MutexGuard, - task_info: &Task, - remaining_depth: u8, - delayed_deactivate: &mut Vec, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let mut deactivate_persisted = false; - let TaskState { - ref mut active, - ref mut mem_to_persisted_active, - ref memory, - .. - } = *state; - if *active && task_info.active_parents.load(Ordering::Acquire) == 0 { - *active = false; - if *mem_to_persisted_active { - *mem_to_persisted_active = false; - if self.pg_unset_externally_active(task, turbo_tasks) { - deactivate_persisted = true; - } - } - if let Some(MemoryTaskState { ref children, .. }) = memory { - for child in children.iter() { - self.try_decrement_active_parents( - *child, - 1, - remaining_depth, - delayed_deactivate, - turbo_tasks, - ); - } - } - } - drop(state); - if deactivate_persisted { - self.deactivate_persisted(task, turbo_tasks); - } - } - - fn persist( - &self, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - loop { - if let Ok(mut task) = self.persist_queue1.pop() { - self.persist_queue1_queued.remove(&task); - 'outer: loop { - self.need_persisting.remove(&task); - let (mut state, task_info) = self.state_mut(task, turbo_tasks); - if let TaskState { - ref mut persisted, - ref mut mem_to_persisted_active, - memory: - Some(MemoryTaskState { - freshness: TaskFreshness::Done, - ref mut need_persist, - ref output, - ref mut has_changes, - ref children, - ref dependencies, - ref cells, - .. - }), - .. - } = *state - { - if *need_persist || persisted.is_none() { - *need_persist = false; - if let TaskType::Persistent(_task_type) = &task_info.task_type { - if let &Some(Ok(output)) = &output { - if *has_changes || persisted.is_none() { - for higher_prio_task in dependencies - .iter() - .map(|vc| vc.get_task_id()) - .chain(children.iter().copied()) - { - if self.need_persisting.contains(&higher_prio_task) { - if self.persist_queue1_queued.insert(task) { - self.persist_queue1.push(task).unwrap(); - } - task = higher_prio_task; - continue 'outer; - } - } - if !dependencies.is_empty() { - for dep in dependencies.iter() { - let task = dep.get_task_id(); - self.only_known_to_memory_tasks.remove(&task); - } - } - let data = TaskData { - children: children.iter().cloned().collect(), - dependencies: dependencies.iter().cloned().collect(), - cells: cells - .iter() - .map(|(k, (s, _))| (*k, s.clone())) - .collect(), - output: *output, - }; - let externally_active = - task_info.active_parents.load(Ordering::Acquire) > 0; - let task_state = - turbo_tasks::persisted_graph::PersistTaskState { - externally_active, - }; - if let Some(PersistResult { - tasks_to_activate, - tasks_to_deactivate, - }) = self.pg_persist(task, data, task_state, turbo_tasks) - { - *persisted = - Some(PersistedTaskState { clean: Some(true) }); - *has_changes = false; - *mem_to_persisted_active = externally_active; - drop(state); - for task in tasks_to_activate { - self.activate_persisted(task, turbo_tasks); - } - for task in tasks_to_deactivate { - self.schedule_background_job( - BackgroundJob::DeactivatePersisted(task), - turbo_tasks, - ) - } - return true; - } else { - println!( - "task {task} failed to persist: {:?}", - task_info.task_type - ); - } - } else { - self.pg_make_clean(task, turbo_tasks); - return true; - } - } - } - } - } - break; - } - continue; - } - - let mut did_something = false; - for queue in self.persist_queue_by_duration.iter() { - let mut queue = queue.lock().unwrap(); - if let Some((_dur, task)) = queue.pop() { - let (state, _) = self.state_mut(task, turbo_tasks); - if let Some(MemoryTaskState { - dependencies: _, .. - }) = &state.memory - { - // let dependencies = dependencies - // .iter() - // .map(|d| d.get_task_id()) - // .collect::>(); - // for dep in dependencies { - // if self.persist_queue1_queued.insert(dep) { - // self.persist_queue1.push(dep).unwrap(); - // did_something = true; - // } - // } - if self.persist_queue1_queued.insert(task) { - self.persist_queue1.push(task).unwrap(); - did_something = true; - } - } - } - } - - return did_something; - } - } - - fn has_persist_work(&self) -> bool { - !self.persist_queue1.is_empty() - || self - .persist_queue_by_duration - .iter() - .any(|q| !q.lock().unwrap().is_empty()) - } - - fn increase_persist_workers( - &self, - n: usize, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - loop { - let capacity = self.persist_capacity.load(Ordering::Acquire); - if capacity == 0 { - break; - } - let can_start = std::cmp::min(capacity, n); - if self - .persist_capacity - .compare_exchange( - capacity, - capacity - can_start, - Ordering::Release, - Ordering::Relaxed, - ) - .is_ok() - { - for _ in 0..can_start { - turbo_tasks.schedule_backend_background_job(self.persist_job); - } - } - } - } -} - -impl Backend for MemoryBackendWithPersistedGraph

{ - fn startup(&self, turbo_tasks: &dyn TurboTasksBackendApi>) { - let (tasks_to_activate, tasks_to_deactivate) = - self.pg_get_pending_active_update(turbo_tasks); - let tasks = self.pg_get_active_external_tasks(turbo_tasks); - let dirty_tasks = self.pg_get_dirty_active_tasks(turbo_tasks); - - for task in tasks.iter() { - #[allow(unused_variables)] - let (mut state, task_info) = self.state_mut(*task, turbo_tasks); - state.persisted_to_mem_active = true; - state.memory = Some(MemoryTaskState::new(*task, TaskFreshness::NeverExecuted)); - #[cfg(feature = "log_running_tasks")] - { - println!( - "restored external active task {} {:?}", - task, task_info.task_type - ); - } - } - for task in dirty_tasks.iter() { - #[allow(unused_variables)] - let (mut state, task_info) = self.state_mut(*task, turbo_tasks); - state.persisted_to_mem_active = true; - state.persisted = Some(PersistedTaskState { clean: Some(false) }); - #[cfg(feature = "log_running_tasks")] - { - println!( - "restored dirty active task {} {:?}", - task, task_info.task_type - ); - } - - // On startup this is never scheduled yet - state.scheduled = true; - } - for task in tasks.into_iter() { - let (state, task_info) = self.state_mut(task, turbo_tasks); - self.activate_task(task, state, task_info, turbo_tasks); - } - - for task in dirty_tasks.into_iter() { - let (state, task_info) = self.state_mut(task, turbo_tasks); - self.activate_task(task, state, task_info, turbo_tasks); - // Activate would not schedule it since it's not in memory - turbo_tasks.schedule(task); - } - for task in tasks_to_activate { - #[cfg(feature = "log_running_tasks")] - { - let (state, task_info) = self.state_mut(task, turbo_tasks); - println!( - "continue pending activate {} {:?}", - task, task_info.task_type - ); - } - self.activate_persisted(task, turbo_tasks); - } - for task in tasks_to_deactivate { - #[cfg(feature = "log_running_tasks")] - { - let (state, task_info) = self.state_mut(task, turbo_tasks); - println!( - "continue pending deactivate {} {:?}", - task, task_info.task_type - ); - } - self.schedule_background_job(BackgroundJob::DeactivatePersisted(task), turbo_tasks); - } - } - - fn stop(&self, turbo_tasks: &dyn TurboTasksBackendApi>) { - self.pg_stop(turbo_tasks); - } - - fn invalidate_task( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let (mut state, _) = self.state_mut(task, turbo_tasks); - - if let Some(MemoryTaskState { freshness, .. }) = &mut state.memory { - if *freshness != TaskFreshness::Dirty { - *freshness = TaskFreshness::Dirty; - if state.active && !state.scheduled { - state.scheduled = true; - turbo_tasks.schedule(task); - } - } - } - if let Some(PersistedTaskState { clean, .. }) = &mut state.persisted { - if *clean != Some(false) && self.pg_make_dirty(task, turbo_tasks) { - *clean = Some(false); - if !state.scheduled { - state.scheduled = true; - turbo_tasks.schedule(task); - } - } - } - } - - fn invalidate_tasks( - &self, - tasks: &[TaskId], - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - for &task in tasks { - self.invalidate_task(task, turbo_tasks); - } - } - - fn invalidate_tasks_set( - &self, - tasks: &TaskIdSet, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - for &task in tasks { - self.invalidate_task(task, turbo_tasks); - } - } - - fn get_task_description(&self, task: TaskId) -> String { - let task_info = self.tasks.get(*task as usize).unwrap(); - format!("{:?}", task_info.task_type) - } - - type ExecutionScopeFuture> + Send + 'static> = T; - fn execution_scope> + Send + 'static>( - &self, - _task: TaskId, - future: T, - ) -> Self::ExecutionScopeFuture { - future - } - - fn try_start_task_execution( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - let (mut state, task_info) = self.mem_state_mut(task, turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - if mem_state.freshness == TaskFreshness::Done { - state.scheduled = false; - return None; - } - #[cfg(feature = "log_running_tasks")] - { - let mut t = self.in_progress_tasks.lock().unwrap(); - t.insert(task); - println!("start {} {:?}", task, task_info.task_type); - } - mem_state.freshness = TaskFreshness::NeverExecuted; - let deps = take(&mut mem_state.dependencies); - let children = take(&mut mem_state.children); - drop(state); - for dep in deps { - let (mut state, _) = self.mem_state_mut(dep.get_task_id(), turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - match dep { - RawVc::TaskOutput(_) => { - mem_state.output_dependent.remove(&task); - } - RawVc::TaskCell(_, i) => { - if let Some((_, dependent)) = mem_state.cells.get_mut(&i) { - dependent.remove(&task); - } - } - } - } - for child in children { - self.decrement_active_parents(child, 1, turbo_tasks); - } - let future = match &task_info.task_type { - TaskType::Persistent(t) => t.clone().run(turbo_tasks.pin()), - TaskType::Root(root) => root(), - TaskType::Once(once) => { - let mut m = once.lock().unwrap(); - replace( - &mut *m, - Box::pin(async { Err(anyhow::anyhow!("Once task can only be executed once")) }), - ) - } - }; - Some(TaskExecutionSpec { - future, - span: tracing::Span::none(), - }) - } - - fn task_execution_result( - &self, - task: TaskId, - result: Result, Option>>, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let (mut state, _task_info) = self.mem_state_mut(task, turbo_tasks); - let TaskState { ref mut memory, .. } = *state; - let mem_state = memory.as_mut().unwrap(); - let result = result.unwrap_or_else(|panic| match panic { - Some(message) => Err(anyhow!("A task panicked: {message}")), - None => Err(anyhow!("A task panicked")), - }); - let output_change = if let (Some(Ok(old)), Ok(new)) = (&mem_state.output, &result) { - old != new - } else { - true - }; - let dependent = if output_change { - mem_state.has_changes = true; - mem_state.output = Some(result.map_err(SharedError::new)); - take(&mut mem_state.output_dependent) - } else { - AutoSet::default() - }; - - drop(state); - - if !dependent.is_empty() { - turbo_tasks.schedule_notify_tasks_set(&dependent); - } - } - - fn task_execution_completed( - &self, - task: TaskId, - duration: Duration, - _memory_usage: usize, - _stateful: bool, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - #[cfg(feature = "log_running_tasks")] - { - println!("done {}", task); - let mut t = self.in_progress_tasks.lock().unwrap(); - t.remove(&task); - println!("running {:?}", t.iter().take(10).collect::>()); - } - let (mut state, task_info) = self.mem_state_mut(task, turbo_tasks); - let TaskState { - ref mut scheduled, - ref mut memory, - ref mut persisted, - .. - } = *state; - let mem_state = memory.as_mut().unwrap(); - if mem_state.freshness == TaskFreshness::Dirty { - return true; - } - mem_state.freshness = TaskFreshness::Done; - *scheduled = false; - mem_state.event.notify(usize::MAX); - mem_state.event_cells.notify(usize::MAX); - mem_state.need_persist = true; - let has_changes = mem_state.has_changes; - let is_persisted = persisted.is_some(); - let is_dirty_persisted = persisted - .as_ref() - .map(|p| p.clean != Some(true)) - .unwrap_or_default(); - drop(state); - - if let TaskType::Persistent(_) = task_info.task_type { - if has_changes && (is_persisted || !self.only_known_to_memory_tasks.contains(&task)) { - for task in self.pg_make_dependent_dirty(RawVc::TaskOutput(task), turbo_tasks) { - let (mut state, _) = self.state_mut(task, turbo_tasks); - if !state.scheduled { - state.scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in task_execution_completed"); - turbo_tasks.schedule(task); - } - } - } - if has_changes || is_dirty_persisted { - self.need_persisting.insert(task); - self.persist_queue_by_duration - [*task as usize % self.persist_queue_by_duration.len()] - .lock() - .unwrap() - .push((duration, task)); - self.increase_persist_workers(1, turbo_tasks); - } - } - - false - } - - fn run_backend_job<'a>( - &'a self, - id: BackendJobId, - turbo_tasks: &'a dyn TurboTasksBackendApi>, - ) -> Pin + Send + 'a>> { - if id == self.persist_job { - return Box::pin(async { - if self.persist(turbo_tasks) { - turbo_tasks.schedule_backend_background_job(self.persist_job); - } else { - self.persist_capacity.fetch_add(1, Ordering::Relaxed); - if self.has_persist_work() { - // Might be a race condition, work was just added before - // we reduced persist_capacity. To avoid a stall we will - // increase the workers again in this situation. - self.increase_persist_workers(1, turbo_tasks) - } - } - }); - } - // SAFETY: We are the only owner of this id - let job = unsafe { self.background_jobs.take(*id as usize) }; - unsafe { - self.background_job_id_factory.reuse(id); - } - if let Some(job) = job { - match job { - BackgroundJob::DeactivateTasks(tasks) => Box::pin(async move { - for chunk in tasks.chunks(10) { - self.deactivate_tasks(chunk, turbo_tasks) - } - }), - BackgroundJob::ActivatePersisted(task) => { - Box::pin(async move { self.activate_persisted(task, turbo_tasks) }) - } - BackgroundJob::DeactivatePersisted(task) => { - Box::pin(async move { self.deactivate_persisted(task, turbo_tasks) }) - } - } - } else { - Box::pin(async {}) - } - } - - fn try_read_task_output( - &self, - task: TaskId, - reader: TaskId, - _strongly_consistent: bool, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Result> { - let (mut state, _task_info) = self.mem_state_mut(task, turbo_tasks); - let TaskState { - ref mut scheduled, - ref mut memory, - .. - } = *state; - let mem_state = memory.as_mut().unwrap(); - if mem_state.freshness != TaskFreshness::Done { - let listener = mem_state.event.listen(); - if !*scheduled { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!( - "schedule({task}) in try_read_task_output[{:?}]", - mem_state.freshness - ); - turbo_tasks.schedule(task); - } - #[cfg(feature = "log_running_tasks")] - println!("waiting {} waits on {}: {:?}", reader, task, state); - return Ok(Err(listener)); - } - let need_dependency = mem_state.output_dependent.insert(reader); - let result = Ok(Ok(mem_state.output.as_ref().unwrap().clone()?)); - drop(state); - if need_dependency { - let (mut state, _) = self.mem_state_mut(reader, turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - mem_state.dependencies.insert(RawVc::TaskOutput(task)); - } - result - } - - fn try_read_task_output_untracked( - &self, - task: TaskId, - _strongly_consistent: bool, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Result> { - let (state, task_info) = self.mem_state_mut(task, turbo_tasks); - let mem_state = state.memory.as_ref().unwrap(); - if mem_state.freshness != TaskFreshness::Done { - let listener = mem_state.event.listen(); - if !state.active { - self.activate_task(task, state, task_info, turbo_tasks); - } - #[cfg(feature = "log_running_tasks")] - println!("waiting ?? waits on {}", task); - return Ok(Err(listener)); - } - Ok(Ok(mem_state.output.as_ref().unwrap().clone()?)) - } - - fn try_read_task_cell( - &self, - task: TaskId, - index: CellId, - reader: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Result> { - let (mut state, _task_info) = self.mem_state_mut(task, turbo_tasks); - let TaskState { - ref mut scheduled, - ref mut memory, - .. - } = *state; - let mem_state = memory.as_mut().unwrap(); - if mem_state.freshness == TaskFreshness::NeverExecuted { - if !*scheduled { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in try_read_task_cell[NeverExecuted]"); - turbo_tasks.schedule(task); - } - #[cfg(feature = "log_running_tasks")] - println!("waiting (fresh task) {} waits on {}", reader, task); - return Ok(Err(mem_state.event_cells.listen())); - } - if let Some((cell, dependent)) = mem_state.cells.get_mut(&index) { - match cell { - TaskCell::Content(content) => { - let content = content.clone(); - let need_dependency = dependent.insert(reader); - drop(state); - if need_dependency { - let (mut state, _) = self.mem_state_mut(reader, turbo_tasks); - let mem_state = state.memory.as_mut().unwrap(); - mem_state.dependencies.insert(RawVc::TaskCell(task, index)); - } - Ok(Ok(content)) - } - TaskCell::NeedComputation => { - if mem_state.freshness != TaskFreshness::Dirty { - mem_state.freshness = TaskFreshness::Dirty; - if !*scheduled { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in try_read_task_cell[NeedComputation]"); - turbo_tasks.schedule(task); - } - } - #[cfg(feature = "log_running_tasks")] - println!("waiting (need computation) {} waits on {}", reader, task); - Ok(Err(mem_state.event.listen())) - } - } - } else { - if !*scheduled { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in try_read_task_cell[Cell missing]"); - turbo_tasks.schedule(task); - } - #[cfg(feature = "log_running_tasks")] - println!("waiting (incomplete task) {} waits on {}", reader, task); - Ok(Err(mem_state.event_cells.listen())) - } - } - - fn try_read_task_cell_untracked( - &self, - task: TaskId, - index: CellId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Result> { - let (mut state, _) = self.mem_state_mut(task, turbo_tasks); - let TaskState { - ref mut scheduled, - ref mut memory, - .. - } = *state; - let mem_state = memory.as_mut().unwrap(); - let (cell, _) = mem_state - .cells - .get(&index) - .ok_or_else(|| anyhow!("Cannot read non-existing cell"))?; - match cell { - TaskCell::Content(content) => { - let content = content.clone(); - drop(state); - Ok(Ok(content)) - } - TaskCell::NeedComputation => { - if mem_state.freshness != TaskFreshness::Dirty { - mem_state.freshness = TaskFreshness::Dirty; - if !*scheduled { - *scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in try_read_task_cell_untracked"); - turbo_tasks.schedule(task); - } - } - Ok(Err(mem_state.event.listen())) - } - } - } - - fn try_read_own_task_cell_untracked( - &self, - task: TaskId, - index: CellId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Result { - let (state, _) = self.mem_state_mut(task, turbo_tasks); - let mem_state = state.memory.as_ref().unwrap(); - if let Some((cell, _)) = mem_state.cells.get(&index) { - match cell { - TaskCell::Content(content) => Ok(content.clone()), - TaskCell::NeedComputation => Ok(CellContent(None)), - } - } else { - Ok(CellContent(None)) - } - } - - fn read_task_collectibles( - &self, - _task: TaskId, - _trait_id: TraitTypeId, - _reader: TaskId, - _turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> TaskCollectiblesMap { - todo!() - } - - fn emit_collectible( - &self, - _trait_id: TraitTypeId, - _collectible: RawVc, - _task: TaskId, - _turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - todo!() - } - - fn unemit_collectible( - &self, - _trait_id: TraitTypeId, - _collectible: RawVc, - _count: u32, - _task: TaskId, - _turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - todo!() - } - - fn update_task_cell( - &self, - task: TaskId, - index: CellId, - content: CellContent, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - let (mut state, task_info) = self.mem_state_mut(task, turbo_tasks); - let TaskState { - ref mut memory, - ref mut persisted, - .. - } = *state; - let mem_state = memory.as_mut().unwrap(); - mem_state.has_changes = true; - let (cell, dependent) = mem_state.cells.entry(index).or_default(); - *cell = TaskCell::Content(content); - mem_state.event_cells.notify(usize::MAX); - let is_persisted = persisted.is_some(); - if !dependent.is_empty() { - let dependent = take(dependent); - drop(state); - turbo_tasks.schedule_notify_tasks_set(&dependent); - } else { - drop(state); - } - if let TaskType::Persistent(_) = task_info.task_type { - if is_persisted || !self.only_known_to_memory_tasks.contains(&task) { - for task in self.pg_make_dependent_dirty(RawVc::TaskCell(task, index), turbo_tasks) - { - let (mut state, _) = self.state_mut(task, turbo_tasks); - if !state.scheduled { - state.scheduled = true; - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in update_task_cell"); - turbo_tasks.schedule(task); - } - } - } - } - } - - fn get_or_create_persistent_task( - &self, - task_type: PersistentTaskType, - parent_task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> TaskId { - if let Some(task) = self.cache.get(&task_type) { - self.connect(parent_task, *task, turbo_tasks); - return *task; - } - if let Some(task) = self.lookup(&task_type, turbo_tasks) { - // a return value from lookup was already added to the cache by the id mapping - self.connect(parent_task, task, turbo_tasks); - return task; - } - - let task = turbo_tasks.get_fresh_task_id(); - let task = task.into(); - let new_task = Task { - active_parents: AtomicU32::new(1), - task_state: Mutex::new(TaskState { - scheduled: true, - memory: Some(MemoryTaskState::new(task, TaskFreshness::NeverExecuted)), - persisted: None, - active: true, - ..Default::default() - }), - task_type: TaskType::Persistent(task_type.clone()), - }; - // SAFETY: It's a fresh task id - unsafe { - self.tasks.insert(*task as usize, new_task); - } - match self.cache.entry(task_type) { - Entry::Occupied(e) => { - let existing_task = *e.into_ref(); - // SAFETY: We are still the only owner of this task and id - unsafe { - self.tasks.remove(*task as usize); - let task = Unused::new_unchecked(task); - turbo_tasks.reuse_task_id(task); - } - self.connect(parent_task, existing_task, turbo_tasks); - existing_task - } - Entry::Vacant(e) => { - e.insert(task); - self.only_known_to_memory_tasks.insert(task); - #[cfg(feature = "log_scheduled_tasks")] - println!("schedule({task}) in get_or_create_persistent_task"); - turbo_tasks.schedule(task); - self.connect_already_counted(parent_task, task, turbo_tasks); - task - } - } - } - - fn connect_task( - &self, - _task: TaskId, - _parent_task: TaskId, - _turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - todo!() - } - - fn create_transient_task( - &self, - task_type: TransientTaskType, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> TaskId { - let task = turbo_tasks.get_fresh_task_id(); - let task = task.into(); - let new_task = Task { - active_parents: AtomicU32::new(1), - task_state: Mutex::new(TaskState { - scheduled: true, - memory: Some(MemoryTaskState::new(task, TaskFreshness::NeverExecuted)), - persisted: None, - active: true, - ..Default::default() - }), - task_type: match task_type { - TransientTaskType::Root(r) => TaskType::Root(r), - TransientTaskType::Once(o) => TaskType::Once(Mutex::new(o)), - }, - }; - // SAFETY: It's a fresh task id - unsafe { - self.tasks.insert(*task as usize, new_task); - } - self.only_known_to_memory_tasks.insert(task); - task - } - - fn dispose_root_task(&self, _task: TaskId, _turbo_tasks: &dyn TurboTasksBackendApi) { - todo!() - } -} - -struct MemoryBackendPersistedGraphApi<'a, P: PersistedGraph + 'static> { - backend: &'a MemoryBackendWithPersistedGraph

, - turbo_tasks: &'a dyn TurboTasksBackendApi>, -} - -impl<'a, P: PersistedGraph> PersistedGraphApi for MemoryBackendPersistedGraphApi<'a, P> { - fn get_or_create_task_type(&self, task_type: PersistentTaskType) -> TaskId { - let cache = &self.backend.cache; - // We could try a cache.get first to avoid insert and remove - // but it seems very unlikely that we actually already know the task type - let new_task = Task { - active_parents: AtomicU32::new(0), - task_state: Mutex::new(Default::default()), - task_type: TaskType::Persistent(task_type.clone()), - }; - let task = self.turbo_tasks.get_fresh_task_id(); - let task = task.into(); - // SAFETY: It's a fresh task id - unsafe { - self.backend.tasks.insert(*task as usize, new_task); - } - match cache.entry(task_type) { - Entry::Occupied(e) => { - let value = *e.into_ref(); - // Safety: We didn't store the task id in the cache, we it's still unused - unsafe { - let task = Unused::new_unchecked(task); - self.turbo_tasks.reuse_task_id(task); - } - value - } - Entry::Vacant(e) => { - e.insert(task); - task - } - } - } - - fn lookup_task_type(&self, id: TaskId) -> &PersistentTaskType { - let task = self.backend.tasks.get(*id as usize).unwrap(); - match &task.task_type { - TaskType::Persistent(ty) => ty, - _ => panic!("lookup_task_type should only be used for PersistentTaskType"), - } - } -} - -impl MemoryBackendWithPersistedGraph

{ - fn pg_read( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option<(TaskData, ReadTaskState)> { - self.pg - .read( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - fn pg_lookup_one( - &self, - task_type: &PersistentTaskType, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - self.pg - .lookup_one( - task_type, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - fn pg_lookup( - &self, - partial_task_type: &PersistentTaskType, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - self.pg - .lookup( - partial_task_type, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - fn pg_is_persisted( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - self.pg - .is_persisted( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - fn pg_persist( - &self, - task: TaskId, - data: TaskData, - state: PersistTaskState, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - self.pg - .persist( - task, - data, - state, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_activate_when_needed( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - self.pg - .activate_when_needed( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_deactivate_when_needed( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Option { - self.pg - .deactivate_when_needed( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_set_externally_active( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - self.pg - .set_externally_active( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_unset_externally_active( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - self.pg - .unset_externally_active( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_make_dirty( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> bool { - self.pg - .make_dirty( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - #[must_use] - fn pg_make_dependent_dirty( - &self, - vc: RawVc, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Vec { - self.pg - .make_dependent_dirty( - vc, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - fn pg_make_clean( - &self, - task: TaskId, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) { - self.pg - .make_clean( - task, - &MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }, - ) - .unwrap() - } - - // FIXME - #[allow(dead_code)] - #[must_use] - fn pg_remove_outdated_externally_active( - &self, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Vec { - self.pg - .remove_outdated_externally_active(&MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }) - .unwrap() - } - - #[must_use] - fn pg_get_active_external_tasks( - &self, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Vec { - self.pg - .get_active_external_tasks(&MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }) - .unwrap() - } - - #[must_use] - fn pg_get_dirty_active_tasks( - &self, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> Vec { - self.pg - .get_dirty_active_tasks(&MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }) - .unwrap() - } - - #[must_use] - fn pg_get_pending_active_update( - &self, - turbo_tasks: &dyn TurboTasksBackendApi>, - ) -> (Vec, Vec) { - self.pg - .get_pending_active_update(&MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }) - .unwrap() - } - - fn pg_stop(&self, turbo_tasks: &dyn TurboTasksBackendApi>) { - self.pg - .stop(&MemoryBackendPersistedGraphApi { - backend: self, - turbo_tasks, - }) - .unwrap() - } -} diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 81eef31114c1f..d424971f903cf 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -587,14 +587,14 @@ impl Task { PersistentTaskType::Native { fn_type: native_fn, this: _, - args: _, + arg: _, } => { format!("[{}] {}", id, registry::get_function(*native_fn).name) } PersistentTaskType::ResolveNative { fn_type: native_fn, this: _, - args: _, + arg: _, } => { format!( "[{}] [resolve] {}", @@ -606,7 +606,7 @@ impl Task { trait_type, method_name: fn_name, this: _, - args: _, + arg: _, } => { format!( "[{}] [resolve trait] {} in trait {}", @@ -757,7 +757,7 @@ impl Task { PersistentTaskType::Native { fn_type: native_fn, this, - args: inputs, + arg: inputs, } => { let func = registry::get_function(*native_fn); let span = func.span(); @@ -770,7 +770,7 @@ impl Task { PersistentTaskType::ResolveNative { fn_type: ref native_fn_id, this, - args: inputs, + arg: inputs, } => { let native_fn_id = *native_fn_id; let func = registry::get_function(native_fn_id); @@ -791,7 +791,7 @@ impl Task { trait_type: trait_type_id, method_name: name, this, - args: inputs, + arg: inputs, } => { let trait_type_id = *trait_type_id; let trait_type = registry::get_trait(trait_type_id); diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index 5088018b5daca..2c0e62f88c67f 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -40,10 +40,10 @@ impl VcStorage { &self, func: turbo_tasks::FunctionId, this_arg: Option, - inputs: Vec, + arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { let this = self.this.upgrade().unwrap(); - let func = registry::get_function(func).bind(this_arg, &inputs); + let func = registry::get_function(func).bind(this_arg, &arg); let handle = tokio::runtime::Handle::current(); let future = func(); let i = { @@ -83,24 +83,24 @@ impl TurboTasksCallApi for VcStorage { fn dynamic_call( &self, func: turbo_tasks::FunctionId, - inputs: Vec, + arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { - self.dynamic_call(func, None, inputs) + self.dynamic_call(func, None, arg) } fn dynamic_this_call( &self, func: turbo_tasks::FunctionId, this_arg: RawVc, - inputs: Vec, + arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { - self.dynamic_call(func, Some(this_arg), inputs) + self.dynamic_call(func, Some(this_arg), arg) } fn native_call( &self, _func: turbo_tasks::FunctionId, - _inputs: Vec, + _arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { unreachable!() } @@ -109,7 +109,7 @@ impl TurboTasksCallApi for VcStorage { &self, _func: turbo_tasks::FunctionId, _this: RawVc, - _inputs: Vec, + _arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { unreachable!() } @@ -119,7 +119,7 @@ impl TurboTasksCallApi for VcStorage { _trait_type: turbo_tasks::TraitTypeId, _trait_fn_name: Cow<'static, str>, _this: RawVc, - _inputs: Vec, + _arg: turbo_tasks::ConcreteTaskInput, ) -> RawVc { unreachable!() } diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index b5c8c8eabe415..aa52277f0a140 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -4,7 +4,6 @@ use std::{ fmt::{self, Debug, Display, Write}, future::Future, hash::BuildHasherDefault, - mem::take, pin::Pin, sync::Arc, time::Duration, @@ -72,7 +71,7 @@ pub enum PersistentTaskType { Native { fn_type: FunctionId, this: Option, - args: Vec, + arg: ConcreteTaskInput, }, /// A resolve task, which resolves arguments and calls the function with @@ -80,7 +79,7 @@ pub enum PersistentTaskType { ResolveNative { fn_type: FunctionId, this: Option, - args: Vec, + arg: ConcreteTaskInput, }, /// A trait method resolve task. It resolves the first (`self`) argument and @@ -91,7 +90,7 @@ pub enum PersistentTaskType { trait_type: TraitTypeId, method_name: Cow<'static, str>, this: RawVc, - args: Vec, + arg: ConcreteTaskInput, }, } @@ -107,95 +106,19 @@ impl PersistentTaskType { Self::Native { fn_type: _, this: _, - args: inputs, - } => inputs.shrink_to_fit(), + arg, + } => arg.shrink_to_fit(), Self::ResolveNative { fn_type: _, this: _, - args: inputs, - } => inputs.shrink_to_fit(), + arg, + } => arg.shrink_to_fit(), Self::ResolveTrait { trait_type: _, method_name: _, this: _, - args: inputs, - } => inputs.shrink_to_fit(), - } - } - - pub fn len(&self) -> usize { - match self { - PersistentTaskType::Native { - fn_type: _, - this: _, - args: v, - } - | PersistentTaskType::ResolveNative { - fn_type: _, - this: _, - args: v, - } - | PersistentTaskType::ResolveTrait { - trait_type: _, - method_name: _, - this: _, - args: v, - } => v.len(), - } - } - - pub fn is_empty(&self) -> bool { - match self { - PersistentTaskType::Native { - fn_type: _, - this: _, - args: v, - } - | PersistentTaskType::ResolveNative { - fn_type: _, - this: _, - args: v, - } - | PersistentTaskType::ResolveTrait { - trait_type: _, - method_name: _, - this: _, - args: v, - } => v.is_empty(), - } - } - - pub fn partial(&self, len: usize) -> Self { - match self { - PersistentTaskType::Native { - fn_type: f, - this, - args: v, - } => PersistentTaskType::Native { - fn_type: *f, - this: *this, - args: v[..len].to_vec(), - }, - PersistentTaskType::ResolveNative { - fn_type: f, - this, - args: v, - } => PersistentTaskType::ResolveNative { - fn_type: *f, - this: *this, - args: v[..len].to_vec(), - }, - PersistentTaskType::ResolveTrait { - trait_type: f, - method_name: n, - this, - args: v, - } => PersistentTaskType::ResolveTrait { - trait_type: *f, - method_name: n.clone(), - this: *this, - args: v[..len].to_vec(), - }, + arg, + } => arg.shrink_to_fit(), } } @@ -209,18 +132,18 @@ impl PersistentTaskType { PersistentTaskType::Native { fn_type: native_fn, this: _, - args: _, + arg: _, } | PersistentTaskType::ResolveNative { fn_type: native_fn, this: _, - args: _, + arg: _, } => Cow::Borrowed(®istry::get_function(*native_fn).name), PersistentTaskType::ResolveTrait { trait_type: trait_id, method_name: fn_name, this: _, - args: _, + arg: _, } => format!("{}::{}", registry::get_trait(*trait_id).name, fn_name).into(), } } @@ -453,19 +376,17 @@ impl PersistentTaskType { pub async fn run_resolve_native( fn_id: FunctionId, mut this: Option, - mut inputs: Vec, + arg: ConcreteTaskInput, turbo_tasks: Arc>, ) -> Result { if let Some(this) = this.as_mut() { *this = this.resolve().await?; } - for input in inputs.iter_mut() { - *input = take(input).resolve().await?; - } + let arg = arg.resolve().await?; Ok(if let Some(this) = this { - turbo_tasks.this_call(fn_id, this, inputs) + turbo_tasks.this_call(fn_id, this, arg) } else { - turbo_tasks.native_call(fn_id, inputs) + turbo_tasks.native_call(fn_id, arg) }) } @@ -485,7 +406,7 @@ impl PersistentTaskType { trait_type: TraitTypeId, name: Cow<'static, str>, this: RawVc, - mut inputs: Vec, + arg: ConcreteTaskInput, turbo_tasks: Arc>, ) -> Result { let this = this.resolve().await?; @@ -497,10 +418,8 @@ impl PersistentTaskType { }; let native_fn = Self::resolve_trait_method_from_value(trait_type, this_ty, name)?; - for input in inputs.iter_mut() { - *input = take(input).resolve().await?; - } - Ok(turbo_tasks.dynamic_this_call(native_fn, this, inputs)) + let arg = arg.resolve().await?; + Ok(turbo_tasks.dynamic_this_call(native_fn, this, arg)) } /// Shared helper used by [`Self::resolve_trait_method`] and @@ -544,22 +463,22 @@ impl PersistentTaskType { PersistentTaskType::Native { fn_type: fn_id, this, - args: inputs, + arg, } => { let native_fn = registry::get_function(fn_id); - let bound = native_fn.bind(this, &inputs); + let bound = native_fn.bind(this, &arg); (bound)() } PersistentTaskType::ResolveNative { fn_type: fn_id, this, - args: inputs, + arg: inputs, } => Box::pin(Self::run_resolve_native(fn_id, this, inputs, turbo_tasks)), PersistentTaskType::ResolveTrait { trait_type, method_name: name, this, - args: inputs, + arg: inputs, } => Box::pin(Self::run_resolve_trait( trait_type, name, @@ -593,7 +512,7 @@ pub(crate) mod tests { PersistentTaskType::Native { fn_type: *MOCK_FUNC_TASK_FUNCTION_ID, this: None, - args: Vec::new() + arg: Default::default() } .get_name(), "mock_func_task", @@ -603,7 +522,7 @@ pub(crate) mod tests { trait_type: *MOCKTRAIT_TRAIT_TYPE_ID, method_name: "mock_method_task".into(), this: RawVc::TaskOutput(unsafe { TaskId::new_unchecked(1) }), - args: Vec::new() + arg: Default::default() } .get_name(), "MockTrait::mock_method_task", diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 2738a633e3948..927438749d440 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -42,21 +42,16 @@ use crate::{ }; pub trait TurboTasksCallApi: Sync + Send { - fn dynamic_call(&self, func: FunctionId, inputs: Vec) -> RawVc; - fn dynamic_this_call( - &self, - func: FunctionId, - this: RawVc, - inputs: Vec, - ) -> RawVc; - fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc; - fn this_call(&self, func: FunctionId, this: RawVc, inputs: Vec) -> RawVc; + fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc; + fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc; + fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc; + fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc; fn trait_call( &self, trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - inputs: Vec, + arg: ConcreteTaskInput, ) -> RawVc; fn run_once( @@ -378,12 +373,12 @@ impl TurboTasks { /// Call a native function with arguments. /// All inputs must be resolved. - pub(crate) fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc { + pub(crate) fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::Native { fn_type: func, this: None, - args: inputs, + arg, }, current_task("turbo_function calls"), self, @@ -392,17 +387,12 @@ impl TurboTasks { /// Call a native function with arguments. /// All inputs must be resolved. - pub(crate) fn this_call( - &self, - func: FunctionId, - this: RawVc, - inputs: Vec, - ) -> RawVc { + pub(crate) fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::Native { fn_type: func, this: Some(this), - args: inputs, + arg, }, current_task("turbo_function calls"), self, @@ -411,15 +401,15 @@ impl TurboTasks { /// Calls a native function with arguments. Resolves arguments when needed /// with a wrapper task. - pub fn dynamic_call(&self, func: FunctionId, inputs: Vec) -> RawVc { - if inputs.iter().all(|i| i.is_resolved()) { - self.native_call(func, inputs) + pub fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + if arg.is_resolved() { + self.native_call(func, arg) } else { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::ResolveNative { fn_type: func, this: None, - args: inputs, + arg, }, current_task("turbo_function calls"), self, @@ -433,16 +423,16 @@ impl TurboTasks { &self, func: FunctionId, this: RawVc, - inputs: Vec, + arg: ConcreteTaskInput, ) -> RawVc { - if this.is_resolved() && inputs.iter().all(|i| i.is_resolved()) { - self.this_call(func, this, inputs) + if this.is_resolved() && arg.is_resolved() { + self.this_call(func, this, arg) } else { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::ResolveNative { fn_type: func, this: Some(this), - args: inputs, + arg, }, current_task("turbo_function calls"), self, @@ -457,7 +447,7 @@ impl TurboTasks { trait_type: TraitTypeId, mut trait_fn_name: Cow<'static, str>, this: RawVc, - inputs: Vec, + arg: ConcreteTaskInput, ) -> RawVc { // avoid creating a wrapper task if self is already resolved // for resolved cells we already know the value type so we can lookup the @@ -465,7 +455,7 @@ impl TurboTasks { if let RawVc::TaskCell(_, CellId { type_id, .. }) = this { match get_trait_method(trait_type, type_id, trait_fn_name) { Ok(native_fn) => { - return self.dynamic_this_call(native_fn, this, inputs); + return self.dynamic_this_call(native_fn, this, arg); } Err(name) => { trait_fn_name = name; @@ -479,7 +469,7 @@ impl TurboTasks { trait_type, method_name: trait_fn_name, this, - args: inputs, + arg, }, current_task("turbo_function calls"), self, @@ -862,31 +852,26 @@ impl TurboTasks { } impl TurboTasksCallApi for TurboTasks { - fn dynamic_call(&self, func: FunctionId, inputs: Vec) -> RawVc { - self.dynamic_call(func, inputs) + fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + self.dynamic_call(func, arg) } - fn dynamic_this_call( - &self, - func: FunctionId, - this: RawVc, - inputs: Vec, - ) -> RawVc { - self.dynamic_this_call(func, this, inputs) + fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + self.dynamic_this_call(func, this, arg) } - fn native_call(&self, func: FunctionId, inputs: Vec) -> RawVc { - self.native_call(func, inputs) + fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + self.native_call(func, arg) } - fn this_call(&self, func: FunctionId, this: RawVc, inputs: Vec) -> RawVc { - self.this_call(func, this, inputs) + fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + self.this_call(func, this, arg) } fn trait_call( &self, trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - inputs: Vec, + arg: ConcreteTaskInput, ) -> RawVc { - self.trait_call(trait_type, trait_fn_name, this, inputs) + self.trait_call(trait_type, trait_fn_name, this, arg) } #[track_caller] @@ -1361,14 +1346,14 @@ pub async fn run_once_with_reason( } /// Calls [`TurboTasks::dynamic_call`] for the current turbo tasks instance. -pub fn dynamic_call(func: FunctionId, inputs: Vec) -> RawVc { - with_turbo_tasks(|tt| tt.dynamic_call(func, inputs)) +pub fn dynamic_call(func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + with_turbo_tasks(|tt| tt.dynamic_call(func, arg)) } /// Calls [`TurboTasks::dynamic_this_call`] for the current turbo tasks /// instance. -pub fn dynamic_this_call(func: FunctionId, this: RawVc, inputs: Vec) -> RawVc { - with_turbo_tasks(|tt| tt.dynamic_this_call(func, this, inputs)) +pub fn dynamic_this_call(func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + with_turbo_tasks(|tt| tt.dynamic_this_call(func, this, arg)) } /// Calls [`TurboTasks::trait_call`] for the current turbo tasks instance. @@ -1376,9 +1361,9 @@ pub fn trait_call( trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - inputs: Vec, + arg: ConcreteTaskInput, ) -> RawVc { - with_turbo_tasks(|tt| tt.trait_call(trait_type, trait_fn_name, this, inputs)) + with_turbo_tasks(|tt| tt.trait_call(trait_type, trait_fn_name, this, arg)) } pub fn turbo_tasks() -> Arc { diff --git a/crates/turbo-tasks/src/native_function.rs b/crates/turbo-tasks/src/native_function.rs index c43910288fc99..23ec8d2ded991 100644 --- a/crates/turbo-tasks/src/native_function.rs +++ b/crates/turbo-tasks/src/native_function.rs @@ -55,8 +55,8 @@ impl NativeFunction { } /// Creates a functor for execution from a fixed set of inputs. - pub fn bind(&'static self, this: Option, inputs: &[ConcreteTaskInput]) -> NativeTaskFn { - match (self.implementation).functor(this, inputs) { + pub fn bind(&'static self, this: Option, arg: &ConcreteTaskInput) -> NativeTaskFn { + match (self.implementation).functor(this, arg) { Ok(functor) => functor, Err(err) => { let err = SharedError::new(err); diff --git a/crates/turbo-tasks/src/task/concrete_task_input.rs b/crates/turbo-tasks/src/task/concrete_task_input.rs index e0982858c744a..87818b4d73549 100644 --- a/crates/turbo-tasks/src/task/concrete_task_input.rs +++ b/crates/turbo-tasks/src/task/concrete_task_input.rs @@ -396,6 +396,13 @@ impl ConcreteTaskInput { } } + pub fn shrink_to_fit(&mut self) { + if let ConcreteTaskInput::List(list) = self { + list.shrink_to_fit(); + list.iter_mut().for_each(|i| i.shrink_to_fit()); + } + } + pub fn get_task_id(&self) -> Option { match self { ConcreteTaskInput::TaskOutput(t) | ConcreteTaskInput::TaskCell(t, _) => Some(*t), diff --git a/crates/turbo-tasks/src/task/function.rs b/crates/turbo-tasks/src/task/function.rs index aa436bf6cef39..042218c6ae552 100644 --- a/crates/turbo-tasks/src/task/function.rs +++ b/crates/turbo-tasks/src/task/function.rs @@ -23,7 +23,7 @@ use std::{future::Future, marker::PhantomData, pin::Pin}; -use anyhow::{bail, Context, Result}; +use anyhow::Result; use super::{TaskInput, TaskOutput}; use crate::{ConcreteTaskInput, RawVc, Vc, VcRead, VcValueType}; @@ -32,7 +32,7 @@ pub type NativeTaskFuture = Pin> + Send>>; pub type NativeTaskFn = Box NativeTaskFuture + Send + Sync>; pub trait TaskFn: Send + Sync + 'static { - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; } pub trait IntoTaskFn { @@ -93,8 +93,8 @@ where Mode: TaskFnMode, Inputs: TaskInputs, { - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { - TaskFnInputFunction::functor(&self.task_fn, this, inputs) + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + TaskFnInputFunction::functor(&self.task_fn, this, arg) } } @@ -110,19 +110,19 @@ where Mode: TaskFnMode, Inputs: TaskInputs, { - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { - TaskFnInputFunctionWithThis::functor(&self.task_fn, this, inputs) + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + TaskFnInputFunctionWithThis::functor(&self.task_fn, this, arg) } } trait TaskFnInputFunction: Send + Sync + Clone + 'static { - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; } trait TaskFnInputFunctionWithThis: Send + Sync + Clone + 'static { - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result; + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; } pub trait TaskInputs: Send + Sync + 'static {} @@ -155,36 +155,8 @@ macro_rules! task_inputs_impl { } } -macro_rules! as_concrete_task_input { - ( $arg:ident ) => { - ConcreteTaskInput - }; -} - macro_rules! task_fn_impl { - ( $helper_module:ident $async_fn_trait:ident $arg_len:literal $( $arg:ident )* ) => { - mod $helper_module { - use super::*; - - // this is a non-generic helper method to allow code-sharing across monomorphized - // instances of this function - pub fn get_args( - inputs: &[ConcreteTaskInput], - ) -> Result<($(&as_concrete_task_input!($arg),)*)> { - get_args_iter(inputs.iter()) - } - - fn get_args_iter( - mut iter: std::slice::Iter<'_, ConcreteTaskInput>, - ) -> Result<($(&as_concrete_task_input!($arg),)*)> { - let args = ($(next_arg(&mut iter, stringify!($arg))?,)*); - if iter.next().is_some() { - bail!("task was called with too many arguments"); - } - Ok(args) - } - } - + ( $async_fn_trait:ident $arg_len:literal $( $arg:ident )* ) => { impl TaskFnInputFunction for F where $($arg: TaskInput + 'static,)* @@ -192,13 +164,11 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, _this: Option, inputs: &[ConcreteTaskInput]) -> Result { - let ($($arg,)*) = $helper_module::get_args(inputs)?; + fn functor(&self, _this: Option, arg: &ConcreteTaskInput) -> Result { + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; let task_fn = self.clone(); - $( - let $arg = $arg::try_from_concrete($arg)?; - )* Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -221,13 +191,11 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, _this: Option, inputs: &[ConcreteTaskInput]) -> Result { - let ($($arg,)*) = $helper_module::get_args(inputs)?; + fn functor(&self, _this: Option, arg: &ConcreteTaskInput) -> Result { + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; let task_fn = self.clone(); - $( - let $arg = $arg::try_from_concrete($arg)?; - )* Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -250,14 +218,12 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { let task_fn = self.clone(); let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let ($($arg,)*) = $helper_module::get_args(inputs)?; - $( - let $arg = $arg::try_from_concrete($arg)?; - )* + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -282,14 +248,12 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { let task_fn = self.clone(); let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let ($($arg,)*) = $helper_module::get_args(inputs)?; - $( - let $arg = $arg::try_from_concrete($arg)?; - )* + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -326,14 +290,12 @@ macro_rules! task_fn_impl { F: for<'a> $async_fn_trait<&'a Recv, $($arg,)*> + Clone + Send + Sync + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { let task_fn = self.clone(); let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let ($($arg,)*) = $helper_module::get_args(inputs)?; - $( - let $arg = $arg::try_from_concrete($arg)?; - )* + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -357,14 +319,12 @@ macro_rules! task_fn_impl { F: $async_fn_trait, $($arg,)*> + Clone + Send + Sync + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, inputs: &[ConcreteTaskInput]) -> Result { + fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { let task_fn = self.clone(); let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - let ($($arg,)*) = $helper_module::get_args(inputs)?; - $( - let $arg = $arg::try_from_concrete($arg)?; - )* + #[allow(unused_parens)] + let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; Ok(Box::new(move || { let task_fn = task_fn.clone(); @@ -381,23 +341,23 @@ macro_rules! task_fn_impl { }; } -task_fn_impl! { async_fn_0 AsyncFn0 0 } -task_fn_impl! { async_fn_1 AsyncFn1 1 A1 } -task_fn_impl! { async_fn_2 AsyncFn2 2 A1 A2 } -task_fn_impl! { async_fn_3 AsyncFn3 3 A1 A2 A3 } -task_fn_impl! { async_fn_4 AsyncFn4 4 A1 A2 A3 A4 } -task_fn_impl! { async_fn_5 AsyncFn5 5 A1 A2 A3 A4 A5 } -task_fn_impl! { async_fn_6 AsyncFn6 6 A1 A2 A3 A4 A5 A6 } -task_fn_impl! { async_fn_7 AsyncFn7 7 A1 A2 A3 A4 A5 A6 A7 } -task_fn_impl! { async_fn_8 AsyncFn8 8 A1 A2 A3 A4 A5 A6 A7 A8 } -task_fn_impl! { async_fn_9 AsyncFn9 9 A1 A2 A3 A4 A5 A6 A7 A8 A9 } -task_fn_impl! { async_fn_10 AsyncFn10 10 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } -task_fn_impl! { async_fn_11 AsyncFn11 11 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } -task_fn_impl! { async_fn_12 AsyncFn12 12 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } -task_fn_impl! { async_fn_13 AsyncFn13 13 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } -task_fn_impl! { async_fn_14 AsyncFn14 14 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } -task_fn_impl! { async_fn_15 AsyncFn15 15 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } -task_fn_impl! { async_fn_16 AsyncFn16 16 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } +task_fn_impl! { AsyncFn0 0 } +task_fn_impl! { AsyncFn1 1 A1 } +task_fn_impl! { AsyncFn2 2 A1 A2 } +task_fn_impl! { AsyncFn3 3 A1 A2 A3 } +task_fn_impl! { AsyncFn4 4 A1 A2 A3 A4 } +task_fn_impl! { AsyncFn5 5 A1 A2 A3 A4 A5 } +task_fn_impl! { AsyncFn6 6 A1 A2 A3 A4 A5 A6 } +task_fn_impl! { AsyncFn7 7 A1 A2 A3 A4 A5 A6 A7 } +task_fn_impl! { AsyncFn8 8 A1 A2 A3 A4 A5 A6 A7 A8 } +task_fn_impl! { AsyncFn9 9 A1 A2 A3 A4 A5 A6 A7 A8 A9 } +task_fn_impl! { AsyncFn10 10 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } +task_fn_impl! { AsyncFn11 11 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } +task_fn_impl! { AsyncFn12 12 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } +task_fn_impl! { AsyncFn13 13 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } +task_fn_impl! { AsyncFn14 14 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } +task_fn_impl! { AsyncFn15 15 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } +task_fn_impl! { AsyncFn16 16 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } // There needs to be one more implementation than task_fn_impl to account for // the receiver. @@ -420,14 +380,6 @@ task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 } -fn next_arg<'a>( - iter: &mut std::slice::Iter<'a, ConcreteTaskInput>, - arg_name: &'static str, -) -> Result<&'a ConcreteTaskInput> { - iter.next() - .with_context(move || format!("task is missing argument {}", arg_name)) -} - #[cfg(test)] mod tests { use super::*; diff --git a/crates/turbo-tasks/src/task/task_input.rs b/crates/turbo-tasks/src/task/task_input.rs index 87008c290eb34..9d21f9e228c55 100644 --- a/crates/turbo-tasks/src/task/task_input.rs +++ b/crates/turbo-tasks/src/task/task_input.rs @@ -320,6 +320,19 @@ where } } +impl TaskInput for () { + fn try_from_concrete(input: &ConcreteTaskInput) -> Result { + match input { + ConcreteTaskInput::Nothing => Ok(()), + _ => bail!("invalid task input type, expected Nothing"), + } + } + + fn into_concrete(self) -> ConcreteTaskInput { + ConcreteTaskInput::Nothing + } +} + macro_rules! tuple_impls { ( $( $name:ident )+ ) => { impl<$($name: TaskInput),+> TaskInput for ($($name,)+) @@ -335,7 +348,7 @@ macro_rules! tuple_impls { )+ Ok(($($name,)+)) } - _ => bail!("invalid task input type, expected list"), + _ => bail!("invalid task input type {input:?}, expected tuple {}", stringify!(($($name,)+))), } } @@ -349,7 +362,7 @@ macro_rules! tuple_impls { }; } -// Implement `TaskInput` for all tuples of 1 to 12 elements. +// Implement `TaskInput` for all tuples of 1 to 16 elements. tuple_impls! { A } tuple_impls! { A B } tuple_impls! { A B C } @@ -362,6 +375,10 @@ tuple_impls! { A B C D E F G H I } tuple_impls! { A B C D E F G H I J } tuple_impls! { A B C D E F G H I J K } tuple_impls! { A B C D E F G H I J K L } +tuple_impls! { A B C D E F G H I J K L M } +tuple_impls! { A B C D E F G H I J K L M N } +tuple_impls! { A B C D E F G H I J K L M N O } +tuple_impls! { A B C D E F G H I J K L M N O P} #[cfg(test)] mod tests { From 0e3d994f1948478b44889e0aa9249046cc875404 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 18 Jul 2024 02:35:44 +0200 Subject: [PATCH 23/73] remove ConcreteTaskInput in favor of the original rust datatypes (#8737) ### Description Instead of the ConcreteTaskInput conversion, we use a boxed any. This allows to store arguments in plain rust structures and uses less memory. We need to do some magic to make serialization possible. Also removed Ord requirement from TaskInputs and make Vc not implement Ord ### Testing Instructions --- Cargo.lock | 1 + crates/turbo-tasks-build/src/lib.rs | 27 +- .../turbo-tasks-macros-shared/src/expand.rs | 76 +-- crates/turbo-tasks-macros-tests/Cargo.toml | 1 + .../tests/task_input.rs | 3 +- .../src/derive/deterministic_hash_macro.rs | 8 +- .../src/derive/task_input_macro.rs | 248 +++------ .../src/derive/trace_raw_vcs_macro.rs | 8 +- .../src/derive/value_debug_format_macro.rs | 18 +- crates/turbo-tasks-macros/src/func.rs | 26 +- .../src/value_impl_macro.rs | 2 - crates/turbo-tasks-macros/src/value_macro.rs | 2 +- .../src/value_trait_macro.rs | 35 +- .../turbo-tasks-memory/src/memory_backend.rs | 12 +- crates/turbo-tasks-memory/src/task.rs | 32 +- crates/turbo-tasks-memory/tests/all_in_one.rs | 20 +- crates/turbo-tasks-memory/tests/debug.rs | 8 +- crates/turbo-tasks-testing/src/lib.rs | 26 +- crates/turbo-tasks/src/backend.rs | 288 ++++++++--- crates/turbo-tasks/src/lib.rs | 7 +- crates/turbo-tasks/src/macro_helpers.rs | 13 +- crates/turbo-tasks/src/magic_any.rs | 56 +- crates/turbo-tasks/src/manager.rs | 46 +- crates/turbo-tasks/src/native_function.rs | 103 +++- crates/turbo-tasks/src/no_move_vec.rs | 2 +- crates/turbo-tasks/src/raw_vc.rs | 4 +- crates/turbo-tasks/src/registry.rs | 4 +- .../src/task/concrete_task_input.rs | 475 ----------------- crates/turbo-tasks/src/task/function.rs | 215 ++++---- crates/turbo-tasks/src/task/mod.rs | 6 +- .../turbo-tasks/src/task/shared_reference.rs | 146 ++++++ crates/turbo-tasks/src/task/task_input.rs | 480 +++++++----------- crates/turbo-tasks/src/trait_helpers.rs | 5 +- crates/turbo-tasks/src/trait_ref.rs | 12 - crates/turbo-tasks/src/value.rs | 23 +- crates/turbo-tasks/src/value_type.rs | 76 +-- crates/turbo-tasks/src/vc/mod.rs | 25 +- crates/turbo-tasks/src/vc/resolved.rs | 34 +- .../turbopack-browser/src/chunking_context.rs | 2 +- .../src/ecmascript/list/asset.rs | 2 +- .../src/chunk/availability_info.rs | 2 +- crates/turbopack-core/src/chunk/mod.rs | 2 +- .../turbopack-core/src/compile_time_info.rs | 2 +- crates/turbopack-core/src/environment.rs | 2 +- crates/turbopack-core/src/ident.rs | 2 +- crates/turbopack-core/src/reference_type.rs | 16 +- crates/turbopack-core/src/resolve/mod.rs | 6 +- crates/turbopack-core/src/resolve/pattern.rs | 20 +- crates/turbopack-core/src/source_pos.rs | 1 + crates/turbopack-core/src/target.rs | 18 +- .../src/source/headers.rs | 19 +- crates/turbopack-dev-server/src/source/mod.rs | 8 +- .../turbopack-dev-server/src/source/query.rs | 19 +- .../src/source/route_tree.rs | 4 +- .../src/lib.rs | 2 +- .../src/runtime_type.rs | 4 +- .../src/analyzer/imports.rs | 6 +- crates/turbopack-ecmascript/src/lib.rs | 6 +- .../src/references/constant_condition.rs | 2 +- .../src/references/esm/url.rs | 2 +- .../src/references/external_module.rs | 4 +- .../src/references/pattern_mapping.rs | 2 +- .../turbopack-ecmascript/src/transform/mod.rs | 4 +- crates/turbopack-mdx/src/lib.rs | 4 +- crates/turbopack-node/src/evaluate.rs | 2 +- .../turbopack-node/src/render/render_proxy.rs | 58 +-- .../src/render/render_static.rs | 58 +-- .../turbopack-node/src/transforms/postcss.rs | 2 +- .../turbopack-node/src/transforms/webpack.rs | 4 +- .../turbopack-nodejs/src/chunking_context.rs | 2 +- .../src/module_options/module_rule.rs | 2 +- 71 files changed, 1250 insertions(+), 1612 deletions(-) delete mode 100644 crates/turbo-tasks/src/task/concrete_task_input.rs create mode 100644 crates/turbo-tasks/src/task/shared_reference.rs diff --git a/Cargo.lock b/Cargo.lock index 06a2b151a3e03..a3684ae1a737a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10256,6 +10256,7 @@ version = "0.1.0" dependencies = [ "anyhow", "lazy_static", + "serde", "tokio", "trybuild", "turbo-tasks", diff --git a/crates/turbo-tasks-build/src/lib.rs b/crates/turbo-tasks-build/src/lib.rs index b44820d34e628..266797b3a6130 100644 --- a/crates/turbo-tasks-build/src/lib.rs +++ b/crates/turbo-tasks-build/src/lib.rs @@ -18,7 +18,7 @@ use turbo_tasks_macros_shared::{ get_impl_function_ident, get_native_function_ident, get_path_ident, get_register_trait_methods_ident, get_register_value_type_ident, get_trait_default_impl_function_ident, get_trait_impl_function_ident, get_trait_type_ident, - get_type_ident, GenericTypeInput, PrimitiveInput, ValueTraitArguments, + get_type_ident, GenericTypeInput, PrimitiveInput, }; pub fn generate_register() { @@ -361,10 +361,10 @@ impl<'a> RegisterContext<'a> { } fn process_trait_inner(&mut self, trait_item: &ItemTrait) -> Result<()> { - if let Some(attr) = trait_item + if trait_item .attrs .iter() - .find(|a| is_turbo_attribute(a, "value_trait")) + .any(|a| is_turbo_attribute(a, "value_trait")) { let trait_ident = &trait_item.ident; @@ -388,16 +388,6 @@ impl<'a> RegisterContext<'a> { let trait_type_ident = get_trait_type_ident(trait_ident); self.register(trait_type_ident, self.get_global_name(&[trait_ident]))?; - - let trait_args: ValueTraitArguments = parse_attr_args(attr)?.unwrap_or_default(); - if trait_args.debug { - self.register_debug_impl( - &get_type_ident(&parse_quote! { - Box - }) - .unwrap(), - )?; - } } Ok(()) } @@ -610,14 +600,3 @@ fn is_cfg_attribute(attr: &Attribute) -> bool { .get_ident() .is_some_and(|ident| ident == "cfg" || ident == "cfg_attr") } - -fn parse_attr_args(attr: &Attribute) -> syn::Result> -where - T: syn::parse::Parse, -{ - if attr.tokens.is_empty() { - Ok(None) - } else { - Ok(Some(attr.parse_args_with(T::parse)?)) - } -} diff --git a/crates/turbo-tasks-macros-shared/src/expand.rs b/crates/turbo-tasks-macros-shared/src/expand.rs index 7f27c42130f9d..dfcb4108a8255 100644 --- a/crates/turbo-tasks-macros-shared/src/expand.rs +++ b/crates/turbo-tasks-macros-shared/src/expand.rs @@ -20,9 +20,9 @@ use syn::{ /// These helpers should themselves call [generate_destructuring] to generate /// the destructure necessary to access the fields of the value. pub fn match_expansion< - EN: Fn(&Ident, &FieldsNamed) -> (TokenStream, TokenStream), - EU: Fn(&Ident, &FieldsUnnamed) -> (TokenStream, TokenStream), - U: Fn(&Ident) -> TokenStream, + EN: Fn(TokenStream, &FieldsNamed) -> (TokenStream, TokenStream), + EU: Fn(TokenStream, &FieldsUnnamed) -> (TokenStream, TokenStream), + U: Fn(TokenStream) -> TokenStream, >( derive_input: &DeriveInput, expand_named: &EN, @@ -33,36 +33,48 @@ pub fn match_expansion< let expand_unit = move |ident| (TokenStream::new(), expand_unit(ident)); match &derive_input.data { Data::Enum(DataEnum { variants, .. }) => { - let (variants_idents, (variants_fields_capture, expansion)): ( - Vec<_>, - (Vec<_>, Vec<_>), - ) = variants - .iter() - .map(|variant| { - ( - &variant.ident, - expand_fields( - &variant.ident, - &variant.fields, - expand_named, - expand_unnamed, - expand_unit, - ), - ) - }) - .unzip(); + let (idents, (variants_fields_capture, expansion)): (Vec<_>, (Vec<_>, Vec<_>)) = + variants + .iter() + .map(|variant| { + let variants_idents = &variant.ident; + let ident = quote! { #ident::#variants_idents }; + ( + ident.clone(), + expand_fields( + ident, + &variant.fields, + expand_named, + expand_unnamed, + expand_unit, + ), + ) + }) + .unzip(); - quote! { - match self { - #( - #ident::#variants_idents #variants_fields_capture => #expansion, - )* + if idents.is_empty() { + let (_, expansion) = expand_unit(quote! { #ident }); + quote! { + #expansion + } + } else { + quote! { + match self { + #( + #idents #variants_fields_capture => #expansion, + )* + } } } } Data::Struct(DataStruct { fields, .. }) => { - let (captures, expansion) = - expand_fields(ident, fields, expand_named, expand_unnamed, expand_unit); + let (captures, expansion) = expand_fields( + quote! { #ident }, + fields, + expand_named, + expand_unnamed, + expand_unit, + ); if fields.is_empty() { assert!(captures.is_empty()); @@ -100,12 +112,12 @@ pub fn match_expansion< pub fn expand_fields< 'ident, 'fields, - EN: Fn(&'ident Ident, &'fields FieldsNamed) -> R, - EU: Fn(&'ident Ident, &'fields FieldsUnnamed) -> R, - U: Fn(&'ident Ident) -> R, + EN: Fn(TokenStream, &'fields FieldsNamed) -> R, + EU: Fn(TokenStream, &'fields FieldsUnnamed) -> R, + U: Fn(TokenStream) -> R, R, >( - ident: &'ident Ident, + ident: TokenStream, fields: &'fields Fields, expand_named: EN, expand_unnamed: EU, diff --git a/crates/turbo-tasks-macros-tests/Cargo.toml b/crates/turbo-tasks-macros-tests/Cargo.toml index 5080fc64bf1b6..cf8988291657c 100644 --- a/crates/turbo-tasks-macros-tests/Cargo.toml +++ b/crates/turbo-tasks-macros-tests/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dev-dependencies] anyhow = { workspace = true } +serde = { workspace = true } tokio = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-memory = { workspace = true } diff --git a/crates/turbo-tasks-macros-tests/tests/task_input.rs b/crates/turbo-tasks-macros-tests/tests/task_input.rs index 7eabe06e52247..fa516a8180ae5 100644 --- a/crates/turbo-tasks-macros-tests/tests/task_input.rs +++ b/crates/turbo-tasks-macros-tests/tests/task_input.rs @@ -2,12 +2,13 @@ //! However, we keep one test here as an integration test between the derive //! macro and the `#[turbo_tasks::function]` macro. +use serde::{Deserialize, Serialize}; use turbo_tasks::{Completion, TaskInput, Vc}; use turbo_tasks_testing::{register, run}; register!(); -#[derive(Clone, TaskInput)] +#[derive(Clone, TaskInput, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] struct OneUnnamedField(u32); #[turbo_tasks::function] diff --git a/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs b/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs index 8e92839505555..33774a1c90602 100644 --- a/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs @@ -1,5 +1,5 @@ use proc_macro::TokenStream; -use proc_macro2::{Ident, TokenStream as TokenStream2}; +use proc_macro2::TokenStream as TokenStream2; use quote::quote; use syn::{parse_macro_input, Data, DeriveInput, FieldsNamed, FieldsUnnamed}; use turbo_tasks_macros_shared::{generate_exhaustive_destructuring, match_expansion}; @@ -35,7 +35,7 @@ pub fn derive_deterministic_hash(input: TokenStream) -> TokenStream { /// Hashes a struct or enum variant with named fields (e.g. `struct Foo { /// bar: u32 }`, `Foo::Bar { baz: u32 }`). -fn hash_named(_ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { +fn hash_named(_ident: TokenStream2, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_exhaustive_destructuring(fields.named.iter()); ( captures, @@ -49,7 +49,7 @@ fn hash_named(_ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStrea /// Hashes a struct or enum variant with unnamed fields (e.g. `struct /// Foo(u32)`, `Foo::Bar(u32)`). -fn hash_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { +fn hash_unnamed(_ident: TokenStream2, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_exhaustive_destructuring(fields.unnamed.iter()); ( captures, @@ -62,6 +62,6 @@ fn hash_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenS } /// Hashes a unit struct or enum variant (e.g. `struct Foo;`, `Foo::Bar`). -fn hash_unit(_ident: &Ident) -> TokenStream2 { +fn hash_unit(_ident: TokenStream2) -> TokenStream2 { quote! { { } } } diff --git a/crates/turbo-tasks-macros/src/derive/task_input_macro.rs b/crates/turbo-tasks-macros/src/derive/task_input_macro.rs index a6c0169096c66..7a96916784d59 100644 --- a/crates/turbo-tasks-macros/src/derive/task_input_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/task_input_macro.rs @@ -1,11 +1,7 @@ use proc_macro::TokenStream; -use proc_macro2::{Ident, Literal, TokenStream as TokenStream2}; use quote::quote; -use syn::{ - parse_macro_input, spanned::Spanned, Data, DataEnum, DataStruct, DeriveInput, FieldsNamed, - FieldsUnnamed, -}; -use turbo_tasks_macros_shared::{expand_fields, generate_exhaustive_destructuring}; +use syn::{parse_macro_input, spanned::Spanned, DeriveInput}; +use turbo_tasks_macros_shared::{generate_exhaustive_destructuring, match_expansion}; pub fn derive_task_input(input: TokenStream) -> TokenStream { let derive_input = parse_macro_input!(input as DeriveInput); @@ -55,127 +51,90 @@ pub fn derive_task_input(input: TokenStream) -> TokenStream { } } - let inputs_list_ident = Ident::new( - &format!("__{}_inputs_list", ident), - derive_input.ident.span(), + let is_resolved_impl = match_expansion( + &derive_input, + &|_ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.named.iter()); + ( + capture, + quote! { + {#( + #fields.is_resolved() && + )* true} + }, + ) + }, + &|_ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.unnamed.iter()); + ( + capture, + quote! { + {#( + #fields.is_resolved() && + )* true} + }, + ) + }, + &|_ident| quote! {true}, ); - - let expand_named = |ident, fields| expand_named(ident, fields, &inputs_list_ident); - let expand_unnamed = |ident, fields| expand_unnamed(ident, fields, &inputs_list_ident); - - let (try_from_impl, from_impl) = match &derive_input.data { - Data::Enum(DataEnum { variants, .. }) => { - let mut variants_idents = vec![]; - let mut variants_fields_len = vec![]; - let mut variants_fields_destructuring = vec![]; - let mut variants_try_from_expansion = vec![]; - let mut variants_from_expansion = vec![]; - - for variant in variants { - let variant_ident = &variant.ident; - let (fields_destructuring, try_from_expansion, from_expansion) = expand_fields( - &variant.ident, - &variant.fields, - expand_named, - expand_unnamed, - expand_unit, - ); - variants_idents.push(variant_ident); - variants_fields_len.push(variant.fields.len()); - variants_fields_destructuring.push(fields_destructuring); - variants_try_from_expansion.push(try_from_expansion); - variants_from_expansion.push(from_expansion); - } - - // This is similar to what Rust does for enums (configurable via the `repr` - // attribute). We use the smallest possible integer type that can - // represent all the variants. However, for now, this is not - // configurable for TaskInput enums. - let repr_bits = usize::BITS - variants.len().leading_zeros(); - let repr = match repr_bits { - 0..=8 => quote! { u8 }, - 9..=16 => quote! { u16 }, - 17..=32 => quote! { u32 }, - 33..=64 => quote! { u64 }, - _ => panic!("too many variants"), - }; - - let variants_discriminants: Vec<_> = (0..variants_idents.len()) - .map(Literal::usize_unsuffixed) - .collect(); - + let is_transient_impl = match_expansion( + &derive_input, + &|_ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.named.iter()); ( + capture, quote! { - match value { - turbo_tasks::ConcreteTaskInput::List(value) => { - let mut #inputs_list_ident = value.iter(); - - let discriminant = #inputs_list_ident.next().ok_or_else(|| anyhow::anyhow!(concat!("missing discriminant for ", stringify!(#ident))))?; - let discriminant: #repr = turbo_tasks::TaskInput::try_from_concrete(discriminant)?; - - Ok(match discriminant { - #( - #variants_discriminants => { - #variants_try_from_expansion - #ident::#variants_idents #variants_fields_destructuring - }, - )* - _ => return Err(anyhow::anyhow!("invalid discriminant for {}", stringify!(#ident))), - }) - }, - _ => Err(anyhow::anyhow!("invalid task input type, expected list (enum)")), - } + {#( + #fields.is_transient() || + )* false} }, + ) + }, + &|_ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.unnamed.iter()); + ( + capture, quote! { - match self { + {#( + #fields.is_transient() || + )* false} + }, + ) + }, + &|_ident| quote! {false}, + ); + let resolve_impl = match_expansion( + &derive_input, + &|ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.named.iter()); + ( + capture, + quote! { + { #( - #ident::#variants_idents #variants_fields_destructuring => { - let mut #inputs_list_ident = Vec::with_capacity(1 + #variants_fields_len); - let discriminant: #repr = #variants_discriminants; - let discriminant = discriminant.into_concrete(); - #inputs_list_ident.push(discriminant); - #variants_from_expansion - turbo_tasks::ConcreteTaskInput::List(#inputs_list_ident) - } + let #fields = #fields.resolve().await?; )* + Ok(#ident { #(#fields),* }) } }, ) - } - Data::Struct(DataStruct { fields, .. }) => { - let (destructuring, try_from_expansion, from_expansion) = - expand_fields(ident, fields, expand_named, expand_unnamed, expand_unit); - let fields_len = fields.len(); - + }, + &|ident, fields| { + let (capture, fields) = generate_exhaustive_destructuring(fields.unnamed.iter()); ( + capture, quote! { - match value { - turbo_tasks::ConcreteTaskInput::List(value) => { - let mut #inputs_list_ident = value.iter(); - #try_from_expansion - Ok(#ident #destructuring) - }, - _ => Err(anyhow::anyhow!("invalid task input type, expected list (struct)")), + { + #( + let #fields = #fields.resolve().await?; + )* + Ok(#ident(#(#fields),*)) } }, - quote! { - let mut #inputs_list_ident = Vec::with_capacity(#fields_len); - let #ident #destructuring = self; - #from_expansion - turbo_tasks::ConcreteTaskInput::List(#inputs_list_ident) - }, ) - } - _ => { - derive_input - .span() - .unwrap() - .error("unsupported syntax") - .emit(); - - (quote! {}, quote! {}) - } - }; + }, + &|ident| quote! {Ok(#ident)}, + ); let generic_params: Vec<_> = generics .params @@ -190,72 +149,29 @@ pub fn derive_task_input(input: TokenStream) -> TokenStream { .collect(); quote! { + #[turbo_tasks::macro_helpers::async_trait] impl #generics turbo_tasks::TaskInput for #ident #generics where #(#generic_params: turbo_tasks::TaskInput,)* { #[allow(non_snake_case)] #[allow(unreachable_code)] // This can occur for enums with no variants. - fn try_from_concrete(value: &turbo_tasks::ConcreteTaskInput) -> turbo_tasks::Result { - #try_from_impl + fn is_resolved(&self) -> bool { + #is_resolved_impl } #[allow(non_snake_case)] #[allow(unreachable_code)] // This can occur for enums with no variants. - fn into_concrete(self) -> turbo_tasks::ConcreteTaskInput { - #from_impl + fn is_transient(&self) -> bool { + #is_transient_impl + } + + #[allow(non_snake_case)] + #[allow(unreachable_code)] // This can occur for enums with no variants. + async fn resolve(&self) -> turbo_tasks::Result { + #resolve_impl } } } .into() } - -fn expand_named( - _ident: &Ident, - fields: &FieldsNamed, - inputs_list_ident: &Ident, -) -> (TokenStream2, TokenStream2, TokenStream2) { - let (destructuring, fields_idents) = generate_exhaustive_destructuring(fields.named.iter()); - ( - destructuring, - quote! { - #( - let #fields_idents = #inputs_list_ident.next().ok_or_else(|| anyhow::anyhow!(concat!("missing element for ", stringify!(#fields_idents))))?; - let #fields_idents = turbo_tasks::TaskInput::try_from_concrete(#fields_idents)?; - )* - }, - quote! { - #( - let #fields_idents = #fields_idents.into_concrete(); - #inputs_list_ident.push(#fields_idents); - )* - }, - ) -} - -fn expand_unnamed( - _ident: &Ident, - fields: &FieldsUnnamed, - inputs_list_ident: &Ident, -) -> (TokenStream2, TokenStream2, TokenStream2) { - let (destructuring, fields_idents) = generate_exhaustive_destructuring(fields.unnamed.iter()); - ( - destructuring, - quote! { - #( - let #fields_idents = #inputs_list_ident.next().ok_or_else(|| anyhow::anyhow!(concat!("missing element for ", stringify!(#fields_idents))))?; - let #fields_idents = turbo_tasks::TaskInput::try_from_concrete(#fields_idents)?; - )* - }, - quote! { - #( - let #fields_idents = #fields_idents.into_concrete(); - #inputs_list_ident.push(#fields_idents); - )* - }, - ) -} - -fn expand_unit(_ident: &Ident) -> (TokenStream2, TokenStream2, TokenStream2) { - (quote! {}, quote! {}, quote! {}) -} diff --git a/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs b/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs index 95e38814eacde..f735624997d2b 100644 --- a/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs @@ -1,5 +1,5 @@ use proc_macro::TokenStream; -use proc_macro2::{Ident, TokenStream as TokenStream2}; +use proc_macro2::TokenStream as TokenStream2; use quote::quote; use syn::{parse_macro_input, DeriveInput, Field, FieldsNamed, FieldsUnnamed}; use turbo_tasks_macros_shared::{generate_destructuring, match_expansion}; @@ -32,7 +32,7 @@ pub fn derive_trace_raw_vcs(input: TokenStream) -> TokenStream { .into() } -fn trace_named(_ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { +fn trace_named(_ident: TokenStream2, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.named.iter(), &filter_field); ( captures, @@ -44,7 +44,7 @@ fn trace_named(_ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStre ) } -fn trace_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { +fn trace_unnamed(_ident: TokenStream2, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.unnamed.iter(), &filter_field); ( captures, @@ -56,6 +56,6 @@ fn trace_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, Token ) } -fn trace_unit(_ident: &Ident) -> TokenStream2 { +fn trace_unit(_ident: TokenStream2) -> TokenStream2 { quote! { { } } } diff --git a/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs b/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs index 52d6fa1e52961..5f721893c5f19 100644 --- a/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs @@ -1,5 +1,5 @@ use proc_macro::TokenStream; -use proc_macro2::{Ident, TokenStream as TokenStream2}; +use proc_macro2::TokenStream as TokenStream2; use quote::quote; use syn::{parse_macro_input, DeriveInput, Field, FieldsNamed, FieldsUnnamed}; use turbo_tasks_macros_shared::{generate_destructuring, match_expansion}; @@ -62,7 +62,7 @@ fn format_field(value: TokenStream2) -> TokenStream2 { /// Formats a struct or enum variant with named fields (e.g. `struct Foo { /// bar: u32 }`, `Foo::Bar { baz: u32 }`). -fn format_named(ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { +fn format_named(ident: TokenStream2, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.named.iter(), &filter_field); ( captures, @@ -70,13 +70,13 @@ fn format_named(ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStre // this can happen if all fields are ignored, we must special-case this to avoid // rustc being unable to infer the type of an empty vec of futures quote! { - FormattingStruct::new_named(stringify!(#ident), vec![]) + FormattingStruct::new_named(turbo_tasks::stringify_path!(#ident), vec![]) } } else { let fields_values = fields_idents.iter().cloned().map(format_field); quote! { FormattingStruct::new_named_async( - stringify!(#ident), + turbo_tasks::stringify_path!(#ident), vec![#( AsyncFormattingField::new( stringify!(#fields_idents), @@ -91,7 +91,7 @@ fn format_named(ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStre /// Formats a struct or enum variant with unnamed fields (e.g. `struct /// Foo(u32)`, `Foo::Bar(u32)`). -fn format_unnamed(ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { +fn format_unnamed(ident: TokenStream2, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.unnamed.iter(), &filter_field); ( captures, @@ -99,13 +99,13 @@ fn format_unnamed(ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, Token // this can happen if all fields are ignored, we must special-case this to avoid // rustc being unable to infer the type of an empty vec of futures quote! { - FormattingStruct::new_unnamed(stringify!(#ident), vec![]) + FormattingStruct::new_unnamed(turbo_tasks::stringify_path!(#ident), vec![]) } } else { let fields_values = fields_idents.into_iter().map(format_field); quote! { FormattingStruct::new_unnamed_async( - stringify!(#ident), + turbo_tasks::stringify_path!(#ident), vec![#( #fields_values, )*], @@ -116,10 +116,10 @@ fn format_unnamed(ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, Token } /// Formats a unit struct or enum variant (e.g. `struct Foo;`, `Foo::Bar`). -fn format_unit(ident: &Ident) -> TokenStream2 { +fn format_unit(ident: TokenStream2) -> TokenStream2 { quote! { FormattingStruct::new_unnamed( - stringify!(#ident), + turbo_tasks::stringify_path!(#ident), vec![], ) } diff --git a/crates/turbo-tasks-macros/src/func.rs b/crates/turbo-tasks-macros/src/func.rs index 6c8129cd634b4..d6840ded4fe59 100644 --- a/crates/turbo-tasks-macros/src/func.rs +++ b/crates/turbo-tasks-macros/src/func.rs @@ -174,8 +174,6 @@ impl TurboFn { // `turbo_tasks::Vc` here. // We'll rely on the compiler to emit an error // if the user provided an invalid receiver type - // when - // calling `into_concrete`. let ident = ident.ident.clone(); @@ -293,17 +291,17 @@ impl TurboFn { } } - fn converted_inputs(&self) -> Punctuated { + fn inputs(&self) -> Vec<&Ident> { self.inputs .iter() - .map(|Input { ty, ident }| -> Expr { - parse_quote! { - <#ty as turbo_tasks::task::TaskInput>::into_concrete(#ident) - } - }) + .map(|Input { ident, .. }| ident) .collect() } + pub fn input_types(&self) -> Vec<&Type> { + self.inputs.iter().map(|Input { ty, .. }| ty).collect() + } + fn converted_this(&self) -> Option { self.this.as_ref().map(|Input { ty: _, ident }| { parse_quote! { @@ -318,7 +316,7 @@ impl TurboFn { let ident = &self.ident; let output = &self.output; if let Some(converted_this) = self.converted_this() { - let converted_inputs = self.converted_inputs(); + let inputs = self.inputs(); parse_quote! { { <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( @@ -326,7 +324,7 @@ impl TurboFn { *#trait_type_id_ident, std::borrow::Cow::Borrowed(stringify!(#ident)), #converted_this, - turbo_tasks::TaskInput::into_concrete((#converted_inputs)), + Box::new((#(#inputs,)*)) as Box, ) ) } @@ -344,7 +342,7 @@ impl TurboFn { /// given native function. pub fn static_block(&self, native_function_id_ident: &Ident) -> Block { let output = &self.output; - let converted_inputs = self.converted_inputs(); + let inputs = self.inputs(); if let Some(converted_this) = self.converted_this() { parse_quote! { { @@ -352,7 +350,7 @@ impl TurboFn { turbo_tasks::dynamic_this_call( *#native_function_id_ident, #converted_this, - turbo_tasks::TaskInput::into_concrete((#converted_inputs)), + Box::new((#(#inputs,)*)) as Box, ) ) } @@ -363,7 +361,7 @@ impl TurboFn { <#output as turbo_tasks::task::TaskOutput>::try_from_raw_vc( turbo_tasks::dynamic_call( *#native_function_id_ident, - turbo_tasks::TaskInput::into_concrete((#converted_inputs)), + Box::new((#(#inputs,)*)) as Box, ) ) } @@ -394,7 +392,7 @@ fn expand_vc_return_type(orig_output: &Type) -> Type { new_output = match new_output { Type::Group(TypeGroup { elem, .. }) => *elem, Type::Tuple(TypeTuple { elems, .. }) if elems.is_empty() => { - Type::Path(parse_quote!(::turbo_tasks::Vc<()>)) + Type::Path(parse_quote!(turbo_tasks::Vc<()>)) } Type::Path(TypePath { qself: None, diff --git a/crates/turbo-tasks-macros/src/value_impl_macro.rs b/crates/turbo-tasks-macros/src/value_impl_macro.rs index 235268169d125..93eff9cdece0f 100644 --- a/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -252,7 +252,6 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { all_definitions.push(quote! { #[doc(hidden)] #[allow(non_camel_case_types)] - // #[turbo_tasks::async_trait] trait #inline_extension_trait_ident: std::marker::Send { #[allow(declare_interior_mutable_const)] #[doc(hidden)] @@ -267,7 +266,6 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { } #[doc(hidden)] - // #[turbo_tasks::async_trait] impl #impl_generics #inline_extension_trait_ident for #ty #where_clause { #[allow(declare_interior_mutable_const)] #[doc(hidden)] diff --git a/crates/turbo-tasks-macros/src/value_macro.rs b/crates/turbo-tasks-macros/src/value_macro.rs index 10155d62625cf..9e79117540894 100644 --- a/crates/turbo-tasks-macros/src/value_macro.rs +++ b/crates/turbo-tasks-macros/src/value_macro.rs @@ -241,7 +241,7 @@ pub fn value(args: TokenStream, input: TokenStream) -> TokenStream { // effectively appending to. If there's not, rustdoc will strip // the leading whitespace. let doc_str = format!( - "\n\nThis is a [transparent value type][::turbo_tasks::value#transparent] \ + "\n\nThis is a [transparent value type][turbo_tasks::value#transparent] \ wrapping [`{}`].", inner_type_string, ); diff --git a/crates/turbo-tasks-macros/src/value_trait_macro.rs b/crates/turbo-tasks-macros/src/value_trait_macro.rs index 931c26e69944d..5eabf273b7851 100644 --- a/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -64,7 +64,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { let trait_type_ident = get_trait_type_ident(trait_ident); let trait_type_id_ident = get_trait_type_id_ident(trait_ident); let mut dynamic_trait_fns = Vec::new(); - let mut default_method_registers: Vec = Vec::new(); + let mut trait_methods: Vec = Vec::new(); let mut native_functions = Vec::new(); let mut items = Vec::with_capacity(raw_items.len()); @@ -93,6 +93,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { }; let turbo_signature = turbo_fn.signature(); + let arg_types = turbo_fn.input_types(); let dynamic_block = turbo_fn.dynamic_block(&trait_type_id_ident); dynamic_trait_fns.push(quote! { #turbo_signature #dynamic_block @@ -124,14 +125,13 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { #native_function_ident }); - default_method_registers.push(quote! { - trait_type.register_default_trait_method(stringify!(#ident).into(), *#native_function_id_ident); + trait_methods.push(quote! { + trait_type.register_default_trait_method::<(#(#arg_types),*)>(stringify!(#ident).into(), *#native_function_id_ident); }); native_functions.push(quote! { #[doc(hidden)] #[allow(non_camel_case_types)] - // #[turbo_tasks::async_trait] trait #inline_extension_trait_ident: std::marker::Send { #[allow(declare_interior_mutable_const)] const #native_function_ident: #native_function_ty; @@ -143,7 +143,6 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { } #[doc(hidden)] - // #[turbo_tasks::async_trait] // Needs to be explicit 'static here, otherwise we can get a lifetime error // in the inline signature. impl #inline_extension_trait_ident for Box { @@ -164,6 +163,9 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { Some(turbo_fn.static_block(&native_function_id_ident)) } else { + trait_methods.push(quote! { + trait_type.register_trait_method::<(#(#arg_types),*)>(stringify!(#ident).into()); + }); None }; @@ -177,21 +179,8 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { let value_debug_impl = if debug { quote! { - #[turbo_tasks::value_impl] - impl turbo_tasks::debug::ValueDebug for Box { - #[turbo_tasks::function] - pub fn dbg(self: turbo_tasks::Vc) -> turbo_tasks::Vc { - use turbo_tasks::debug::ValueDebug; - self.dbg_depth(usize::MAX) - } - - #[turbo_tasks::function] - pub async fn dbg_depth(self: turbo_tasks::Vc, depth: usize) -> anyhow::Result> { - use turbo_tasks::debug::ValueDebugFormat; - let string = self.value_debug_format(depth).try_to_value_debug_string().await?.await?; - Ok(turbo_tasks::debug::ValueDebugString::new(format!(concat!(stringify!(#trait_ident), "({})"), string))) - } - } + unsafe impl turbo_tasks::Dynamic> for Box {} + unsafe impl turbo_tasks::Upcast> for Box {} } } else { quote! {} @@ -204,6 +193,10 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { }); } extended_supertraits.push(quote!(::std::marker::Send)); + extended_supertraits.push(quote!(::std::marker::Sync)); + if debug { + extended_supertraits.push(quote!(turbo_tasks::debug::ValueDebug)); + } let expanded = quote! { #[must_use] @@ -219,7 +212,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { pub(crate) static #trait_type_ident: turbo_tasks::macro_helpers::Lazy = turbo_tasks::macro_helpers::Lazy::new(|| { let mut trait_type = turbo_tasks::TraitType::new(stringify!(#trait_ident).to_string());; - #(#default_method_registers)* + #(#trait_methods)* trait_type }); #[doc(hidden)] diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 19560c4ae809c..10073a89ef5af 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -294,12 +294,13 @@ impl Backend for MemoryBackend { DEPENDENCIES_TO_TRACK.scope(RefCell::new(TaskEdgesSet::new()), future) } - fn try_start_task_execution( - &self, + fn try_start_task_execution<'a>( + &'a self, task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Option { - self.with_task(task, |task| task.execute(self, turbo_tasks)) + ) -> Option> { + let task = self.task(task); + task.execute(self, turbo_tasks) } fn task_execution_result( @@ -608,8 +609,7 @@ impl Backend for MemoryBackend { }); // It's important to avoid overallocating memory as this will go into the task // cache and stay there forever. We can to be as small as possible. - let (task_type_hash, mut task_type) = PreHashed::into_parts(task_type); - task_type.shrink_to_fit(); + let (task_type_hash, task_type) = PreHashed::into_parts(task_type); let task_type = Arc::new(PreHashed::new(task_type_hash, task_type)); // slow pass with key lock let id = turbo_tasks.get_fresh_task_id(); diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index d424971f903cf..53791e9b9e2d4 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -695,11 +695,11 @@ impl Task { TaskMetaStateWriteGuard::partial_from(self.state.write()) } - pub(crate) fn execute( - self: &Task, - backend: &MemoryBackend, + pub(crate) fn execute<'a>( + self: &'a Task, + backend: &'a MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Option { + ) -> Option> { let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); let (future, span) = { let mut state = self.full_state_mut(); @@ -740,11 +740,14 @@ impl Task { } /// Prepares task execution and returns a future that will execute the task. - fn make_execution_future( - self: &Task, + fn make_execution_future<'a>( + self: &'a Task, _backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> (Pin> + Send>>, Span) { + ) -> ( + Pin> + Send + 'a>>, + Span, + ) { match &self.ty { TaskType::Root(bound_fn) => { (bound_fn(), tracing::trace_span!("turbo_tasks::root_task")) @@ -757,31 +760,29 @@ impl Task { PersistentTaskType::Native { fn_type: native_fn, this, - arg: inputs, + arg, } => { let func = registry::get_function(*native_fn); let span = func.span(); let entered = span.enter(); - let bound_fn = func.bind(*this, inputs); - let future = bound_fn(); + let future = func.execute(*this, &**arg); drop(entered); (future, span) } PersistentTaskType::ResolveNative { fn_type: ref native_fn_id, this, - arg: inputs, + arg, } => { let native_fn_id = *native_fn_id; let func = registry::get_function(native_fn_id); let span = func.resolve_span(); let entered = span.enter(); - let inputs = inputs.clone(); let turbo_tasks = turbo_tasks.pin(); let future = Box::pin(PersistentTaskType::run_resolve_native( native_fn_id, *this, - inputs, + &**arg, turbo_tasks, )); drop(entered); @@ -791,20 +792,19 @@ impl Task { trait_type: trait_type_id, method_name: name, this, - arg: inputs, + arg, } => { let trait_type_id = *trait_type_id; let trait_type = registry::get_trait(trait_type_id); let span = trait_type.resolve_span(name); let entered = span.enter(); let name = name.clone(); - let inputs = inputs.clone(); let turbo_tasks = turbo_tasks.pin(); let future = Box::pin(PersistentTaskType::run_resolve_trait( trait_type_id, name, *this, - inputs, + &**arg, turbo_tasks, )); drop(entered); diff --git a/crates/turbo-tasks-memory/tests/all_in_one.rs b/crates/turbo-tasks-memory/tests/all_in_one.rs index f83d05b6ca8e9..b588f2bfe4930 100644 --- a/crates/turbo-tasks-memory/tests/all_in_one.rs +++ b/crates/turbo-tasks-memory/tests/all_in_one.rs @@ -1,6 +1,6 @@ #![feature(arbitrary_self_types)] -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use indexmap::{IndexMap, IndexSet}; use turbo_tasks::{debug::ValueDebug, RcStr, Value, ValueToString, Vc}; use turbo_tasks_testing::{register, run}; @@ -35,7 +35,7 @@ async fn all_in_one() { let a: Vc = Vc::cell(32); let b: Vc = Vc::cell(10); - let c: Vc = a.add(b); + let c: Vc = a.add(Vc::upcast(b)); assert_eq!(*c.await?, 42); @@ -107,11 +107,11 @@ async fn all_in_one() { } #[turbo_tasks::value(transparent, serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] struct MyTransparentValue(u32); #[turbo_tasks::value(shared, serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] enum MyEnumValue { Yeah(u32), Nah, @@ -215,7 +215,7 @@ async fn my_function( #[turbo_tasks::value_trait] trait Add { - fn add(self: Vc, other: Vc) -> Vc; + fn add(self: Vc, other: Vc>) -> Vc; } #[turbo_tasks::value(transparent)] @@ -224,7 +224,10 @@ struct Number(u32); #[turbo_tasks::value_impl] impl Add for Number { #[turbo_tasks::function] - async fn add(self: Vc, other: Vc) -> Result> { + async fn add(self: Vc, other: Vc>) -> Result> { + let Some(other) = Vc::try_resolve_downcast_type::(other).await? else { + bail!("Expected Number"); + }; Ok(Vc::cell(*self.await? + *other.await?)) } } @@ -235,7 +238,10 @@ struct NumberB(u32); #[turbo_tasks::value_impl] impl Add for NumberB { #[turbo_tasks::function] - async fn add(self: Vc, other: Vc) -> Result> { + async fn add(self: Vc, other: Vc>) -> Result> { + let Some(other) = Vc::try_resolve_downcast_type::(other).await? else { + bail!("Expected NumberB"); + }; Ok(Vc::cell(*self.await? + *other.await?)) } } diff --git a/crates/turbo-tasks-memory/tests/debug.rs b/crates/turbo-tasks-memory/tests/debug.rs index 3959cb036ed74..ecc2c1c6e4d11 100644 --- a/crates/turbo-tasks-memory/tests/debug.rs +++ b/crates/turbo-tasks-memory/tests/debug.rs @@ -27,7 +27,7 @@ async fn transparent_debug() { async fn enum_none_debug() { run! { let a: Vc = Enum::None.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), "None"); + assert_eq!(format!("{:?}", a.dbg().await?), "Enum::None"); } } @@ -35,7 +35,7 @@ async fn enum_none_debug() { async fn enum_transparent_debug() { run! { let a: Vc = Enum::Transparent(Transparent(42).cell()).cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"Transparent( + assert_eq!(format!("{:?}", a.dbg().await?), r#"Enum::Transparent( 42, )"#); } @@ -45,8 +45,8 @@ async fn enum_transparent_debug() { async fn enum_inner_vc_debug() { run! { let a: Vc = Enum::Enum(Enum::None.cell()).cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"Enum( - None, + assert_eq!(format!("{:?}", a.dbg().await?), r#"Enum::Enum( + Enum::None, )"#); } } diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index 2c0e62f88c67f..353d0a1b3c7be 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -20,7 +20,8 @@ use turbo_tasks::{ registry, test_helpers::with_turbo_tasks_for_testing, util::{SharedError, StaticOrArc}, - CellId, InvalidationReason, RawVc, TaskId, TraitTypeId, TurboTasksApi, TurboTasksCallApi, + CellId, InvalidationReason, MagicAny, RawVc, TaskId, TraitTypeId, TurboTasksApi, + TurboTasksCallApi, }; enum Task { @@ -40,12 +41,11 @@ impl VcStorage { &self, func: turbo_tasks::FunctionId, this_arg: Option, - arg: turbo_tasks::ConcreteTaskInput, + arg: Box, ) -> RawVc { let this = self.this.upgrade().unwrap(); - let func = registry::get_function(func).bind(this_arg, &arg); let handle = tokio::runtime::Handle::current(); - let future = func(); + let future = registry::get_function(func).execute(this_arg, &*arg); let i = { let mut tasks = self.tasks.lock().unwrap(); let i = tasks.len(); @@ -80,11 +80,7 @@ impl VcStorage { } impl TurboTasksCallApi for VcStorage { - fn dynamic_call( - &self, - func: turbo_tasks::FunctionId, - arg: turbo_tasks::ConcreteTaskInput, - ) -> RawVc { + fn dynamic_call(&self, func: turbo_tasks::FunctionId, arg: Box) -> RawVc { self.dynamic_call(func, None, arg) } @@ -92,16 +88,12 @@ impl TurboTasksCallApi for VcStorage { &self, func: turbo_tasks::FunctionId, this_arg: RawVc, - arg: turbo_tasks::ConcreteTaskInput, + arg: Box, ) -> RawVc { self.dynamic_call(func, Some(this_arg), arg) } - fn native_call( - &self, - _func: turbo_tasks::FunctionId, - _arg: turbo_tasks::ConcreteTaskInput, - ) -> RawVc { + fn native_call(&self, _func: turbo_tasks::FunctionId, _arg: Box) -> RawVc { unreachable!() } @@ -109,7 +101,7 @@ impl TurboTasksCallApi for VcStorage { &self, _func: turbo_tasks::FunctionId, _this: RawVc, - _arg: turbo_tasks::ConcreteTaskInput, + _arg: Box, ) -> RawVc { unreachable!() } @@ -119,7 +111,7 @@ impl TurboTasksCallApi for VcStorage { _trait_type: turbo_tasks::TraitTypeId, _trait_fn_name: Cow<'static, str>, _this: RawVc, - _arg: turbo_tasks::ConcreteTaskInput, + _arg: Box, ) -> RawVc { unreachable!() } diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index aa52277f0a140..6e8194ed2204a 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -18,12 +18,13 @@ use tracing::Span; pub use crate::id::{BackendJobId, ExecutionId}; use crate::{ event::EventListener, + magic_any::MagicAny, manager::TurboTasksBackendApi, raw_vc::CellId, registry, trait_helpers::{get_trait_method, has_trait, traits}, - ConcreteTaskInput, FunctionId, RawVc, ReadRef, SharedReference, TaskId, TaskIdProvider, - TaskIdSet, TraitRef, TraitTypeId, ValueTypeId, VcValueTrait, VcValueType, + FunctionId, RawVc, ReadRef, SharedReference, TaskId, TaskIdProvider, TaskIdSet, TraitRef, + TraitTypeId, ValueTypeId, VcValueTrait, VcValueType, }; pub enum TaskType { @@ -65,13 +66,13 @@ impl Debug for TransientTaskType { } } -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Hash)] pub enum PersistentTaskType { /// A normal task execution a native (rust) function Native { fn_type: FunctionId, this: Option, - arg: ConcreteTaskInput, + arg: Box, }, /// A resolve task, which resolves arguments and calls the function with @@ -79,7 +80,7 @@ pub enum PersistentTaskType { ResolveNative { fn_type: FunctionId, this: Option, - arg: ConcreteTaskInput, + arg: Box, }, /// A trait method resolve task. It resolves the first (`self`) argument and @@ -90,7 +91,7 @@ pub enum PersistentTaskType { trait_type: TraitTypeId, method_name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, }, } @@ -100,28 +101,206 @@ impl Display for PersistentTaskType { } } -impl PersistentTaskType { - pub fn shrink_to_fit(&mut self) { - match self { - Self::Native { - fn_type: _, - this: _, - arg, - } => arg.shrink_to_fit(), - Self::ResolveNative { - fn_type: _, - this: _, - arg, - } => arg.shrink_to_fit(), - Self::ResolveTrait { - trait_type: _, - method_name: _, - this: _, - arg, - } => arg.shrink_to_fit(), +mod ser { + use serde::{ + ser::{SerializeSeq, SerializeTuple}, + Deserialize, Deserializer, Serialize, Serializer, + }; + + use super::*; + + enum FunctionAndArg<'a> { + Owned { + fn_type: FunctionId, + arg: Box, + }, + Borrowed { + fn_type: FunctionId, + arg: &'a dyn MagicAny, + }, + } + + impl<'a> Serialize for FunctionAndArg<'a> { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + let FunctionAndArg::Borrowed { fn_type, arg } = self else { + unreachable!(); + }; + let mut state = serializer.serialize_seq(Some(2))?; + state.serialize_element(&fn_type)?; + let arg = *arg; + let arg = registry::get_function(*fn_type).arg_meta.as_serialize(arg); + state.serialize_element(arg)?; + state.end() + } + } + + impl<'de> Deserialize<'de> for FunctionAndArg<'de> { + fn deserialize>(deserializer: D) -> Result { + struct Visitor; + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = FunctionAndArg<'de>; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a valid PersistentTaskType") + } + + fn visit_seq(self, mut seq: A) -> std::result::Result + where + A: serde::de::SeqAccess<'de>, + { + let fn_type = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?; + let seed = registry::get_function(fn_type) + .arg_meta + .deserialization_seed(); + let arg = seq + .next_element_seed(seed)? + .ok_or_else(|| serde::de::Error::invalid_length(1, &self))?; + Ok(FunctionAndArg::Owned { fn_type, arg }) + } + } + deserializer.deserialize_seq(Visitor) + } + } + + impl Serialize for PersistentTaskType { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: ser::Serializer, + { + match self { + PersistentTaskType::Native { fn_type, this, arg } => { + let mut s = serializer.serialize_seq(Some(3))?; + s.serialize_element::(&0)?; + s.serialize_element(&FunctionAndArg::Borrowed { + fn_type: *fn_type, + arg, + })?; + s.serialize_element(this)?; + s.end() + } + PersistentTaskType::ResolveNative { fn_type, this, arg } => { + let mut s = serializer.serialize_seq(Some(3))?; + s.serialize_element::(&1)?; + s.serialize_element(&FunctionAndArg::Borrowed { + fn_type: *fn_type, + arg, + })?; + s.serialize_element(this)?; + s.end() + } + PersistentTaskType::ResolveTrait { + trait_type, + method_name, + this, + arg, + } => { + let mut s = serializer.serialize_tuple(5)?; + s.serialize_element::(&2)?; + s.serialize_element(trait_type)?; + s.serialize_element(method_name)?; + s.serialize_element(this)?; + let arg = if let Some(method) = + registry::get_trait(*trait_type).methods.get(method_name) + { + method.arg_serializer.as_serialize(arg) + } else { + return Err(serde::ser::Error::custom("Method not found")); + }; + s.serialize_element(arg)?; + s.end() + } + } + } + } + + impl<'de> Deserialize<'de> for PersistentTaskType { + fn deserialize>(deserializer: D) -> Result { + #[derive(Deserialize)] + enum VariantKind { + Native, + ResolveNative, + ResolveTrait, + } + struct Visitor; + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = PersistentTaskType; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a valid PersistentTaskType") + } + + fn visit_seq(self, mut seq: A) -> std::result::Result + where + A: serde::de::SeqAccess<'de>, + { + let kind = seq + .next_element::()? + .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?; + match kind { + 0 => { + let FunctionAndArg::Owned { fn_type, arg } = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(1, &self))? + else { + unreachable!(); + }; + let this = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(2, &self))?; + Ok(PersistentTaskType::Native { fn_type, this, arg }) + } + 1 => { + let FunctionAndArg::Owned { fn_type, arg } = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(1, &self))? + else { + unreachable!(); + }; + let this = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(2, &self))?; + Ok(PersistentTaskType::ResolveNative { fn_type, this, arg }) + } + 2 => { + let trait_type = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?; + let method_name = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(1, &self))?; + let this = seq + .next_element()? + .ok_or_else(|| serde::de::Error::invalid_length(2, &self))?; + let Some(method) = + registry::get_trait(trait_type).methods.get(&method_name) + else { + return Err(serde::de::Error::custom("Method not found")); + }; + let arg = seq + .next_element_seed(method.arg_deserializer)? + .ok_or_else(|| serde::de::Error::invalid_length(3, &self))?; + Ok(PersistentTaskType::ResolveTrait { + trait_type, + method_name, + this, + arg, + }) + } + _ => Err(serde::de::Error::custom("Invalid variant")), + } + } + } + deserializer.deserialize_seq(Visitor) } } +} +impl PersistentTaskType { /// Returns the name of the function in the code. Trait methods are /// formatted as `TraitName::method_name`. /// @@ -149,8 +328,8 @@ impl PersistentTaskType { } } -pub struct TaskExecutionSpec { - pub future: Pin> + Send>>, +pub struct TaskExecutionSpec<'a> { + pub future: Pin> + Send + 'a>>, pub span: Span, } @@ -232,11 +411,11 @@ pub trait Backend: Sync + Send { future: T, ) -> Self::ExecutionScopeFuture; - fn try_start_task_execution( - &self, + fn try_start_task_execution<'a>( + &'a self, task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Option; + ) -> Option>; fn task_execution_result( &self, @@ -376,13 +555,13 @@ impl PersistentTaskType { pub async fn run_resolve_native( fn_id: FunctionId, mut this: Option, - arg: ConcreteTaskInput, + arg: &dyn MagicAny, turbo_tasks: Arc>, ) -> Result { if let Some(this) = this.as_mut() { *this = this.resolve().await?; } - let arg = arg.resolve().await?; + let arg = registry::get_function(fn_id).arg_meta.resolve(arg).await?; Ok(if let Some(this) = this { turbo_tasks.this_call(fn_id, this, arg) } else { @@ -406,7 +585,7 @@ impl PersistentTaskType { trait_type: TraitTypeId, name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: &dyn MagicAny, turbo_tasks: Arc>, ) -> Result { let this = this.resolve().await?; @@ -418,7 +597,10 @@ impl PersistentTaskType { }; let native_fn = Self::resolve_trait_method_from_value(trait_type, this_ty, name)?; - let arg = arg.resolve().await?; + let arg = registry::get_function(native_fn) + .arg_meta + .resolve(arg) + .await?; Ok(turbo_tasks.dynamic_this_call(native_fn, this, arg)) } @@ -454,40 +636,6 @@ impl PersistentTaskType { } } } - - pub fn run( - self, - turbo_tasks: Arc>, - ) -> Pin> + Send>> { - match self { - PersistentTaskType::Native { - fn_type: fn_id, - this, - arg, - } => { - let native_fn = registry::get_function(fn_id); - let bound = native_fn.bind(this, &arg); - (bound)() - } - PersistentTaskType::ResolveNative { - fn_type: fn_id, - this, - arg: inputs, - } => Box::pin(Self::run_resolve_native(fn_id, this, inputs, turbo_tasks)), - PersistentTaskType::ResolveTrait { - trait_type, - method_name: name, - this, - arg: inputs, - } => Box::pin(Self::run_resolve_trait( - trait_type, - name, - this, - inputs, - turbo_tasks, - )), - } - } } #[cfg(test)] @@ -512,7 +660,7 @@ pub(crate) mod tests { PersistentTaskType::Native { fn_type: *MOCK_FUNC_TASK_FUNCTION_ID, this: None, - arg: Default::default() + arg: Box::new(()), } .get_name(), "mock_func_task", @@ -522,7 +670,7 @@ pub(crate) mod tests { trait_type: *MOCKTRAIT_TRAIT_TYPE_ID, method_name: "mock_method_task".into(), this: RawVc::TaskOutput(unsafe { TaskId::new_unchecked(1) }), - arg: Default::default() + arg: Box::new(()), } .get_name(), "MockTrait::mock_method_task", diff --git a/crates/turbo-tasks/src/lib.rs b/crates/turbo-tasks/src/lib.rs index aa60ab25ab6da..198bd4d870045 100644 --- a/crates/turbo-tasks/src/lib.rs +++ b/crates/turbo-tasks/src/lib.rs @@ -33,6 +33,7 @@ #![feature(arbitrary_self_types)] #![feature(type_alias_impl_trait)] #![feature(never_type)] +#![feature(impl_trait_in_assoc_type)] pub mod backend; mod capture_future; @@ -85,6 +86,7 @@ pub use invalidation::{ DynamicEqHash, InvalidationReason, InvalidationReasonKind, InvalidationReasonSet, }; pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt}; +pub use magic_any::MagicAny; pub use manager::{ dynamic_call, dynamic_this_call, emit, get_invalidator, mark_finished, mark_stateful, prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call, @@ -96,10 +98,7 @@ pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError}; pub use read_ref::ReadRef; use rustc_hash::FxHasher; pub use state::State; -pub use task::{ - concrete_task_input::{ConcreteTaskInput, SharedReference, SharedValue}, - task_input::TaskInput, -}; +pub use task::{task_input::TaskInput, SharedReference}; pub use trait_ref::{IntoTraitRef, TraitRef}; pub use turbo_tasks_macros::{function, value, value_impl, value_trait, TaskInput}; pub use value::{TransientInstance, TransientValue, Value}; diff --git a/crates/turbo-tasks/src/macro_helpers.rs b/crates/turbo-tasks/src/macro_helpers.rs index 3bd45451b8f27..00b58c2cfbf42 100644 --- a/crates/turbo-tasks/src/macro_helpers.rs +++ b/crates/turbo-tasks/src/macro_helpers.rs @@ -1,9 +1,13 @@ //! Runtime helpers for [turbo-tasks-macro]. +pub use async_trait::async_trait; pub use once_cell::sync::{Lazy, OnceCell}; pub use serde; pub use tracing; -pub use super::manager::{find_cell_by_type, notify_scheduled_tasks, spawn_detached}; +pub use super::{ + magic_any::MagicAny, + manager::{find_cell_by_type, notify_scheduled_tasks, spawn_detached}, +}; use crate::debug::ValueDebugFormatString; #[inline(never)] @@ -16,3 +20,10 @@ pub async fn value_debug_format_field(value: ValueDebugFormatString<'_>) -> Stri Err(err) => format!("{0:?}", err), } } + +#[macro_export] +macro_rules! stringify_path { + ($path:path) => { + stringify!($path) + }; +} diff --git a/crates/turbo-tasks/src/magic_any.rs b/crates/turbo-tasks/src/magic_any.rs index d2f48ed7a9720..7c2af51ef9253 100644 --- a/crates/turbo-tasks/src/magic_any.rs +++ b/crates/turbo-tasks/src/magic_any.rs @@ -1,7 +1,6 @@ use core::fmt; use std::{ any::{Any, TypeId}, - cmp::Ordering, fmt::Debug, hash::{Hash, Hasher}, ops::DerefMut, @@ -19,8 +18,6 @@ pub trait MagicAny: mopa::Any + Send + Sync { fn magic_hash(&self, hasher: &mut dyn Hasher); - fn magic_cmp(&self, other: &dyn MagicAny) -> Ordering; - #[cfg(debug_assertions)] fn magic_type_name(&self) -> &'static str; } @@ -34,7 +31,7 @@ mod clippy { mopafy!(MagicAny); } -impl MagicAny for T { +impl MagicAny for T { fn magic_any_arc(self: Arc) -> Arc { self } @@ -61,13 +58,6 @@ impl MagicAny for T { Hash::hash(&(TypeId::of::(), self), &mut HasherMut(hasher)) } - fn magic_cmp(&self, other: &dyn MagicAny) -> Ordering { - match other.downcast_ref::() { - None => Ord::cmp(&TypeId::of::(), &other.type_id()), - Some(other) => self.cmp(other), - } - } - #[cfg(debug_assertions)] fn magic_type_name(&self) -> &'static str { std::any::type_name::() @@ -88,18 +78,6 @@ impl PartialEq for dyn MagicAny { impl Eq for dyn MagicAny {} -impl PartialOrd for dyn MagicAny { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for dyn MagicAny { - fn cmp(&self, other: &Self) -> Ordering { - self.magic_cmp(other) - } -} - impl Hash for dyn MagicAny { fn hash(&self, hasher: &mut H) { self.magic_hash(hasher) @@ -122,7 +100,7 @@ where } impl dyn MagicAny { - pub fn as_serialize( + pub fn as_serialize( &self, ) -> &dyn erased_serde::Serialize { if let Some(r) = self.downcast_ref::() { @@ -140,6 +118,30 @@ impl dyn MagicAny { } } +type MagicAnySerializeFunctor = fn(&dyn MagicAny) -> &dyn erased_serde::Serialize; + +#[derive(Clone, Copy)] +pub struct MagicAnySerializeSeed { + functor: MagicAnySerializeFunctor, +} + +impl MagicAnySerializeSeed { + pub fn new() -> Self { + fn serialize( + value: &dyn MagicAny, + ) -> &dyn erased_serde::Serialize { + value.as_serialize::() + } + Self { + functor: serialize::, + } + } + + pub fn as_serialize<'a>(&self, value: &'a dyn MagicAny) -> &'a dyn erased_serde::Serialize { + (self.functor)(value) + } +} + type MagicAnyDeserializeSeedFunctor = fn(&mut dyn erased_serde::Deserializer<'_>) -> Result, erased_serde::Error>; @@ -151,11 +153,9 @@ pub struct MagicAnyDeserializeSeed { impl MagicAnyDeserializeSeed { pub fn new() -> Self where - T: for<'de> Deserialize<'de> + Debug + Eq + Ord + Hash + Send + Sync + 'static, + T: for<'de> Deserialize<'de> + Debug + Eq + Hash + Send + Sync + 'static, { - fn deserialize< - T: Debug + Eq + Ord + Hash + for<'de> Deserialize<'de> + Send + Sync + 'static, - >( + fn deserialize Deserialize<'de> + Send + Sync + 'static>( deserializer: &mut dyn erased_serde::Deserializer<'_>, ) -> Result, erased_serde::Error> { let value: T = erased_serde::deserialize(deserializer)?; diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 927438749d440..eef0d22893ee1 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -32,26 +32,28 @@ use crate::{ event::{Event, EventListener}, id::{BackendJobId, FunctionId, TraitTypeId}, id_factory::IdFactoryWithReuse, + magic_any::MagicAny, raw_vc::{CellId, RawVc}, + registry, trace::TraceRawVcs, trait_helpers::get_trait_method, util::StaticOrArc, vc::ReadVcFuture, - Completion, ConcreteTaskInput, InvalidationReason, InvalidationReasonSet, SharedReference, - TaskId, TaskIdSet, ValueTypeId, Vc, VcRead, VcValueTrait, VcValueType, + Completion, InvalidationReason, InvalidationReasonSet, SharedReference, TaskId, TaskIdSet, + ValueTypeId, Vc, VcRead, VcValueTrait, VcValueType, }; pub trait TurboTasksCallApi: Sync + Send { - fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc; - fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc; - fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc; - fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc; + fn dynamic_call(&self, func: FunctionId, arg: Box) -> RawVc; + fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: Box) -> RawVc; + fn native_call(&self, func: FunctionId, arg: Box) -> RawVc; + fn this_call(&self, func: FunctionId, this: RawVc, arg: Box) -> RawVc; fn trait_call( &self, trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, ) -> RawVc; fn run_once( @@ -373,7 +375,7 @@ impl TurboTasks { /// Call a native function with arguments. /// All inputs must be resolved. - pub(crate) fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + pub(crate) fn native_call(&self, func: FunctionId, arg: Box) -> RawVc { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::Native { fn_type: func, @@ -387,7 +389,7 @@ impl TurboTasks { /// Call a native function with arguments. /// All inputs must be resolved. - pub(crate) fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + pub(crate) fn this_call(&self, func: FunctionId, this: RawVc, arg: Box) -> RawVc { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( PersistentTaskType::Native { fn_type: func, @@ -401,8 +403,8 @@ impl TurboTasks { /// Calls a native function with arguments. Resolves arguments when needed /// with a wrapper task. - pub fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { - if arg.is_resolved() { + pub fn dynamic_call(&self, func: FunctionId, arg: Box) -> RawVc { + if registry::get_function(func).arg_meta.is_resolved(&*arg) { self.native_call(func, arg) } else { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( @@ -423,9 +425,9 @@ impl TurboTasks { &self, func: FunctionId, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, ) -> RawVc { - if this.is_resolved() && arg.is_resolved() { + if this.is_resolved() && registry::get_function(func).arg_meta.is_resolved(&*arg) { self.this_call(func, this, arg) } else { RawVc::TaskOutput(self.backend.get_or_create_persistent_task( @@ -447,7 +449,7 @@ impl TurboTasks { trait_type: TraitTypeId, mut trait_fn_name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, ) -> RawVc { // avoid creating a wrapper task if self is already resolved // for resolved cells we already know the value type so we can lookup the @@ -852,16 +854,16 @@ impl TurboTasks { } impl TurboTasksCallApi for TurboTasks { - fn dynamic_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + fn dynamic_call(&self, func: FunctionId, arg: Box) -> RawVc { self.dynamic_call(func, arg) } - fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + fn dynamic_this_call(&self, func: FunctionId, this: RawVc, arg: Box) -> RawVc { self.dynamic_this_call(func, this, arg) } - fn native_call(&self, func: FunctionId, arg: ConcreteTaskInput) -> RawVc { + fn native_call(&self, func: FunctionId, arg: Box) -> RawVc { self.native_call(func, arg) } - fn this_call(&self, func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { + fn this_call(&self, func: FunctionId, this: RawVc, arg: Box) -> RawVc { self.this_call(func, this, arg) } fn trait_call( @@ -869,7 +871,7 @@ impl TurboTasksCallApi for TurboTasks { trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, ) -> RawVc { self.trait_call(trait_type, trait_fn_name, this, arg) } @@ -1346,13 +1348,13 @@ pub async fn run_once_with_reason( } /// Calls [`TurboTasks::dynamic_call`] for the current turbo tasks instance. -pub fn dynamic_call(func: FunctionId, arg: ConcreteTaskInput) -> RawVc { +pub fn dynamic_call(func: FunctionId, arg: Box) -> RawVc { with_turbo_tasks(|tt| tt.dynamic_call(func, arg)) } /// Calls [`TurboTasks::dynamic_this_call`] for the current turbo tasks /// instance. -pub fn dynamic_this_call(func: FunctionId, this: RawVc, arg: ConcreteTaskInput) -> RawVc { +pub fn dynamic_this_call(func: FunctionId, this: RawVc, arg: Box) -> RawVc { with_turbo_tasks(|tt| tt.dynamic_this_call(func, this, arg)) } @@ -1361,7 +1363,7 @@ pub fn trait_call( trait_type: TraitTypeId, trait_fn_name: Cow<'static, str>, this: RawVc, - arg: ConcreteTaskInput, + arg: Box, ) -> RawVc { with_turbo_tasks(|tt| tt.trait_call(trait_type, trait_fn_name, this, arg)) } diff --git a/crates/turbo-tasks/src/native_function.rs b/crates/turbo-tasks/src/native_function.rs index 23ec8d2ded991..6a774fc6272e6 100644 --- a/crates/turbo-tasks/src/native_function.rs +++ b/crates/turbo-tasks/src/native_function.rs @@ -1,18 +1,89 @@ -use std::{fmt::Debug, hash::Hash}; +use std::{fmt::Debug, hash::Hash, pin::Pin}; +use anyhow::{Context, Result}; +use futures::Future; +use serde::{Deserialize, Serialize}; use tracing::Span; use crate::{ self as turbo_tasks, + magic_any::{MagicAny, MagicAnyDeserializeSeed, MagicAnySerializeSeed}, registry::register_function, task::{ - function::{IntoTaskFnWithThis, NativeTaskFn}, + function::{IntoTaskFnWithThis, NativeTaskFuture}, IntoTaskFn, TaskFn, }, - util::SharedError, - ConcreteTaskInput, RawVc, + RawVc, TaskInput, }; +type ResolveFunctor = + for<'a> fn( + &'a dyn MagicAny, + ) -> Pin>> + Send + 'a>>; + +type IsResolvedFunctor = fn(&dyn MagicAny) -> bool; + +pub struct ArgMeta { + serializer: MagicAnySerializeSeed, + deserializer: MagicAnyDeserializeSeed, + is_resolved: IsResolvedFunctor, + resolve: ResolveFunctor, +} + +impl ArgMeta { + pub fn new() -> Self + where + T: TaskInput + Serialize + for<'de> Deserialize<'de> + 'static, + { + fn downcast(value: &dyn MagicAny) -> &T + where + T: MagicAny, + { + value + .downcast_ref::() + .with_context(|| { + #[cfg(debug_assertions)] + return format!( + "Invalid argument type, expected {} got {}", + std::any::type_name::(), + value.magic_type_name() + ); + #[cfg(not(debug_assertions))] + return "Invalid argument type"; + }) + .unwrap() + } + Self { + serializer: MagicAnySerializeSeed::new::(), + deserializer: MagicAnyDeserializeSeed::new::(), + is_resolved: |value| downcast::(value).is_resolved(), + resolve: |value| { + Box::pin(async { + let value = downcast::(value); + let resolved = value.resolve().await?; + Ok(Box::new(resolved) as Box) + }) + }, + } + } + + pub fn deserialization_seed(&self) -> MagicAnyDeserializeSeed { + self.deserializer + } + + pub fn as_serialize<'a>(&self, value: &'a dyn MagicAny) -> &'a dyn erased_serde::Serialize { + self.serializer.as_serialize(value) + } + + pub fn is_resolved(&self, value: &dyn MagicAny) -> bool { + (self.is_resolved)(value) + } + + pub async fn resolve(&self, value: &dyn MagicAny) -> Result> { + (self.resolve)(value).await + } +} + /// A native (rust) turbo-tasks function. It's used internally by /// `#[turbo_tasks::function]`. #[turbo_tasks::value(cell = "new", serialization = "none", eq = "manual")] @@ -23,6 +94,9 @@ pub struct NativeFunction { /// handles the task execution. #[turbo_tasks(debug_ignore, trace_ignore)] pub implementation: Box, + + #[turbo_tasks(debug_ignore, trace_ignore)] + pub arg_meta: ArgMeta, } impl Debug for NativeFunction { @@ -36,35 +110,34 @@ impl Debug for NativeFunction { impl NativeFunction { pub fn new_function(name: String, implementation: I) -> Self where + Inputs: TaskInput + Serialize + for<'de> Deserialize<'de> + 'static, I: IntoTaskFn, { Self { name, implementation: Box::new(implementation.into_task_fn()), + arg_meta: ArgMeta::new::(), } } - pub fn new_method(name: String, implementation: I) -> Self + pub fn new_method(name: String, implementation: I) -> Self where - I: IntoTaskFnWithThis, + This: Sync + Send + 'static, + Inputs: TaskInput + Serialize + for<'de> Deserialize<'de> + 'static, + I: IntoTaskFnWithThis, { Self { name, implementation: Box::new(implementation.into_task_fn_with_this()), + arg_meta: ArgMeta::new::(), } } - /// Creates a functor for execution from a fixed set of inputs. - pub fn bind(&'static self, this: Option, arg: &ConcreteTaskInput) -> NativeTaskFn { + /// Executed the function + pub fn execute(&'static self, this: Option, arg: &dyn MagicAny) -> NativeTaskFuture { match (self.implementation).functor(this, arg) { Ok(functor) => functor, - Err(err) => { - let err = SharedError::new(err); - Box::new(move || { - let err = err.clone(); - Box::pin(async { Err(err.into()) }) - }) - } + Err(err) => Box::pin(async { Err(err) }), } } diff --git a/crates/turbo-tasks/src/no_move_vec.rs b/crates/turbo-tasks/src/no_move_vec.rs index 7fde0833bec02..830b809dbe520 100644 --- a/crates/turbo-tasks/src/no_move_vec.rs +++ b/crates/turbo-tasks/src/no_move_vec.rs @@ -11,7 +11,7 @@ const BUCKETS: usize = (usize::BITS + 1) as usize; /// An `Option`-like type that guarantees that a fully zeroed value is a valid /// `None` variant. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(u8)] enum COption { // TODO(alexkirsz) We need a way to guarantee that a fully zeroed value is a diff --git a/crates/turbo-tasks/src/raw_vc.rs b/crates/turbo-tasks/src/raw_vc.rs index 50c4a8ed16c3f..582dec5396dcf 100644 --- a/crates/turbo-tasks/src/raw_vc.rs +++ b/crates/turbo-tasks/src/raw_vc.rs @@ -35,7 +35,7 @@ pub enum ResolveTypeError { ReadError { source: anyhow::Error }, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct CellId { pub type_id: ValueTypeId, pub index: u32, @@ -52,7 +52,7 @@ impl Display for CellId { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum RawVc { TaskOutput(TaskId), TaskCell(TaskId, CellId), diff --git a/crates/turbo-tasks/src/registry.rs b/crates/turbo-tasks/src/registry.rs index 04cc6e995c2ca..e4e0581fe6e80 100644 --- a/crates/turbo-tasks/src/registry.rs +++ b/crates/turbo-tasks/src/registry.rs @@ -31,7 +31,7 @@ static TRAIT_TYPES: Lazy> = Lazy:: fn register_thing< K: TryFrom + Deref + Sync + Send + Copy, - V: Clone + Hash + Ord + Eq + Sync + Send + Copy, + V: Clone + Hash + Eq + Sync + Send + Copy, const INITIAL_CAPACITY_BITS: u32, >( global_name: &'static str, @@ -54,7 +54,7 @@ fn register_thing< fn get_thing_id< K: From + Deref + Sync + Send + Copy + Debug, - V: Clone + Hash + Ord + Eq + Debug + Sync + Send + Debug, + V: Clone + Hash + Eq + Debug + Sync + Send + Debug, >( value: V, map_by_value: &DashMap, diff --git a/crates/turbo-tasks/src/task/concrete_task_input.rs b/crates/turbo-tasks/src/task/concrete_task_input.rs deleted file mode 100644 index 87818b4d73549..0000000000000 --- a/crates/turbo-tasks/src/task/concrete_task_input.rs +++ /dev/null @@ -1,475 +0,0 @@ -use std::{ - any::Any, - fmt::{Debug, Display}, - future::Future, - hash::Hash, - pin::Pin, - sync::Arc, -}; - -use anyhow::Result; -use serde::{ser::SerializeTuple, Deserialize, Serialize}; -use unsize::CoerceUnsize; - -use crate::{ - backend::CellContent, - magic_any::MagicAny, - manager::{read_task_cell, read_task_output}, - registry, - triomphe_utils::{coerce_to_any_send_sync, downcast_triomphe_arc}, - turbo_tasks, CellId, RawVc, RcStr, TaskId, ValueTypeId, -}; - -/// A type-erased wrapper for [`triomphe::Arc`]. -#[derive(Clone)] -pub struct SharedReference( - pub Option, - pub triomphe::Arc, -); - -impl SharedReference { - pub fn new(type_id: Option, data: triomphe::Arc) -> Self { - Self(type_id, data.unsize(coerce_to_any_send_sync())) - } - - pub fn downcast(self) -> Result, Self> { - match downcast_triomphe_arc(self.1) { - Ok(data) => Ok(data), - Err(data) => Err(Self(self.0, data)), - } - } -} - -impl Hash for SharedReference { - fn hash(&self, state: &mut H) { - Hash::hash(&(&*self.1 as *const (dyn Any + Send + Sync)), state) - } -} -impl PartialEq for SharedReference { - // Must compare with PartialEq rather than std::ptr::addr_eq since the latter - // only compares their addresses. - #[allow(ambiguous_wide_pointer_comparisons)] - fn eq(&self, other: &Self) -> bool { - triomphe::Arc::ptr_eq(&self.1, &other.1) - } -} -impl Eq for SharedReference {} -impl PartialOrd for SharedReference { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} -impl Ord for SharedReference { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - Ord::cmp( - &(&*self.1 as *const (dyn Any + Send + Sync)).cast::<()>(), - &(&*other.1 as *const (dyn Any + Send + Sync)).cast::<()>(), - ) - } -} -impl Debug for SharedReference { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_tuple("SharedReference") - .field(&self.0) - .field(&self.1) - .finish() - } -} - -impl Serialize for SharedReference { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - if let SharedReference(Some(ty), arc) = self { - let value_type = registry::get_value_type(*ty); - if let Some(serializable) = value_type.any_as_serializable(arc) { - let mut t = serializer.serialize_tuple(2)?; - t.serialize_element(registry::get_value_type_global_name(*ty))?; - t.serialize_element(serializable)?; - t.end() - } else { - Err(serde::ser::Error::custom(format!( - "{:?} is not serializable", - arc - ))) - } - } else { - Err(serde::ser::Error::custom( - "untyped values are not serializable", - )) - } - } -} - -impl Display for SharedReference { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(ty) = self.0 { - write!(f, "value of type {}", registry::get_value_type(ty).name) - } else { - write!(f, "untyped value") - } - } -} - -impl<'de> Deserialize<'de> for SharedReference { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = SharedReference; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a serializable shared reference") - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: serde::de::SeqAccess<'de>, - { - if let Some(global_name) = seq.next_element()? { - if let Some(ty) = registry::get_value_type_id_by_global_name(global_name) { - if let Some(seed) = registry::get_value_type(ty).get_any_deserialize_seed() - { - if let Some(value) = seq.next_element_seed(seed)? { - Ok(SharedReference::new(Some(ty), value.into())) - } else { - Err(serde::de::Error::invalid_length( - 1, - &"tuple with type and value", - )) - } - } else { - Err(serde::de::Error::custom(format!( - "{ty} is not deserializable" - ))) - } - } else { - Err(serde::de::Error::unknown_variant(global_name, &[])) - } - } else { - Err(serde::de::Error::invalid_length( - 0, - &"tuple with type and value", - )) - } - } - } - - deserializer.deserialize_tuple(2, Visitor) - } -} - -#[derive(Debug, Clone, PartialOrd, Ord)] -pub struct TransientSharedValue(pub Arc); - -impl TransientSharedValue { - pub fn downcast(self) -> Option> { - match Arc::downcast(self.0.magic_any_arc()) { - Ok(data) => Some(data), - Err(_) => None, - } - } -} - -impl Hash for TransientSharedValue { - fn hash(&self, state: &mut H) { - self.0.hash(state); - } -} - -impl PartialEq for TransientSharedValue { - #[allow(clippy::op_ref)] - fn eq(&self, other: &Self) -> bool { - &self.0 == &other.0 - } -} -impl Eq for TransientSharedValue {} -impl Serialize for TransientSharedValue { - fn serialize(&self, _serializer: S) -> Result - where - S: serde::Serializer, - { - Err(serde::ser::Error::custom( - "Transient values can't be serialized", - )) - } -} -impl<'de> Deserialize<'de> for TransientSharedValue { - fn deserialize(_deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - unreachable!("Transient values can't be serialized") - } -} - -#[derive(Debug, Clone, PartialOrd, Ord)] -pub struct SharedValue(pub Option, pub Arc); - -impl SharedValue { - pub fn downcast(self) -> Option> { - match Arc::downcast(self.1.magic_any_arc()) { - Ok(data) => Some(data), - Err(_) => None, - } - } -} - -impl PartialEq for SharedValue { - // this breaks without the ref - #[allow(clippy::op_ref)] - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 && &self.1 == &other.1 - } -} - -impl Eq for SharedValue {} - -impl Hash for SharedValue { - fn hash(&self, state: &mut H) { - self.0.hash(state); - self.1.hash(state); - } -} - -impl Display for SharedValue { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(ty) = self.0 { - write!(f, "value of type {}", registry::get_value_type(ty).name) - } else { - write!(f, "untyped value") - } - } -} - -impl Serialize for SharedValue { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - if let SharedValue(Some(ty), arc) = self { - let value_type = registry::get_value_type(*ty); - if let Some(serializable) = value_type.magic_as_serializable(arc) { - let mut t = serializer.serialize_tuple(2)?; - t.serialize_element(registry::get_value_type_global_name(*ty))?; - t.serialize_element(serializable)?; - t.end() - } else { - Err(serde::ser::Error::custom(format!( - "{:?} is not serializable", - arc - ))) - } - } else { - Err(serde::ser::Error::custom( - "untyped values are not serializable", - )) - } - } -} - -impl<'de> Deserialize<'de> for SharedValue { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = SharedValue; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a serializable shared value") - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: serde::de::SeqAccess<'de>, - { - if let Some(global_name) = seq.next_element()? { - if let Some(ty) = registry::get_value_type_id_by_global_name(global_name) { - if let Some(seed) = - registry::get_value_type(ty).get_magic_deserialize_seed() - { - if let Some(value) = seq.next_element_seed(seed)? { - Ok(SharedValue(Some(ty), value.into())) - } else { - Err(serde::de::Error::invalid_length( - 1, - &"tuple with type and value", - )) - } - } else { - Err(serde::de::Error::custom(format!( - "{ty} is not deserializable" - ))) - } - } else { - Err(serde::de::Error::unknown_variant(global_name, &[])) - } - } else { - Err(serde::de::Error::invalid_length( - 0, - &"tuple with type and value", - )) - } - } - } - - deserializer.deserialize_tuple(2, Visitor) - } -} - -/// Intermediate representation of task inputs. -/// -/// When a task is called, all its arguments will be converted and stored as -/// [`ConcreteTaskInput`]s. When the task is actually run, these inputs will be -/// converted back into the argument types. This is handled by the -/// [`TaskInput`][crate::TaskInput] trait. -#[allow(clippy::derived_hash_with_manual_eq)] -#[derive(Debug, Hash, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Default)] -pub enum ConcreteTaskInput { - TaskOutput(TaskId), - TaskCell(TaskId, CellId), - List(Vec), - String(RcStr), - Bool(bool), - Usize(usize), - I8(i8), - U8(u8), - I16(i16), - U16(u16), - I32(i32), - U32(u32), - U64(u64), - #[default] - Nothing, - SharedValue(SharedValue), - TransientSharedValue(TransientSharedValue), - SharedReference(SharedReference), -} - -impl ConcreteTaskInput { - pub async fn resolve_to_value(self) -> Result { - let tt = turbo_tasks(); - let mut current = self; - loop { - current = match current { - ConcreteTaskInput::TaskOutput(task_id) => { - read_task_output(&*tt, task_id, false).await?.into() - } - ConcreteTaskInput::TaskCell(task_id, index) => { - read_task_cell(&*tt, task_id, index).await?.into() - } - _ => return Ok(current), - } - } - } - - pub async fn resolve(self) -> Result { - let tt = turbo_tasks(); - let mut current = self; - loop { - current = match current { - ConcreteTaskInput::TaskOutput(task_id) => { - read_task_output(&*tt, task_id, false).await?.into() - } - ConcreteTaskInput::List(list) => { - if list.iter().all(|i| i.is_resolved()) { - return Ok(ConcreteTaskInput::List(list)); - } - fn resolve_all( - list: Vec, - ) -> Pin>> + Send>> - { - use crate::TryJoinIterExt; - Box::pin(list.into_iter().map(|i| i.resolve()).try_join()) - } - return Ok(ConcreteTaskInput::List(resolve_all(list).await?)); - } - _ => return Ok(current), - } - } - } - - pub fn shrink_to_fit(&mut self) { - if let ConcreteTaskInput::List(list) = self { - list.shrink_to_fit(); - list.iter_mut().for_each(|i| i.shrink_to_fit()); - } - } - - pub fn get_task_id(&self) -> Option { - match self { - ConcreteTaskInput::TaskOutput(t) | ConcreteTaskInput::TaskCell(t, _) => Some(*t), - _ => None, - } - } - - pub fn is_resolved(&self) -> bool { - match self { - ConcreteTaskInput::TaskOutput(_) => false, - ConcreteTaskInput::List(list) => list.iter().all(|i| i.is_resolved()), - _ => true, - } - } - - pub fn is_nothing(&self) -> bool { - matches!(self, ConcreteTaskInput::Nothing) - } -} - -impl From for ConcreteTaskInput { - fn from(raw_vc: RawVc) -> Self { - match raw_vc { - RawVc::TaskOutput(task) => ConcreteTaskInput::TaskOutput(task), - RawVc::TaskCell(task, i) => ConcreteTaskInput::TaskCell(task, i), - } - } -} - -impl From for ConcreteTaskInput { - fn from(content: CellContent) -> Self { - match content { - CellContent(None) => ConcreteTaskInput::Nothing, - CellContent(Some(shared_ref)) => ConcreteTaskInput::SharedReference(shared_ref), - } - } -} - -impl Display for ConcreteTaskInput { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ConcreteTaskInput::TaskOutput(task) => write!(f, "task output {}", task), - ConcreteTaskInput::TaskCell(task, index) => write!(f, "cell {} in {}", index, task), - ConcreteTaskInput::List(list) => write!( - f, - "list {}", - list.iter() - .map(|i| i.to_string()) - .collect::>() - .join(", ") - ), - ConcreteTaskInput::String(s) => write!(f, "string {:?}", s), - ConcreteTaskInput::Bool(b) => write!(f, "bool {:?}", b), - ConcreteTaskInput::Usize(v) => write!(f, "usize {}", v), - ConcreteTaskInput::I8(v) => write!(f, "i8 {}", v), - ConcreteTaskInput::U8(v) => write!(f, "u8 {}", v), - ConcreteTaskInput::I16(v) => write!(f, "i16 {}", v), - ConcreteTaskInput::U16(v) => write!(f, "u16 {}", v), - ConcreteTaskInput::I32(v) => write!(f, "i32 {}", v), - ConcreteTaskInput::U32(v) => write!(f, "u32 {}", v), - ConcreteTaskInput::U64(v) => write!(f, "u64 {}", v), - ConcreteTaskInput::Nothing => write!(f, "nothing"), - ConcreteTaskInput::SharedValue(_) => write!(f, "any value"), - ConcreteTaskInput::TransientSharedValue(_) => write!(f, "any transient value"), - ConcreteTaskInput::SharedReference(data) => { - write!(f, "shared reference with {}", data) - } - } - } -} diff --git a/crates/turbo-tasks/src/task/function.rs b/crates/turbo-tasks/src/task/function.rs index 042218c6ae552..243404ca7490d 100644 --- a/crates/turbo-tasks/src/task/function.rs +++ b/crates/turbo-tasks/src/task/function.rs @@ -26,13 +26,12 @@ use std::{future::Future, marker::PhantomData, pin::Pin}; use anyhow::Result; use super::{TaskInput, TaskOutput}; -use crate::{ConcreteTaskInput, RawVc, Vc, VcRead, VcValueType}; +use crate::{magic_any::MagicAny, RawVc, Vc, VcRead, VcValueType}; pub type NativeTaskFuture = Pin> + Send>>; -pub type NativeTaskFn = Box NativeTaskFuture + Send + Sync>; pub trait TaskFn: Send + Sync + 'static { - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; + fn functor(&self, this: Option, arg: &dyn MagicAny) -> Result; } pub trait IntoTaskFn { @@ -58,24 +57,26 @@ where } } -pub trait IntoTaskFnWithThis { +pub trait IntoTaskFnWithThis { type TaskFn: TaskFn; fn into_task_fn_with_this(self) -> Self::TaskFn; } -impl IntoTaskFnWithThis for F +impl IntoTaskFnWithThis for F where - F: TaskFnInputFunctionWithThis, + F: TaskFnInputFunctionWithThis, Mode: TaskFnMode, + This: Sync + Send + 'static, Inputs: TaskInputs, { - type TaskFn = FunctionTaskFnWithThis; + type TaskFn = FunctionTaskFnWithThis; fn into_task_fn_with_this(self) -> Self::TaskFn { FunctionTaskFnWithThis { task_fn: self, mode: PhantomData, + this: PhantomData, inputs: PhantomData, } } @@ -93,36 +94,46 @@ where Mode: TaskFnMode, Inputs: TaskInputs, { - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { - TaskFnInputFunction::functor(&self.task_fn, this, arg) + fn functor(&self, _this: Option, arg: &dyn MagicAny) -> Result { + TaskFnInputFunction::functor(&self.task_fn, arg) } } -pub struct FunctionTaskFnWithThis { +pub struct FunctionTaskFnWithThis< + F, + Mode: TaskFnMode, + This: Sync + Send + 'static, + Inputs: TaskInputs, +> { task_fn: F, mode: PhantomData, + this: PhantomData, inputs: PhantomData, } -impl TaskFn for FunctionTaskFnWithThis +impl TaskFn for FunctionTaskFnWithThis where - F: TaskFnInputFunctionWithThis, + F: TaskFnInputFunctionWithThis, Mode: TaskFnMode, + This: Sync + Send + 'static, Inputs: TaskInputs, { - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + fn functor(&self, this: Option, arg: &dyn MagicAny) -> Result { + let Some(this) = this else { + panic!("Method needs a `self` argument"); + }; TaskFnInputFunctionWithThis::functor(&self.task_fn, this, arg) } } trait TaskFnInputFunction: Send + Sync + Clone + 'static { - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; + fn functor(&self, arg: &dyn MagicAny) -> Result; } -trait TaskFnInputFunctionWithThis: +trait TaskFnInputFunctionWithThis: Send + Sync + Clone + 'static { - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result; + fn functor(&self, this: RawVc, arg: &dyn MagicAny) -> Result; } pub trait TaskInputs: Send + Sync + 'static {} @@ -155,6 +166,20 @@ macro_rules! task_inputs_impl { } } +fn get_args(arg: &dyn MagicAny) -> Result<&T> { + let value = arg.downcast_ref::(); + #[cfg(debug_assertions)] + return anyhow::Context::with_context(value, || { + format!( + "Invalid argument type, expected {} got {}", + std::any::type_name::(), + (*arg).magic_type_name() + ) + }); + #[cfg(not(debug_assertions))] + return anyhow::Context::context(value, "Invalid argument type"); +} + macro_rules! task_fn_impl { ( $async_fn_trait:ident $arg_len:literal $( $arg:ident )* ) => { impl TaskFnInputFunction for F @@ -164,21 +189,16 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, _this: Option, arg: &ConcreteTaskInput) -> Result { - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; - + fn functor(&self, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* - Box::pin(async move { - Output::try_into_raw_vc((task_fn)($($arg),*)) - }) + Ok(Box::pin(async move { + Output::try_into_raw_vc((task_fn)($($arg,)*)) })) } } @@ -191,26 +211,21 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, _this: Option, arg: &ConcreteTaskInput) -> Result { - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; - + fn functor(&self, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* - Box::pin(async move { - Output::try_into_raw_vc((task_fn)($($arg),*).await) - }) + Ok(Box::pin(async move { + Output::try_into_raw_vc((task_fn)($($arg,)*).await) })) } } - impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis for F where Recv: VcValueType, $($arg: TaskInput + 'static,)* @@ -218,52 +233,42 @@ macro_rules! task_fn_impl { Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + fn functor(&self, this: RawVc, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; - - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* - - Box::pin(async move { - let recv = recv.await?; - let recv = <::Read as VcRead>::target_to_value_ref(&*recv); - Output::try_into_raw_vc((task_fn)(recv, $($arg),*)) - }) + let recv = Vc::::from(this); + + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* + + Ok(Box::pin(async move { + let recv = recv.await?; + let recv = <::Read as VcRead>::target_to_value_ref(&*recv); + Output::try_into_raw_vc((task_fn)(recv, $($arg,)*)) })) } } - impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis for F where - Recv: Send + 'static, + Recv: Sync + Send + 'static, $($arg: TaskInput + 'static,)* F: Fn(Vc, $($arg,)*) -> Output + Send + Sync + Clone + 'static, Output: TaskOutput + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + fn functor(&self, this: RawVc, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; + let recv = Vc::::from(this); - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* - Box::pin(async move { - Output::try_into_raw_vc((task_fn)(recv, $($arg),*)) - }) + Ok(Box::pin(async move { + Output::try_into_raw_vc((task_fn)(recv, $($arg,)*)) })) } } @@ -283,58 +288,48 @@ macro_rules! task_fn_impl { type Output = Fut::Output; } - impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis for F where Recv: VcValueType, $($arg: TaskInput + 'static,)* F: for<'a> $async_fn_trait<&'a Recv, $($arg,)*> + Clone + Send + Sync + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + fn functor(&self, this: RawVc, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; - - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* - - Box::pin(async move { - let recv = recv.await?; - let recv = <::Read as VcRead>::target_to_value_ref(&*recv); - >::Output::try_into_raw_vc((task_fn)(recv, $($arg),*).await) - }) + let recv = Vc::::from(this); + + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* + + Ok(Box::pin(async move { + let recv = recv.await?; + let recv = <::Read as VcRead>::target_to_value_ref(&*recv); + >::Output::try_into_raw_vc((task_fn)(recv, $($arg,)*).await) })) } } - impl TaskFnInputFunctionWithThis, $($arg,)*)> for F + impl TaskFnInputFunctionWithThis for F where - Recv: Send + 'static, + Recv: Sync + Send + 'static, $($arg: TaskInput + 'static,)* F: $async_fn_trait, $($arg,)*> + Clone + Send + Sync + 'static, { #[allow(non_snake_case)] - fn functor(&self, this: Option, arg: &ConcreteTaskInput) -> Result { + fn functor(&self, this: RawVc, arg: &dyn MagicAny) -> Result { let task_fn = self.clone(); - let recv = Vc::::from(this.expect("Method need to have a `self` argument")); - - #[allow(unused_parens)] - let ($($arg),*) = <($($arg),*) as TaskInput>::try_from_concrete(arg)?; + let recv = Vc::::from(this); - Ok(Box::new(move || { - let task_fn = task_fn.clone(); - $( - let $arg = $arg.clone(); - )* + let ($($arg,)*) = get_args::<($($arg,)*)>(arg)?; + $( + let $arg = $arg.clone(); + )* - Box::pin(async move { - , $($arg,)*>>::Output::try_into_raw_vc((task_fn)(recv, $($arg),*).await) - }) + Ok(Box::pin(async move { + , $($arg,)*>>::Output::try_into_raw_vc((task_fn)(recv, $($arg,)*).await) })) } } @@ -354,10 +349,6 @@ task_fn_impl! { AsyncFn9 9 A1 A2 A3 A4 A5 A6 A7 A8 A9 } task_fn_impl! { AsyncFn10 10 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } task_fn_impl! { AsyncFn11 11 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } task_fn_impl! { AsyncFn12 12 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } -task_fn_impl! { AsyncFn13 13 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } -task_fn_impl! { AsyncFn14 14 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } -task_fn_impl! { AsyncFn15 15 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } -task_fn_impl! { AsyncFn16 16 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } // There needs to be one more implementation than task_fn_impl to account for // the receiver. @@ -375,10 +366,6 @@ task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } -task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } -task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } -task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } -task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 } #[cfg(test)] mod tests { diff --git a/crates/turbo-tasks/src/task/mod.rs b/crates/turbo-tasks/src/task/mod.rs index 2fa600f9a502a..963a3a74a99d1 100644 --- a/crates/turbo-tasks/src/task/mod.rs +++ b/crates/turbo-tasks/src/task/mod.rs @@ -1,9 +1,9 @@ -pub(crate) mod concrete_task_input; pub(crate) mod function; +pub(crate) mod shared_reference; pub(crate) mod task_input; pub(crate) mod task_output; -pub use concrete_task_input::ConcreteTaskInput; -pub use function::{AsyncFunctionMode, FunctionMode, IntoTaskFn, NativeTaskFn, TaskFn}; +pub use function::{AsyncFunctionMode, FunctionMode, IntoTaskFn, TaskFn}; +pub use shared_reference::SharedReference; pub use task_input::TaskInput; pub use task_output::TaskOutput; diff --git a/crates/turbo-tasks/src/task/shared_reference.rs b/crates/turbo-tasks/src/task/shared_reference.rs new file mode 100644 index 0000000000000..747f2477c98ca --- /dev/null +++ b/crates/turbo-tasks/src/task/shared_reference.rs @@ -0,0 +1,146 @@ +use std::{ + any::Any, + fmt::{Debug, Display}, + hash::Hash, +}; + +use anyhow::Result; +use serde::{ser::SerializeTuple, Deserialize, Serialize}; +use unsize::CoerceUnsize; + +use crate::{ + registry, + triomphe_utils::{coerce_to_any_send_sync, downcast_triomphe_arc}, + ValueTypeId, +}; + +/// A type-erased wrapper for [`triomphe::Arc`]. +#[derive(Clone)] +pub struct SharedReference( + pub Option, + pub triomphe::Arc, +); + +impl SharedReference { + pub fn new(type_id: Option, data: triomphe::Arc) -> Self { + Self(type_id, data.unsize(coerce_to_any_send_sync())) + } + + pub fn downcast(self) -> Result, Self> { + match downcast_triomphe_arc(self.1) { + Ok(data) => Ok(data), + Err(data) => Err(Self(self.0, data)), + } + } +} + +impl Hash for SharedReference { + fn hash(&self, state: &mut H) { + Hash::hash(&(&*self.1 as *const (dyn Any + Send + Sync)), state) + } +} +impl PartialEq for SharedReference { + // Must compare with PartialEq rather than std::ptr::addr_eq since the latter + // only compares their addresses. + #[allow(ambiguous_wide_pointer_comparisons)] + fn eq(&self, other: &Self) -> bool { + triomphe::Arc::ptr_eq(&self.1, &other.1) + } +} +impl Eq for SharedReference {} + +impl Debug for SharedReference { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("SharedReference") + .field(&self.0) + .field(&self.1) + .finish() + } +} + +impl Serialize for SharedReference { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + if let SharedReference(Some(ty), arc) = self { + let value_type = registry::get_value_type(*ty); + if let Some(serializable) = value_type.any_as_serializable(arc) { + let mut t = serializer.serialize_tuple(2)?; + t.serialize_element(registry::get_value_type_global_name(*ty))?; + t.serialize_element(serializable)?; + t.end() + } else { + Err(serde::ser::Error::custom(format!( + "{:?} is not serializable", + arc + ))) + } + } else { + Err(serde::ser::Error::custom( + "untyped values are not serializable", + )) + } + } +} + +impl Display for SharedReference { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(ty) = self.0 { + write!(f, "value of type {}", registry::get_value_type(ty).name) + } else { + write!(f, "untyped value") + } + } +} + +impl<'de> Deserialize<'de> for SharedReference { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct Visitor; + + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = SharedReference; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a serializable shared reference") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + if let Some(global_name) = seq.next_element()? { + if let Some(ty) = registry::get_value_type_id_by_global_name(global_name) { + if let Some(seed) = registry::get_value_type(ty).get_any_deserialize_seed() + { + if let Some(value) = seq.next_element_seed(seed)? { + Ok(SharedReference::new(Some(ty), value.into())) + } else { + Err(serde::de::Error::invalid_length( + 1, + &"tuple with type and value", + )) + } + } else { + Err(serde::de::Error::custom(format!( + "{ty} is not deserializable" + ))) + } + } else { + Err(serde::de::Error::unknown_variant(global_name, &[])) + } + } else { + Err(serde::de::Error::invalid_length( + 0, + &"tuple with type and value", + )) + } + } + } + + deserializer.deserialize_tuple(2, Visitor) + } +} diff --git a/crates/turbo-tasks/src/task/task_input.rs b/crates/turbo-tasks/src/task/task_input.rs index 9d21f9e228c55..ef7cd47b5fe3c 100644 --- a/crates/turbo-tasks/src/task/task_input.rs +++ b/crates/turbo-tasks/src/task/task_input.rs @@ -1,231 +1,131 @@ -use std::{ - any::{type_name, Any}, - marker::PhantomData, - sync::Arc, -}; +use std::{any::Any, fmt::Debug, hash::Hash}; -use anyhow::{anyhow, bail, Result}; +use anyhow::Result; +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; -use super::concrete_task_input::TransientSharedValue; use crate::{ - magic_any::MagicAny, ConcreteTaskInput, RawVc, RcStr, SharedValue, TaskId, TransientInstance, - TransientValue, TypedForInput, Value, ValueTypeId, Vc, VcValueType, + magic_any::MagicAny, vc::ResolvedVc, RcStr, TaskId, TransientInstance, TransientValue, Value, + ValueTypeId, Vc, }; /// Trait to implement in order for a type to be accepted as a /// [`#[turbo_tasks::function]`][crate::function] argument. /// /// See also [`ConcreteTaskInput`]. -pub trait TaskInput: Send + Sync + Clone { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result; - fn into_concrete(self) -> ConcreteTaskInput; -} - -impl TaskInput for ConcreteTaskInput { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - Ok(input.clone()) +#[async_trait] +pub trait TaskInput: Send + Sync + Clone + Debug + PartialEq + Eq + Hash { + async fn resolve(&self) -> Result { + Ok(self.clone()) } - - fn into_concrete(self) -> ConcreteTaskInput { - self + fn is_resolved(&self) -> bool { + true } -} - -impl TaskInput for RcStr { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::String(s) => Ok(s.clone()), - _ => bail!("invalid task input type, expected String"), - } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::String(self) + fn is_transient(&self) -> bool { + false } } -impl TaskInput for bool { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::Bool(b) => Ok(*b), - _ => bail!("invalid task input type, expected Bool"), - } - } +macro_rules! impl_task_input { + ($($t:ty),*) => { + $( + #[async_trait] + impl TaskInput for $t {} + )* + }; +} - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::Bool(self) - } +impl_task_input! { + (), + bool, + u8, + u16, + u32, + i32, + u64, + usize, + RcStr, + TaskId, + ValueTypeId } +#[async_trait] impl TaskInput for Vec where T: TaskInput, { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::List(list) => Ok(list - .iter() - .map(|i| ::try_from_concrete(i)) - .collect::, _>>()?), - _ => bail!("invalid task input type, expected List"), - } + fn is_resolved(&self) -> bool { + self.iter().all(TaskInput::is_resolved) } - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::List( - self.into_iter() - .map(|i| ::into_concrete(i)) - .collect::>(), - ) + fn is_transient(&self) -> bool { + self.iter().any(TaskInput::is_transient) } -} - -impl TaskInput for u8 { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U8(value) => Ok(*value), - _ => bail!("invalid task input type, expected U8"), - } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U8(self) - } -} -impl TaskInput for u16 { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U16(value) => Ok(*value), - _ => bail!("invalid task input type, expected U16"), + async fn resolve(&self) -> Result { + let mut resolved = Vec::with_capacity(self.len()); + for value in self { + resolved.push(value.resolve().await?); } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U16(self) + Ok(resolved) } } -impl TaskInput for u32 { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U32(value) => Ok(*value), - _ => bail!("invalid task input type, expected U32"), - } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U32(self) - } -} - -impl TaskInput for i32 { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::I32(value) => Ok(*value), - _ => bail!("invalid task input type, expected I32"), - } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::I32(self) - } -} - -impl TaskInput for u64 { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U64(value) => Ok(*value), - _ => bail!("invalid task input type, expected U64"), - } - } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U64(self) - } -} - -impl TaskInput for usize { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::Usize(value) => Ok(*value), - _ => bail!("invalid task input type, expected Usize"), +#[async_trait] +impl TaskInput for Option +where + T: TaskInput, +{ + fn is_resolved(&self) -> bool { + match self { + Some(value) => value.is_resolved(), + None => true, } } - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::Usize(self) - } -} - -impl TaskInput for ValueTypeId { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U32(value) => Ok(ValueTypeId::from(*value)), - _ => bail!("invalid task input type, expected ValueTypeId"), + fn is_transient(&self) -> bool { + match self { + Some(value) => value.is_transient(), + None => false, } } - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U32(*self) - } -} - -impl TaskInput for TaskId { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::U32(value) => Ok(TaskId::from(*value)), - _ => bail!("invalid task input type, expected TaskId"), + async fn resolve(&self) -> Result { + match self { + Some(value) => Ok(Some(value.resolve().await?)), + None => Ok(None), } } - - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::U32(*self) - } } -impl TaskInput for Option +#[async_trait] +impl TaskInput for Vc where - T: TaskInput, + T: Send, { - fn try_from_concrete(value: &ConcreteTaskInput) -> Result { - match value { - ConcreteTaskInput::Nothing => Ok(None), - _ => Ok(Some(::try_from_concrete(value)?)), - } + fn is_resolved(&self) -> bool { + Vc::is_resolved(*self) } - fn into_concrete(self) -> ConcreteTaskInput { - match self { - None => ConcreteTaskInput::Nothing, - Some(value) => ::into_concrete(value), - } + fn is_transient(&self) -> bool { + false + } + + async fn resolve(&self) -> Result { + Vc::resolve(*self).await } } -impl TaskInput for Vc +impl TaskInput for ResolvedVc where T: Send, { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::TaskCell(task, index) => Ok(Vc { - node: RawVc::TaskCell(*task, *index), - _t: PhantomData, - }), - ConcreteTaskInput::TaskOutput(task) => Ok(Vc { - node: RawVc::TaskOutput(*task), - _t: PhantomData, - }), - _ => bail!("invalid task input type, expected RawVc"), - } + fn is_resolved(&self) -> bool { + true } - fn into_concrete(self) -> ConcreteTaskInput { - match self.node { - RawVc::TaskCell(task, index) => ConcreteTaskInput::TaskCell(task, index), - RawVc::TaskOutput(task) => ConcreteTaskInput::TaskOutput(task), - } + fn is_transient(&self) -> bool { + false } } @@ -236,127 +136,111 @@ where + Clone + std::hash::Hash + Eq - + Ord + Send + Sync - + VcValueType - + TypedForInput + + Serialize + + for<'de> Deserialize<'de> + 'static, { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::SharedValue(value) => { - let v = value.1.downcast_ref::().ok_or_else(|| { - anyhow!( - "invalid task input type, expected {} got {:?}", - type_name::(), - value.1, - ) - })?; - Ok(Value::new(v.clone())) - } - _ => bail!("invalid task input type, expected {}", type_name::()), - } + fn is_resolved(&self) -> bool { + true } - fn into_concrete(self) -> ConcreteTaskInput { - let raw_value: T = self.into_value(); - ConcreteTaskInput::SharedValue(SharedValue( - Some(T::get_value_type_id()), - Arc::new(raw_value), - )) + fn is_transient(&self) -> bool { + false } } impl TaskInput for TransientValue where - T: MagicAny + Clone + 'static, + T: MagicAny + Clone + Debug + Hash + Eq + 'static, { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::TransientSharedValue(value) => { - let v = value.0.downcast_ref::().ok_or_else(|| { - anyhow!( - "invalid task input type, expected {} got {:?}", - type_name::(), - value.0, - ) - })?; - Ok(TransientValue::new(v.clone())) - } - _ => bail!("invalid task input type, expected {}", type_name::()), - } + fn is_transient(&self) -> bool { + true } +} - fn into_concrete(self) -> ConcreteTaskInput { - let raw_value: T = self.into_value(); - ConcreteTaskInput::TransientSharedValue(TransientSharedValue(Arc::new(raw_value))) +impl Serialize for TransientValue +where + T: MagicAny + Clone + 'static, +{ + fn serialize(&self, _serializer: S) -> Result + where + S: serde::Serializer, + { + Err(serde::ser::Error::custom( + "cannot serialize transient task inputs", + )) } } -impl TaskInput for TransientInstance +impl<'de, T> Deserialize<'de> for TransientValue where - T: Send + Sync + 'static, + T: MagicAny + Clone + 'static, { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::SharedReference(reference) => { - if let Ok(i) = reference.clone().try_into() { - Ok(i) - } else { - bail!( - "invalid task input type, expected {} got {:?}", - type_name::(), - reference.0, - ) - } - } - _ => bail!("invalid task input type, expected {}", type_name::()), - } + fn deserialize(_deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Err(serde::de::Error::custom( + "cannot deserialize transient task inputs", + )) } +} - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::SharedReference(self.into()) +impl TaskInput for TransientInstance +where + T: Sync + Send, +{ + fn is_transient(&self) -> bool { + true } } -impl TaskInput for () { - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::Nothing => Ok(()), - _ => bail!("invalid task input type, expected Nothing"), - } +impl Serialize for TransientInstance { + fn serialize(&self, _serializer: S) -> Result + where + S: serde::Serializer, + { + Err(serde::ser::Error::custom( + "cannot serialize transient task inputs", + )) } +} - fn into_concrete(self) -> ConcreteTaskInput { - ConcreteTaskInput::Nothing +impl<'de, T> Deserialize<'de> for TransientInstance { + fn deserialize(_deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Err(serde::de::Error::custom( + "cannot deserialize transient task inputs", + )) } } macro_rules! tuple_impls { ( $( $name:ident )+ ) => { + #[async_trait] impl<$($name: TaskInput),+> TaskInput for ($($name,)+) + where $($name: TaskInput),+ { #[allow(non_snake_case)] - fn try_from_concrete(input: &ConcreteTaskInput) -> Result { - match input { - ConcreteTaskInput::List(value) => { - let mut iter = value.iter(); - $( - let $name = iter.next().ok_or_else(|| anyhow!("missing tuple element"))?; - let $name = TaskInput::try_from_concrete($name)?; - )+ - Ok(($($name,)+)) - } - _ => bail!("invalid task input type {input:?}, expected tuple {}", stringify!(($($name,)+))), - } + fn is_resolved(&self) -> bool { + let ($($name,)+) = self; + $($name.is_resolved() &&)+ true + } + + #[allow(non_snake_case)] + fn is_transient(&self) -> bool { + let ($($name,)+) = self; + $($name.is_transient() ||)+ false } #[allow(non_snake_case)] - fn into_concrete(self) -> ConcreteTaskInput { + async fn resolve(&self) -> Result { let ($($name,)+) = self; - let ($($name,)+) = ($($name.into_concrete(),)+); - ConcreteTaskInput::List(vec![ $($name,)+ ]) + Ok(($($name.resolve().await?,)+)) } } }; @@ -375,10 +259,6 @@ tuple_impls! { A B C D E F G H I } tuple_impls! { A B C D E F G H I J } tuple_impls! { A B C D E F G H I J K } tuple_impls! { A B C D E F G H I J K L } -tuple_impls! { A B C D E F G H I J K L M } -tuple_impls! { A B C D E F G H I J K L M N } -tuple_impls! { A B C D E F G H I J K L M N O } -tuple_impls! { A B C D E F G H I J K L M N O P} #[cfg(test)] mod tests { @@ -389,115 +269,99 @@ mod tests { // the crate name directly. use crate as turbo_tasks; - fn conversion(t: T) -> Result + fn assert_task_input(_: T) where T: TaskInput, { - TaskInput::try_from_concrete(&TaskInput::into_concrete(t)) - } - - macro_rules! test_conversion { - ($input:expr) => { - assert_eq!(conversion($input)?, $input); - }; } #[test] fn test_no_fields() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct NoFields; - test_conversion!(NoFields); + assert_task_input(NoFields); Ok(()) } #[test] fn test_one_unnamed_field() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct OneUnnamedField(u32); - test_conversion!(OneUnnamedField(42)); + assert_task_input(OneUnnamedField(42)); Ok(()) } #[test] fn test_multiple_unnamed_fields() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct MultipleUnnamedFields(u32, RcStr); - test_conversion!(MultipleUnnamedFields(42, "42".into())); + assert_task_input(MultipleUnnamedFields(42, "42".into())); Ok(()) } #[test] fn test_one_named_field() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct OneNamedField { named: u32, } - test_conversion!(OneNamedField { named: 42 }); + assert_task_input(OneNamedField { named: 42 }); Ok(()) } #[test] fn test_multiple_named_fields() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct MultipleNamedFields { named: u32, other: RcStr, } - test_conversion!(MultipleNamedFields { + assert_task_input(MultipleNamedFields { named: 42, - other: "42".into() + other: "42".into(), }); Ok(()) } #[test] fn test_generic_field() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] struct GenericField(T); - test_conversion!(GenericField(42)); - test_conversion!(GenericField(RcStr::from("42"))); + assert_task_input(GenericField(42)); + assert_task_input(GenericField(RcStr::from("42"))); Ok(()) } - #[test] - fn test_no_variant() -> Result<()> { - // This can't actually be tested at runtime because such an enum can't be - // constructed. However, the macro expansion is tested. - #[derive(Clone, TaskInput)] - enum NoVariants {} - Ok(()) - } - - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] enum OneVariant { Variant, } #[test] fn test_one_variant() -> Result<()> { - test_conversion!(OneVariant::Variant); + assert_task_input(OneVariant::Variant); Ok(()) } #[test] fn test_multiple_variants() -> Result<()> { - #[derive(Clone, TaskInput, PartialEq, Eq, Debug)] + #[derive(Clone, TaskInput, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)] enum MultipleVariants { Variant1, Variant2, } - test_conversion!(MultipleVariants::Variant2); + assert_task_input(MultipleVariants::Variant2); Ok(()) } - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] enum MultipleVariantsAndHeterogeneousFields { Variant1, Variant2(u32), @@ -508,16 +372,16 @@ mod tests { #[test] fn test_multiple_variants_and_heterogeneous_fields() -> Result<()> { - test_conversion!(MultipleVariantsAndHeterogeneousFields::Variant5 { + assert_task_input(MultipleVariantsAndHeterogeneousFields::Variant5 { named: 42, - other: "42".into() + other: "42".into(), }); Ok(()) } #[test] fn test_nested_variants() -> Result<()> { - #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] + #[derive(Clone, TaskInput, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] enum NestedVariants { Variant1, Variant2(MultipleVariantsAndHeterogeneousFields), @@ -526,15 +390,15 @@ mod tests { Variant5 { named: OneVariant, other: RcStr }, } - test_conversion!(NestedVariants::Variant5 { + assert_task_input(NestedVariants::Variant5 { named: OneVariant::Variant, - other: "42".into() + other: "42".into(), }); - test_conversion!(NestedVariants::Variant2( + assert_task_input(NestedVariants::Variant2( MultipleVariantsAndHeterogeneousFields::Variant5 { named: 42, - other: "42".into() - } + other: "42".into(), + }, )); Ok(()) } diff --git a/crates/turbo-tasks/src/trait_helpers.rs b/crates/turbo-tasks/src/trait_helpers.rs index 370443acac31e..d8467e1e7cfaf 100644 --- a/crates/turbo-tasks/src/trait_helpers.rs +++ b/crates/turbo-tasks/src/trait_helpers.rs @@ -11,10 +11,11 @@ pub fn get_trait_method( if let Some(func) = registry::get_value_type(value_type).get_trait_method(&key) { Ok(*func) } else if let Some(func) = registry::get_trait(trait_type) - .default_trait_methods + .methods .get(&key.1) + .and_then(|method| method.default_method) { - Ok(*func) + Ok(func) } else { Err(key.1) } diff --git a/crates/turbo-tasks/src/trait_ref.rs b/crates/turbo-tasks/src/trait_ref.rs index a7784cbef624c..d5eb54ecd8376 100644 --- a/crates/turbo-tasks/src/trait_ref.rs +++ b/crates/turbo-tasks/src/trait_ref.rs @@ -48,18 +48,6 @@ impl PartialEq for TraitRef { impl Eq for TraitRef {} -impl PartialOrd for TraitRef { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for TraitRef { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.shared_reference.cmp(&other.shared_reference) - } -} - impl std::hash::Hash for TraitRef { fn hash(&self, state: &mut H) { self.shared_reference.hash(state) diff --git a/crates/turbo-tasks/src/value.rs b/crates/turbo-tasks/src/value.rs index 0363b09c682d1..b3b36db17840f 100644 --- a/crates/turbo-tasks/src/value.rs +++ b/crates/turbo-tasks/src/value.rs @@ -1,11 +1,13 @@ use std::{fmt::Debug, marker::PhantomData, ops::Deref}; +use serde::{Deserialize, Serialize}; + use crate::SharedReference; /// Pass a value by value (`Value`) instead of by reference (`Vc`). /// /// Persistent, requires serialization. -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] +#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] pub struct Value { inner: T, } @@ -69,12 +71,17 @@ impl Deref for TransientValue { /// /// Doesn't require serialization, and won't be stored in the persistent cache /// in the future. -#[derive(Debug)] pub struct TransientInstance { inner: SharedReference, phantom: PhantomData, } +impl Debug for TransientInstance { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("TransientInstance").finish() + } +} + impl Clone for TransientInstance { fn clone(&self) -> Self { Self { @@ -98,18 +105,6 @@ impl std::hash::Hash for TransientInstance { } } -impl PartialOrd for TransientInstance { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for TransientInstance { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.inner.cmp(&other.inner) - } -} - impl From> for triomphe::Arc { fn from(instance: TransientInstance) -> Self { // we know this downcast must work because we have type T diff --git a/crates/turbo-tasks/src/value_type.rs b/crates/turbo-tasks/src/value_type.rs index 4d0301aacc2a1..d9d6e0246d8c2 100644 --- a/crates/turbo-tasks/src/value_type.rs +++ b/crates/turbo-tasks/src/value_type.rs @@ -14,7 +14,7 @@ use tracing::Span; use crate::{ id::{FunctionId, TraitTypeId}, - magic_any::{AnyDeserializeSeed, MagicAny, MagicAnyDeserializeSeed}, + magic_any::{AnyDeserializeSeed, MagicAny, MagicAnyDeserializeSeed, MagicAnySerializeSeed}, registry::{register_trait_type, register_value_type}, }; @@ -57,17 +57,6 @@ impl PartialEq for ValueType { } } -impl PartialOrd for ValueType { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} -impl Ord for ValueType { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - (self as *const ValueType).cmp(&(other as *const ValueType)) - } -} - impl Debug for ValueType { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { let mut d = f.debug_struct("ValueType"); @@ -111,7 +100,7 @@ impl ValueType { /// This is internally used by `#[turbo_tasks::value]` pub fn new_with_magic_serialization< - T: Debug + Eq + Ord + Hash + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static, + T: Debug + Eq + Hash + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static, >() -> Self { Self { name: std::any::type_name::().to_string(), @@ -204,10 +193,24 @@ impl ValueType { } } +pub struct TraitMethod { + pub default_method: Option, + pub arg_serializer: MagicAnySerializeSeed, + pub arg_deserializer: MagicAnyDeserializeSeed, +} + +impl Debug for TraitMethod { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_struct("TraitMethod") + .field("default_method", &self.default_method) + .finish() + } +} + #[derive(Debug)] pub struct TraitType { pub name: String, - pub(crate) default_trait_methods: AutoMap, FunctionId>, + pub(crate) methods: AutoMap, TraitMethod>, } impl Hash for TraitType { @@ -230,32 +233,43 @@ impl PartialEq for TraitType { } } -impl PartialOrd for TraitType { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for TraitType { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - (self as *const TraitType).cmp(&(other as *const TraitType)) - } -} - impl TraitType { pub fn new(name: String) -> Self { Self { name, - default_trait_methods: AutoMap::new(), + methods: AutoMap::new(), } } - pub fn register_default_trait_method( + pub fn register_trait_method(&mut self, name: Cow<'static, str>) + where + T: Serialize + for<'de> Deserialize<'de> + Debug + Eq + Hash + Send + Sync + 'static, + { + self.methods.insert( + name, + TraitMethod { + default_method: None, + arg_serializer: MagicAnySerializeSeed::new::(), + arg_deserializer: MagicAnyDeserializeSeed::new::(), + }, + ); + } + + pub fn register_default_trait_method( &mut self, name: Cow<'static, str>, native_fn: FunctionId, - ) { - self.default_trait_methods.insert(name, native_fn); + ) where + T: Serialize + for<'de> Deserialize<'de> + Debug + Eq + Hash + Send + Sync + 'static, + { + self.methods.insert( + name, + TraitMethod { + default_method: Some(native_fn), + arg_serializer: MagicAnySerializeSeed::new::(), + arg_deserializer: MagicAnyDeserializeSeed::new::(), + }, + ); } pub fn register(&'static self, global_name: &'static str) { @@ -269,5 +283,3 @@ impl TraitType { ) } } - -pub trait TraitMethod: Any {} diff --git a/crates/turbo-tasks/src/vc/mod.rs b/crates/turbo-tasks/src/vc/mod.rs index 1e11c402d7fab..19f106eb545d8 100644 --- a/crates/turbo-tasks/src/vc/mod.rs +++ b/crates/turbo-tasks/src/vc/mod.rs @@ -232,24 +232,6 @@ where impl Eq for Vc where T: ?Sized + Send {} -impl PartialOrd> for Vc -where - T: ?Sized + Send, -{ - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Vc -where - T: ?Sized + Send, -{ - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.node.cmp(&other.node) - } -} - impl Serialize for Vc where T: ?Sized + Send, @@ -386,6 +368,13 @@ where }) } + /// Returns `true` if the reference is resolved. + /// + /// See also [`Vc::resolve`]. + pub fn is_resolved(self) -> bool { + self.node.is_resolved() + } + /// Resolve the reference until it points to a cell directly in a strongly /// consistent way. /// diff --git a/crates/turbo-tasks/src/vc/resolved.rs b/crates/turbo-tasks/src/vc/resolved.rs index 7a80758d48640..8bdc40f648e70 100644 --- a/crates/turbo-tasks/src/vc/resolved.rs +++ b/crates/turbo-tasks/src/vc/resolved.rs @@ -20,7 +20,6 @@ use indexmap::{IndexMap, IndexSet}; use crate::{vc::Vc, RcStr}; -#[derive(Copy, Clone)] pub struct ResolvedVc where T: ?Sized + Send, @@ -28,6 +27,17 @@ where pub(crate) node: Vc, } +impl Copy for ResolvedVc where T: ?Sized + Send {} + +impl Clone for ResolvedVc +where + T: ?Sized + Send, +{ + fn clone(&self) -> Self { + *self + } +} + impl Deref for ResolvedVc where T: ?Sized + Send, @@ -39,6 +49,17 @@ where } } +impl PartialEq> for ResolvedVc +where + T: ?Sized + Send, +{ + fn eq(&self, other: &Self) -> bool { + self.node == other.node + } +} + +impl Eq for ResolvedVc where T: ?Sized + Send {} + impl Hash for ResolvedVc where T: ?Sized + Send, @@ -48,6 +69,17 @@ where } } +impl std::fmt::Debug for ResolvedVc +where + T: Send, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ResolvedVc") + .field("node", &self.node.node) + .finish() + } +} + /// Indicates that a type does not contain any instances of [`Vc`]. It may /// contain [`ResolvedVc`]. /// diff --git a/crates/turbopack-browser/src/chunking_context.rs b/crates/turbopack-browser/src/chunking_context.rs index 9e56f7a4d0561..616a30e01590c 100644 --- a/crates/turbopack-browser/src/chunking_context.rs +++ b/crates/turbopack-browser/src/chunking_context.rs @@ -88,7 +88,7 @@ impl BrowserChunkingContextBuilder { /// It splits "node_modules" separately as these are less likely to change /// during development #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Hash)] pub struct BrowserChunkingContext { name: Option, /// This path get stripped off of chunk paths before generating output asset diff --git a/crates/turbopack-browser/src/ecmascript/list/asset.rs b/crates/turbopack-browser/src/ecmascript/list/asset.rs index 88deb66bf9055..bc0cc39046feb 100644 --- a/crates/turbopack-browser/src/ecmascript/list/asset.rs +++ b/crates/turbopack-browser/src/ecmascript/list/asset.rs @@ -134,7 +134,7 @@ impl Asset for EcmascriptDevChunkList { } } -#[derive(Debug, Clone, Copy, Ord, PartialOrd, Hash)] +#[derive(Debug, Clone, Copy, Hash)] #[turbo_tasks::value(serialization = "auto_for_input")] #[serde(rename_all = "camelCase")] pub enum EcmascriptDevChunkListSource { diff --git a/crates/turbopack-core/src/chunk/availability_info.rs b/crates/turbopack-core/src/chunk/availability_info.rs index 52637cab666a0..2657b814502f5 100644 --- a/crates/turbopack-core/src/chunk/availability_info.rs +++ b/crates/turbopack-core/src/chunk/availability_info.rs @@ -4,7 +4,7 @@ use turbo_tasks::Vc; use super::available_chunk_items::{AvailableChunkItemInfoMap, AvailableChunkItems}; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Clone, Copy, Debug)] +#[derive(Hash, Clone, Copy, Debug)] pub enum AvailabilityInfo { /// Availability of modules is not tracked Untracked, diff --git a/crates/turbopack-core/src/chunk/mod.rs b/crates/turbopack-core/src/chunk/mod.rs index ffdffc6ce8d17..bfc69139cb57e 100644 --- a/crates/turbopack-core/src/chunk/mod.rs +++ b/crates/turbopack-core/src/chunk/mod.rs @@ -244,7 +244,7 @@ enum ChunkContentGraphNode { }, } -#[derive(Debug, Clone, Copy, TaskInput)] +#[derive(Debug, Clone, Copy, TaskInput, PartialEq, Eq, Hash, Serialize, Deserialize)] enum ChunkGraphNodeToReferences { PassthroughChunkItem(Vc>), ChunkItem(Vc>), diff --git a/crates/turbopack-core/src/compile_time_info.rs b/crates/turbopack-core/src/compile_time_info.rs index e33d4006b604b..fc4ef30178bc2 100644 --- a/crates/turbopack-core/src/compile_time_info.rs +++ b/crates/turbopack-core/src/compile_time_info.rs @@ -75,7 +75,7 @@ macro_rules! free_var_references { // TODO: replace with just a `serde_json::Value` // https://linear.app/vercel/issue/WEB-1641/compiletimedefinevalue-should-just-use-serde-jsonvalue #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Hash)] pub enum CompileTimeDefineValue { Bool(bool), String(RcStr), diff --git a/crates/turbopack-core/src/environment.rs b/crates/turbopack-core/src/environment.rs index f75350592bd1e..89f40160dab6f 100644 --- a/crates/turbopack-core/src/environment.rs +++ b/crates/turbopack-core/src/environment.rs @@ -53,7 +53,7 @@ impl Environment { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Debug, Hash, Clone, Copy)] +#[derive(Debug, Hash, Clone, Copy)] pub enum ExecutionEnvironment { NodeJsBuildTime(Vc), NodeJsLambda(Vc), diff --git a/crates/turbopack-core/src/ident.rs b/crates/turbopack-core/src/ident.rs index e63d4eb6c1c3c..a41515fe25eac 100644 --- a/crates/turbopack-core/src/ident.rs +++ b/crates/turbopack-core/src/ident.rs @@ -8,7 +8,7 @@ use turbo_tasks_hash::{encode_hex, hash_xxh3_hash64, DeterministicHash, Xxh3Hash use crate::resolve::ModulePart; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Clone, Debug, PartialOrd, Ord, Hash)] +#[derive(Clone, Debug, Hash)] pub struct AssetIdent { /// The primary path of the asset pub path: Vc, diff --git a/crates/turbopack-core/src/reference_type.rs b/crates/turbopack-core/src/reference_type.rs index 7db3416319b5c..13a795b6d02ac 100644 --- a/crates/turbopack-core/src/reference_type.rs +++ b/crates/turbopack-core/src/reference_type.rs @@ -27,20 +27,20 @@ impl InnerAssets { // behavior. #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum CommonJsReferenceSubType { Custom(u8), Undefined, } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum ImportWithType { Json, } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Default, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub enum EcmaScriptModulesReferenceSubType { ImportPart(Vc), Import, @@ -163,7 +163,7 @@ impl ImportContext { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum CssReferenceSubType { AtImport(Option>), Compose, @@ -178,7 +178,7 @@ pub enum CssReferenceSubType { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum UrlReferenceSubType { EcmaScriptNewUrl, CssUrl, @@ -187,7 +187,7 @@ pub enum UrlReferenceSubType { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum TypeScriptReferenceSubType { Custom(u8), Undefined, @@ -196,7 +196,7 @@ pub enum TypeScriptReferenceSubType { // TODO(sokra) this was next.js specific values. We want to solve this in a // different way. #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum EntryReferenceSubType { Web, Page, @@ -212,7 +212,7 @@ pub enum EntryReferenceSubType { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum ReferenceType { CommonJs(CommonJsReferenceSubType), EcmaScriptModules(EcmaScriptModulesReferenceSubType), diff --git a/crates/turbopack-core/src/resolve/mod.rs b/crates/turbopack-core/src/resolve/mod.rs index aa92072afed30..1e7061684d113 100644 --- a/crates/turbopack-core/src/resolve/mod.rs +++ b/crates/turbopack-core/src/resolve/mod.rs @@ -392,7 +392,9 @@ impl ModuleResolveResultOption { } } -#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs, TaskInput)] +#[derive( + Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, TraceRawVcs, TaskInput, +)] pub enum ExternalType { Url, CommonJs, @@ -425,7 +427,7 @@ pub enum ResolveResultItem { /// resolving. A primary factor is the actual request string, but there are /// other factors like exports conditions that can affect resolting and become /// part of the key (assuming the condition is unknown at compile time) -#[derive(Clone, Debug, Default, Hash, Ord, PartialOrd)] +#[derive(Clone, Debug, Default, Hash)] #[turbo_tasks::value(serialization = "auto_for_input")] pub struct RequestKey { pub request: Option, diff --git a/crates/turbopack-core/src/resolve/pattern.rs b/crates/turbopack-core/src/resolve/pattern.rs index 825a3c766ff2d..e2d84edb1908c 100644 --- a/crates/turbopack-core/src/resolve/pattern.rs +++ b/crates/turbopack-core/src/resolve/pattern.rs @@ -11,7 +11,7 @@ use turbo_tasks_fs::{ }; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Clone, Debug, Default)] +#[derive(Hash, Clone, Debug, Default)] pub enum Pattern { Constant(RcStr), #[default] @@ -764,12 +764,26 @@ impl ValueToString for Pattern { } } -#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord, TraceRawVcs, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, TraceRawVcs, Serialize, Deserialize)] pub enum PatternMatch { File(RcStr, Vc), Directory(RcStr, Vc), } +impl PatternMatch { + pub fn path(&self) -> Vc { + match *self { + PatternMatch::File(_, path) | PatternMatch::Directory(_, path) => path, + } + } + + pub fn name(&self) -> &str { + match self { + PatternMatch::File(name, _) | PatternMatch::Directory(name, _) => name.as_str(), + } + } +} + // TODO this isn't super efficient // avoid storing a large list of matches #[turbo_tasks::value(transparent)] @@ -1087,7 +1101,7 @@ pub async fn read_matches( for (pos, nested) in nested.into_iter() { results.extend(nested.await?.iter().cloned().map(|p| (pos, p))); } - results.sort(); + results.sort_by(|(a, am), (b, bm)| (*a).cmp(b).then_with(|| am.name().cmp(bm.name()))); Ok(Vc::cell( results.into_iter().map(|(_, p)| p).collect::>(), )) diff --git a/crates/turbopack-core/src/source_pos.rs b/crates/turbopack-core/src/source_pos.rs index 98f19f0e83bf6..d4686ba29782f 100644 --- a/crates/turbopack-core/src/source_pos.rs +++ b/crates/turbopack-core/src/source_pos.rs @@ -14,6 +14,7 @@ const U8_CR: u8 = 0x0D; Eq, Copy, Clone, + Hash, PartialOrd, Ord, TaskInput, diff --git a/crates/turbopack-core/src/target.rs b/crates/turbopack-core/src/target.rs index 2e51b5fb4a57d..e07862b515e78 100644 --- a/crates/turbopack-core/src/target.rs +++ b/crates/turbopack-core/src/target.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use turbo_tasks::{trace::TraceRawVcs, Vc}; #[turbo_tasks::value(shared, serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Debug, Copy, Clone)] +#[derive(Hash, Debug, Copy, Clone)] pub struct CompileTarget { /// pub arch: Arch, @@ -157,9 +157,7 @@ impl CompileTarget { } } -#[derive( - PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize)] #[repr(u8)] #[non_exhaustive] pub enum Arch { @@ -200,9 +198,7 @@ impl Display for Arch { } } -#[derive( - PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize)] #[repr(u8)] #[non_exhaustive] pub enum Platform { @@ -239,9 +235,7 @@ impl Display for Platform { } } -#[derive( - PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize)] #[repr(u8)] pub enum Endianness { Big, @@ -263,9 +257,7 @@ impl Display for Endianness { } } -#[derive( - PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize)] #[repr(u8)] pub enum Libc { Glibc, diff --git a/crates/turbopack-dev-server/src/source/headers.rs b/crates/turbopack-dev-server/src/source/headers.rs index e0adcedce601d..55699bf070fcf 100644 --- a/crates/turbopack-dev-server/src/source/headers.rs +++ b/crates/turbopack-dev-server/src/source/headers.rs @@ -10,9 +10,7 @@ pub struct Headers(BTreeMap); /// The value of an http header. HTTP headers might contain non-utf-8 bytes. An /// header might also occur multiple times. -#[derive( - Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, TraceRawVcs, Serialize, Deserialize)] #[serde(untagged)] pub enum HeaderValue { SingleString(String), @@ -21,21 +19,6 @@ pub enum HeaderValue { MultiBytes(Vec>), } -impl PartialOrd for Headers { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Headers { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.0 - .len() - .cmp(&other.0.len()) - .then_with(|| self.0.iter().cmp(other.0.iter())) - } -} - impl std::ops::Deref for Headers { type Target = BTreeMap; fn deref(&self) -> &Self::Target { diff --git a/crates/turbopack-dev-server/src/source/mod.rs b/crates/turbopack-dev-server/src/source/mod.rs index 26870a1f399c3..0518db659f071 100644 --- a/crates/turbopack-dev-server/src/source/mod.rs +++ b/crates/turbopack-dev-server/src/source/mod.rs @@ -177,7 +177,7 @@ impl HeaderList { /// `ContentSource::vary()`. So make sure to request all information that's /// needed. #[turbo_tasks::value(shared, serialization = "auto_for_input")] -#[derive(Clone, Debug, PartialOrd, Ord, Hash, Default)] +#[derive(Clone, Debug, Hash, Default)] pub struct ContentSourceData { /// HTTP method, if requested. pub method: Option, @@ -247,9 +247,7 @@ impl ValueDefault for Body { } /// Filter function that describes which information is required. -#[derive( - Debug, Clone, PartialEq, Eq, TraceRawVcs, Hash, PartialOrd, Ord, Serialize, Deserialize, -)] +#[derive(Debug, Clone, PartialEq, Eq, TraceRawVcs, Hash, Serialize, Deserialize)] pub enum ContentSourceDataFilter { All, Subset(BTreeSet), @@ -314,7 +312,7 @@ impl ContentSourceDataFilter { /// ContentSource. By sending these information ContentSource responses are /// cached-keyed by them and they can access them. #[turbo_tasks::value(shared, serialization = "auto_for_input")] -#[derive(Debug, Default, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub struct ContentSourceDataVary { pub method: bool, pub url: bool, diff --git a/crates/turbopack-dev-server/src/source/query.rs b/crates/turbopack-dev-server/src/source/query.rs index 61bcd2f1b25cc..372985ae7619b 100644 --- a/crates/turbopack-dev-server/src/source/query.rs +++ b/crates/turbopack-dev-server/src/source/query.rs @@ -21,21 +21,6 @@ impl Query { } } -impl PartialOrd for Query { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Query { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.0 - .len() - .cmp(&other.0.len()) - .then_with(|| self.0.iter().cmp(other.0.iter())) - } -} - impl std::ops::Deref for Query { type Target = BTreeMap; fn deref(&self) -> &Self::Target { @@ -49,9 +34,7 @@ impl DerefMut for Query { } } -#[derive( - Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, TraceRawVcs, Serialize, Deserialize, -)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, TraceRawVcs, Serialize, Deserialize)] #[serde(untagged)] pub enum QueryValue { /// Simple string value, might be an empty string when there is no value diff --git a/crates/turbopack-dev-server/src/source/route_tree.rs b/crates/turbopack-dev-server/src/source/route_tree.rs index 58f2c188a1f4d..2e29ee5df2117 100644 --- a/crates/turbopack-dev-server/src/source/route_tree.rs +++ b/crates/turbopack-dev-server/src/source/route_tree.rs @@ -9,7 +9,7 @@ use super::{GetContentSourceContent, GetContentSourceContents}; /// The type of the route. THis will decide about the remaining segements of the /// route after the base. -#[derive(TaskInput, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)] +#[derive(TaskInput, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TraceRawVcs)] pub enum RouteType { Exact, CatchAll, @@ -18,7 +18,7 @@ pub enum RouteType { } /// Some normal segment of a route. -#[derive(TaskInput, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)] +#[derive(TaskInput, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TraceRawVcs)] pub enum BaseSegment { Static(RcStr), Dynamic, diff --git a/crates/turbopack-ecmascript-hmr-protocol/src/lib.rs b/crates/turbopack-ecmascript-hmr-protocol/src/lib.rs index 721cee9b7dfe3..51eba9ddbf535 100644 --- a/crates/turbopack-ecmascript-hmr-protocol/src/lib.rs +++ b/crates/turbopack-ecmascript-hmr-protocol/src/lib.rs @@ -8,7 +8,7 @@ use turbopack_core::{ source_pos::SourcePos, }; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct ResourceIdentifier { pub path: String, pub headers: Option>, diff --git a/crates/turbopack-ecmascript-runtime/src/runtime_type.rs b/crates/turbopack-ecmascript-runtime/src/runtime_type.rs index 41978bc0051b5..b44bcb69aa4c7 100644 --- a/crates/turbopack-ecmascript-runtime/src/runtime_type.rs +++ b/crates/turbopack-ecmascript-runtime/src/runtime_type.rs @@ -1,9 +1,7 @@ use serde::{Deserialize, Serialize}; use turbo_tasks::trace::TraceRawVcs; -#[derive( - Serialize, Deserialize, Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, TraceRawVcs, -)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, Hash, PartialEq, Eq, TraceRawVcs)] pub enum RuntimeType { Development, Production, diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index ba874d0c3ca44..e9d797cc62349 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -17,7 +17,7 @@ use super::{top_level_await::has_top_level_await, JsValue, ModuleValue}; use crate::tree_shake::{find_turbopack_part_id_in_asserts, PartId}; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Default, Debug, Clone, Hash, PartialOrd, Ord)] +#[derive(Default, Debug, Clone, Hash)] pub struct ImportAnnotations { // TODO store this in more structured way #[turbo_tasks(trace_ignore)] @@ -135,7 +135,7 @@ pub(crate) struct ImportMap { has_top_level_await: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), @@ -143,7 +143,7 @@ pub(crate) enum ImportedSymbol { Part(u32), } -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) struct ImportMapReference { pub module_path: JsWord, pub imported_symbol: ImportedSymbol, diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index aeb15d0b583a2..1f296bca859cc 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -91,7 +91,7 @@ use crate::{ }; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Debug, Clone, Copy, Default, TaskInput)] +#[derive(Hash, Debug, Clone, Copy, Default, TaskInput)] pub enum SpecifiedModuleType { #[default] Automatic, @@ -124,7 +124,7 @@ pub enum TreeShakingMode { pub struct OptionTreeShaking(pub Option); #[turbo_tasks::value(shared, serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Debug, Default, Copy, Clone)] +#[derive(Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { pub refresh: bool, /// variant of tree shaking to use @@ -150,7 +150,7 @@ pub struct EcmascriptOptions { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(PartialOrd, Ord, Hash, Debug, Copy, Clone)] +#[derive(Hash, Debug, Copy, Clone)] pub enum EcmascriptModuleAssetType { /// Module with EcmaScript code Ecmascript, diff --git a/crates/turbopack-ecmascript/src/references/constant_condition.rs b/crates/turbopack-ecmascript/src/references/constant_condition.rs index 17e51238d5494..8f5f64e5b204d 100644 --- a/crates/turbopack-ecmascript/src/references/constant_condition.rs +++ b/crates/turbopack-ecmascript/src/references/constant_condition.rs @@ -10,7 +10,7 @@ use crate::{ }; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Copy, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Copy, Hash)] pub enum ConstantConditionValue { Truthy, Falsy, diff --git a/crates/turbopack-ecmascript/src/references/esm/url.rs b/crates/turbopack-ecmascript/src/references/esm/url.rs index 6a2bfe89c9589..89bf7cf20dc74 100644 --- a/crates/turbopack-ecmascript/src/references/esm/url.rs +++ b/crates/turbopack-ecmascript/src/references/esm/url.rs @@ -31,7 +31,7 @@ use crate::{ /// This allows to construct url depends on the different building context, /// e.g. SSR, CSR, or Node.js. #[turbo_tasks::value(shared)] -#[derive(Debug, Copy, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Copy, Clone, Hash)] pub enum UrlRewriteBehavior { /// Omits base, resulting in a relative URL. Relative, diff --git a/crates/turbopack-ecmascript/src/references/external_module.rs b/crates/turbopack-ecmascript/src/references/external_module.rs index 209145d5aa7c2..5108f6b37bf27 100644 --- a/crates/turbopack-ecmascript/src/references/external_module.rs +++ b/crates/turbopack-ecmascript/src/references/external_module.rs @@ -27,7 +27,9 @@ fn layer() -> Vc { Vc::cell("external".into()) } -#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs, TaskInput)] +#[derive( + Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs, TaskInput, Hash, +)] pub enum CachedExternalType { CommonJs, EcmaScriptViaRequire, diff --git a/crates/turbopack-ecmascript/src/references/pattern_mapping.rs b/crates/turbopack-ecmascript/src/references/pattern_mapping.rs index 66fed95a03732..c0c87b707f51d 100644 --- a/crates/turbopack-ecmascript/src/references/pattern_mapping.rs +++ b/crates/turbopack-ecmascript/src/references/pattern_mapping.rs @@ -73,7 +73,7 @@ pub(crate) enum PatternMapping { Map(IndexMap), } -#[derive(PartialOrd, Ord, Hash, Debug, Copy, Clone)] +#[derive(Hash, Debug, Copy, Clone)] #[turbo_tasks::value(serialization = "auto_for_input")] pub(crate) enum ResolveType { AsyncChunkLoader, diff --git a/crates/turbopack-ecmascript/src/transform/mod.rs b/crates/turbopack-ecmascript/src/transform/mod.rs index 121ee1bfc4bfe..6bc59e13b12e4 100644 --- a/crates/turbopack-ecmascript/src/transform/mod.rs +++ b/crates/turbopack-ecmascript/src/transform/mod.rs @@ -26,7 +26,7 @@ use turbopack_core::{ }; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub enum EcmascriptInputTransform { CommonJs, Plugin(Vc), @@ -100,7 +100,7 @@ impl CustomTransformer for TransformPlugin { } #[turbo_tasks::value(transparent, serialization = "auto_for_input")] -#[derive(Debug, Clone, PartialOrd, Ord, Hash)] +#[derive(Debug, Clone, Hash)] pub struct EcmascriptInputTransforms(Vec); #[turbo_tasks::value_impl] diff --git a/crates/turbopack-mdx/src/lib.rs b/crates/turbopack-mdx/src/lib.rs index bfc86eb6b6735..a02b29837926c 100644 --- a/crates/turbopack-mdx/src/lib.rs +++ b/crates/turbopack-mdx/src/lib.rs @@ -32,7 +32,7 @@ fn modifier() -> Vc { } #[turbo_tasks::value(shared)] -#[derive(PartialOrd, Ord, Hash, Debug, Clone)] +#[derive(Hash, Debug, Clone)] #[serde(rename_all = "camelCase")] pub enum MdxParseConstructs { Commonmark, @@ -43,7 +43,7 @@ pub enum MdxParseConstructs { /// into mdxjs. This is thin, near straightforward subset of mdxjs::Options to /// enable turbo tasks. #[turbo_tasks::value(shared)] -#[derive(PartialOrd, Ord, Hash, Debug, Clone)] +#[derive(Hash, Debug, Clone)] #[serde(rename_all = "camelCase", default)] pub struct MdxTransformOptions { pub development: Option, diff --git a/crates/turbopack-node/src/evaluate.rs b/crates/turbopack-node/src/evaluate.rs index 49fc68c41ce56..505755b12c711 100644 --- a/crates/turbopack-node/src/evaluate.rs +++ b/crates/turbopack-node/src/evaluate.rs @@ -456,7 +456,7 @@ async fn basic_compute( compute(evaluate_context, sender).await } -#[derive(Clone, PartialEq, Eq, TaskInput)] +#[derive(Clone, PartialEq, Eq, Hash, TaskInput, Debug, Serialize, Deserialize)] struct BasicEvaluateContext { module_asset: Vc>, cwd: Vc, diff --git a/crates/turbopack-node/src/render/render_proxy.rs b/crates/turbopack-node/src/render/render_proxy.rs index 0d76394aa8b1a..7e69575aff122 100644 --- a/crates/turbopack-node/src/render/render_proxy.rs +++ b/crates/turbopack-node/src/render/render_proxy.rs @@ -5,8 +5,10 @@ use futures::{ pin_mut, SinkExt, StreamExt, TryStreamExt, }; use parking_lot::Mutex; +use serde::{Deserialize, Serialize}; use turbo_tasks::{ - duration_span, mark_finished, prevent_gc, util::SharedError, RawVc, RcStr, ValueToString, Vc, + duration_span, mark_finished, prevent_gc, util::SharedError, RawVc, RcStr, TaskInput, + ValueToString, Vc, }; use turbo_tasks_bytes::{Bytes, Stream}; use turbo_tasks_env::ProcessEnv; @@ -44,7 +46,7 @@ pub async fn render_proxy( body: Vc, debug: bool, ) -> Result> { - let render = render_stream( + let render = render_stream(RenderStreamOptions { cwd, env, path, @@ -57,7 +59,7 @@ pub async fn render_proxy( data, body, debug, - ) + }) .await?; let mut stream = render.read(); @@ -146,8 +148,8 @@ struct RenderStreamSender { #[turbo_tasks::value(transparent)] struct RenderStream(#[turbo_tasks(trace_ignore)] Stream); -#[turbo_tasks::function] -fn render_stream( +#[derive(Clone, Debug, TaskInput, PartialEq, Eq, Hash, Serialize, Deserialize)] +struct RenderStreamOptions { cwd: Vc, env: Vc>, path: Vc, @@ -160,7 +162,10 @@ fn render_stream( data: Vc, body: Vc, debug: bool, -) -> Vc { +} + +#[turbo_tasks::function] +fn render_stream(options: RenderStreamOptions) -> Vc { // TODO: The way we invoke render_stream_internal as side effect is not // GC-safe, so we disable GC for this task. prevent_gc(); @@ -180,17 +185,7 @@ fn render_stream( // run the evaluation as side effect let _ = render_stream_internal( - cwd, - env, - path, - module, - runtime_entries, - chunking_context, - intermediate_output_path, - output_root, - project_dir, - data, - body, + options, RenderStreamSender { get: Box::new(move || { if let Some(sender) = initial.lock().take() { @@ -205,7 +200,6 @@ fn render_stream( }), } .cell(), - debug, ); let raw: RawVc = cell.into(); @@ -214,20 +208,24 @@ fn render_stream( #[turbo_tasks::function] async fn render_stream_internal( - cwd: Vc, - env: Vc>, - path: Vc, - module: Vc>, - runtime_entries: Vc, - chunking_context: Vc>, - intermediate_output_path: Vc, - output_root: Vc, - project_dir: Vc, - data: Vc, - body: Vc, + options: RenderStreamOptions, sender: Vc, - debug: bool, ) -> Result> { + let RenderStreamOptions { + cwd, + env, + path, + module, + runtime_entries, + chunking_context, + intermediate_output_path, + output_root, + project_dir, + data, + body, + debug, + } = options; + mark_finished(); let Ok(sender) = sender.await else { // Impossible to handle the error in a good way. diff --git a/crates/turbopack-node/src/render/render_static.rs b/crates/turbopack-node/src/render/render_static.rs index bcc65bc688cf0..05e3a161f6379 100644 --- a/crates/turbopack-node/src/render/render_static.rs +++ b/crates/turbopack-node/src/render/render_static.rs @@ -5,8 +5,10 @@ use futures::{ pin_mut, SinkExt, StreamExt, TryStreamExt, }; use parking_lot::Mutex; +use serde::{Deserialize, Serialize}; use turbo_tasks::{ - duration_span, mark_finished, prevent_gc, util::SharedError, RawVc, ValueToString, Vc, + duration_span, mark_finished, prevent_gc, util::SharedError, RawVc, TaskInput, ValueToString, + Vc, }; use turbo_tasks_bytes::{Bytes, Stream}; use turbo_tasks_env::ProcessEnv; @@ -85,7 +87,7 @@ pub async fn render_static( data: Vc, debug: bool, ) -> Result> { - let render = render_stream( + let render = render_stream(RenderStreamOptions { cwd, env, path, @@ -98,7 +100,7 @@ pub async fn render_static( project_dir, data, debug, - ) + }) .await?; let mut stream = render.read(); @@ -197,8 +199,8 @@ struct RenderStreamSender { #[turbo_tasks::value(transparent)] struct RenderStream(#[turbo_tasks(trace_ignore)] Stream); -#[turbo_tasks::function] -fn render_stream( +#[derive(Clone, Debug, TaskInput, PartialEq, Eq, Hash, Deserialize, Serialize)] +struct RenderStreamOptions { cwd: Vc, env: Vc>, path: Vc, @@ -211,7 +213,10 @@ fn render_stream( project_dir: Vc, data: Vc, debug: bool, -) -> Vc { +} + +#[turbo_tasks::function] +fn render_stream(options: RenderStreamOptions) -> Vc { // TODO: The way we invoke render_stream_internal as side effect is not // GC-safe, so we disable GC for this task. prevent_gc(); @@ -231,17 +236,7 @@ fn render_stream( // run the evaluation as side effect let _ = render_stream_internal( - cwd, - env, - path, - module, - runtime_entries, - fallback_page, - chunking_context, - intermediate_output_path, - output_root, - project_dir, - data, + options, RenderStreamSender { get: Box::new(move || { if let Some(sender) = initial.lock().take() { @@ -256,7 +251,6 @@ fn render_stream( }), } .cell(), - debug, ); let raw: RawVc = cell.into(); @@ -265,20 +259,24 @@ fn render_stream( #[turbo_tasks::function] async fn render_stream_internal( - cwd: Vc, - env: Vc>, - path: Vc, - module: Vc>, - runtime_entries: Vc, - fallback_page: Vc, - chunking_context: Vc>, - intermediate_output_path: Vc, - output_root: Vc, - project_dir: Vc, - data: Vc, + options: RenderStreamOptions, sender: Vc, - debug: bool, ) -> Result> { + let RenderStreamOptions { + cwd, + env, + path, + module, + runtime_entries, + fallback_page, + chunking_context, + intermediate_output_path, + output_root, + project_dir, + data, + debug, + } = options; + mark_finished(); let Ok(sender) = sender.await else { // Impossible to handle the error in a good way. diff --git a/crates/turbopack-node/src/transforms/postcss.rs b/crates/turbopack-node/src/transforms/postcss.rs index 1b1e1dc2332e4..76497668ffdcc 100644 --- a/crates/turbopack-node/src/transforms/postcss.rs +++ b/crates/turbopack-node/src/transforms/postcss.rs @@ -45,7 +45,7 @@ struct PostCssProcessingResult { } #[derive( - Default, Copy, Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, TaskInput, + Default, Copy, Clone, PartialEq, Eq, Hash, Debug, TraceRawVcs, Serialize, Deserialize, TaskInput, )] pub enum PostCssConfigLocation { #[default] diff --git a/crates/turbopack-node/src/transforms/webpack.rs b/crates/turbopack-node/src/transforms/webpack.rs index e34988866ef09..a218d3f21a699 100644 --- a/crates/turbopack-node/src/transforms/webpack.rs +++ b/crates/turbopack-node/src/transforms/webpack.rs @@ -325,7 +325,7 @@ pub enum InfoMessage { Log(LogInfo), } -#[derive(Deserialize, Debug, Clone, TaskInput)] +#[derive(Debug, Clone, TaskInput, Hash, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct WebpackResolveOptions { @@ -357,7 +357,7 @@ pub enum ResponseMessage { Resolve { path: RcStr }, } -#[derive(Clone, PartialEq, Eq, TaskInput)] +#[derive(Clone, PartialEq, Eq, Hash, TaskInput, Serialize, Deserialize, Debug)] pub struct WebpackLoaderContext { pub module_asset: Vc>, pub cwd: Vc, diff --git a/crates/turbopack-nodejs/src/chunking_context.rs b/crates/turbopack-nodejs/src/chunking_context.rs index f55b6e6e55250..169623d9955ec 100644 --- a/crates/turbopack-nodejs/src/chunking_context.rs +++ b/crates/turbopack-nodejs/src/chunking_context.rs @@ -61,7 +61,7 @@ impl NodeJsChunkingContextBuilder { /// A chunking context for build mode. #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Hash)] pub struct NodeJsChunkingContext { /// This path get stripped off of chunk paths before generating output asset /// paths. diff --git a/crates/turbopack/src/module_options/module_rule.rs b/crates/turbopack/src/module_options/module_rule.rs index 6996a4350606a..710be28eaacad 100644 --- a/crates/turbopack/src/module_options/module_rule.rs +++ b/crates/turbopack/src/module_options/module_rule.rs @@ -96,7 +96,7 @@ pub enum ModuleRuleEffect { } #[turbo_tasks::value(serialization = "auto_for_input", shared)] -#[derive(PartialOrd, Ord, Hash, Debug, Copy, Clone)] +#[derive(Hash, Debug, Copy, Clone)] pub enum ModuleType { Ecmascript { transforms: Vc, From 2ad0240c4693c123dcb05487d4dd0b6e625d4aab Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 18 Jul 2024 08:20:16 +0200 Subject: [PATCH 24/73] Revert "feat: Enable tree shaking in next.js" (#8782) Reverts vercel/turbo#8755 --- .gitattributes | 1 - .../turbopack-ecmascript/benches/analyzer.rs | 2 +- .../src/analyzer/graph.rs | 3 +- .../src/analyzer/imports.rs | 20 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 3 +- crates/turbopack-ecmascript/src/lib.rs | 8 - crates/turbopack-ecmascript/src/minify.rs | 7 +- crates/turbopack-ecmascript/src/parse.rs | 1 + .../src/references/esm/base.rs | 3 - .../src/references/mod.rs | 9 +- .../src/tree_shake/asset.rs | 2 +- .../src/tree_shake/cjs_finder.rs | 11 + .../src/tree_shake/graph.rs | 194 +-- .../src/tree_shake/mod.rs | 130 +- .../src/tree_shake/util.rs | 304 +--- .../tests/tree-shaker/analyzer/1/output.md | 58 - .../tests/tree-shaker/analyzer/2/output.md | 58 - .../tests/tree-shaker/analyzer/3/output.md | 38 - .../analyzer/amphtml-document/input.js | 34 - .../analyzer/amphtml-document/output.md | 596 ------- .../tree-shaker/analyzer/app-route/output.md | 61 +- .../analyzer/combined-export/output.md | 22 - .../tree-shaker/analyzer/complex/output.md | 55 +- .../analyzer/export-named/output.md | 20 +- .../tree-shaker/analyzer/failed-1/output.md | 28 - .../tree-shaker/analyzer/failed-2/output.md | 104 +- .../tree-shaker/analyzer/failed-3/output.md | 204 +-- .../tree-shaker/analyzer/grouping/output.md | 22 - .../analyzer/ipc-evaluate/output.md | 100 +- .../tree-shaker/analyzer/ipc-index/output.md | 204 +-- .../tree-shaker/analyzer/let-bug-1/input.js | 44 - .../tree-shaker/analyzer/let-bug-1/output.md | 465 ----- .../tree-shaker/analyzer/logger/input.js | 44 - .../tree-shaker/analyzer/logger/output.md | 465 ----- .../analyzer/multi-export/output.md | 26 +- .../tree-shaker/analyzer/nanoid/input.js | 44 - .../tree-shaker/analyzer/nanoid/output.md | 960 ----------- .../analyzer/next-response/input.js | 122 -- .../analyzer/next-response/output.md | 1161 ------------- .../analyzer/nextjs-tracer/input.js | 214 --- .../analyzer/nextjs-tracer/output.md | 1516 ----------------- .../tree-shaker/analyzer/node-fetch/input.js | 9 - .../tree-shaker/analyzer/node-fetch/output.md | 278 --- .../analyzer/node-globals/output.md | 10 - .../tree-shaker/analyzer/otel-core/input.js | 27 - .../tree-shaker/analyzer/otel-core/output.md | 355 ---- .../analyzer/route-handler/input.js | 9 - .../analyzer/route-handler/output.md | 252 --- .../tree-shaker/analyzer/route-kind/output.md | 16 - .../tree-shaker/analyzer/shared-2/output.md | 100 +- .../shared-and-side-effects/output.md | 150 +- .../analyzer/shared-regression/output.md | 100 +- .../analyzer/simple-vars-1/output.md | 22 - .../tree-shaker/analyzer/simple/output.md | 22 - .../analyzer/template-pages/output.md | 571 ++----- .../analyzer/test-config-1/output.md | 66 - .../tree-shaker/analyzer/tla-1/output.md | 34 +- .../tree-shaker/analyzer/typeof-1/input.js | 10 - .../tree-shaker/analyzer/typeof-1/output.md | 298 ---- .../analyzer/write-order/output.md | 37 - ...e-shake_dynamic-import_input_lib_05eac0.js | 4 +- ...ake_dynamic-import_input_lib_05eac0.js.map | 16 +- ...-shake_export-namespace_input_b4b68a._.js} | 30 +- ...ke_export-namespace_input_b4b68a._.js.map} | 26 +- ...-shake_import-namespace_input_ee0515._.js} | 30 +- ...ke_import-namespace_input_ee0515._.js.map} | 22 +- ...hake_require-side-effect_input_fa7732._.js | 4 +- ..._require-side-effect_input_fa7732._.js.map | 20 +- ...ke_tree-shake-test-1_input_index_2951af.js | 4 +- ...ree-shake-test-1_input_index_2951af.js.map | 16 +- crates/turbopack-wasm/src/module_asset.rs | 36 +- crates/turbopack/src/module_options/mod.rs | 2 - .../module_options/module_options_context.rs | 1 - 73 files changed, 591 insertions(+), 9349 deletions(-) create mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js delete mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js} (91%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map} (89%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js} (90%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map} (89%) diff --git a/.gitattributes b/.gitattributes index 860411fb2b3c6..650dc002a59d5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ .config/ast-grep/rule-tests/__snapshots__/** linguist-generated=true crates/turbo-tasks-macros-tests/tests/**/*.stderr linguist-generated=true -crates/turbopack-ecmascript/tests/tree-shaker/analyzer/**/output.md linguist-generated=true crates/turbopack-tests/tests/snapshot/**/output/** linguist-generated=true crates/turborepo-lockfiles/fixtures/*.lock text eol=lf diff --git a/crates/turbopack-ecmascript/benches/analyzer.rs b/crates/turbopack-ecmascript/benches/analyzer.rs index 0a94684f5ed9b..4b70575de1e98 100644 --- a/crates/turbopack-ecmascript/benches/analyzer.rs +++ b/crates/turbopack-ecmascript/benches/analyzer.rs @@ -56,7 +56,7 @@ pub fn benchmark(c: &mut Criterion) { program.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); let eval_context = - EvalContext::new(&program, unresolved_mark, top_level_mark, None); + EvalContext::new(&program, unresolved_mark, top_level_mark, false, None); let var_graph = create_graph(&program, &eval_context); let input = BenchInput { diff --git a/crates/turbopack-ecmascript/src/analyzer/graph.rs b/crates/turbopack-ecmascript/src/analyzer/graph.rs index 8105ae870289f..05dd2f59e6646 100644 --- a/crates/turbopack-ecmascript/src/analyzer/graph.rs +++ b/crates/turbopack-ecmascript/src/analyzer/graph.rs @@ -270,12 +270,13 @@ impl EvalContext { module: &Program, unresolved_mark: Mark, top_level_mark: Mark, + skip_namespace: bool, source: Option>>, ) -> Self { Self { unresolved_mark, top_level_mark, - imports: ImportMap::analyze(module, source), + imports: ImportMap::analyze(module, skip_namespace, source), } } diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index e9d797cc62349..b224d3ea74f51 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -139,6 +139,8 @@ pub(crate) struct ImportMap { pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), + /// User requested the whole module + Namespace, Exports, Part(u32), } @@ -200,11 +202,16 @@ impl ImportMap { } /// Analyze ES import - pub(super) fn analyze(m: &Program, source: Option>>) -> Self { + pub(super) fn analyze( + m: &Program, + skip_namespace: bool, + source: Option>>, + ) -> Self { let mut data = ImportMap::default(); m.visit_with(&mut Analyzer { data: &mut data, + skip_namespace, source, }); @@ -214,6 +221,7 @@ impl ImportMap { struct Analyzer<'a> { data: &'a mut ImportMap, + skip_namespace: bool, source: Option>>, } @@ -225,6 +233,10 @@ impl<'a> Analyzer<'a> { imported_symbol: ImportedSymbol, annotations: ImportAnnotations, ) -> Option { + if self.skip_namespace && matches!(imported_symbol, ImportedSymbol::Namespace) { + return None; + } + let issue_source = self .source .map(|s| IssueSource::from_swc_offsets(s, span.lo.to_usize(), span.hi.to_usize())); @@ -327,7 +339,7 @@ impl Visit for Analyzer<'_> { let i = self.ensure_reference( export.span, export.src.value.clone(), - symbol.unwrap_or(ImportedSymbol::Exports), + symbol.unwrap_or(ImportedSymbol::Namespace), annotations, ); if let Some(i) = i { @@ -443,7 +455,7 @@ fn get_import_symbol_from_import(specifier: &ImportSpecifier) -> ImportedSymbol _ => local.sym.clone(), }), ImportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ImportSpecifier::Namespace(..) => ImportedSymbol::Exports, + ImportSpecifier::Namespace(..) => ImportedSymbol::Namespace, } } @@ -453,6 +465,6 @@ fn get_import_symbol_from_export(specifier: &ExportSpecifier) -> ImportedSymbol ImportedSymbol::Symbol(orig_name(orig)) } ExportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ExportSpecifier::Namespace(..) => ImportedSymbol::Exports, + ExportSpecifier::Namespace(..) => ImportedSymbol::Namespace, } } diff --git a/crates/turbopack-ecmascript/src/analyzer/mod.rs b/crates/turbopack-ecmascript/src/analyzer/mod.rs index d397d1873a2c3..54f229549a26b 100644 --- a/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -3588,7 +3588,8 @@ mod tests { let top_level_mark = Mark::new(); m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); - let eval_context = EvalContext::new(&m, unresolved_mark, top_level_mark, None); + let eval_context = + EvalContext::new(&m, unresolved_mark, top_level_mark, false, None); let mut var_graph = create_graph(&m, &eval_context); diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index 1f296bca859cc..d198702e7020e 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -120,9 +120,6 @@ pub enum TreeShakingMode { ReexportsOnly, } -#[turbo_tasks::value(transparent)] -pub struct OptionTreeShaking(pub Option); - #[turbo_tasks::value(shared, serialization = "auto_for_input")] #[derive(Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { @@ -142,11 +139,6 @@ pub struct EcmascriptOptions { /// If false, they will reference the whole directory. If true, they won't /// reference anything and lead to an runtime error instead. pub ignore_dynamic_requests: bool, - - /// The list of export names that should make tree shaking bail off. This is - /// required because tree shaking can split imports like `export const - /// runtime = 'edge'` as a separate module. - pub special_exports: Vc>, } #[turbo_tasks::value(serialization = "auto_for_input")] diff --git a/crates/turbopack-ecmascript/src/minify.rs b/crates/turbopack-ecmascript/src/minify.rs index f94859d23d8c3..f02a3517a30b0 100644 --- a/crates/turbopack-ecmascript/src/minify.rs +++ b/crates/turbopack-ecmascript/src/minify.rs @@ -54,12 +54,9 @@ pub async fn minify(path: Vc, code: Vc) -> Result GLOBALS.set(&Default::default(), || { let program = match parser.parse_program() { Ok(program) => program, - Err(err) => { + Err(_error) => { // TODO should emit an issue - bail!( - "failed to parse source code\n{err:?}\n{}", - code.source_code().to_str()? - ) + bail!("failed to parse source code") } }; let comments = SingleThreadedComments::default(); diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index f9a61d0d19643..7fae1353e5cbd 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -432,6 +432,7 @@ async fn parse_content( &parsed_program, unresolved_mark, top_level_mark, + false, Some(source), ); diff --git a/crates/turbopack-ecmascript/src/references/esm/base.rs b/crates/turbopack-ecmascript/src/references/esm/base.rs index 8852d61a52442..5286850437a42 100644 --- a/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -96,7 +96,6 @@ pub struct EsmAssetReference { pub issue_source: Option>, pub export_name: Option>, pub import_externals: bool, - pub special_exports: Vc>, } /// A list of [EsmAssetReference]s @@ -122,7 +121,6 @@ impl EsmAssetReference { issue_source: Option>, annotations: Value, export_name: Option>, - special_exports: Vc>, import_externals: bool, ) -> Vc { Self::cell(EsmAssetReference { @@ -132,7 +130,6 @@ impl EsmAssetReference { annotations: annotations.into_value(), export_name, import_externals, - special_exports, }) } diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index 379b4e5262368..e284992e9ad58 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -353,7 +353,6 @@ struct AnalysisState<'a> { // the object allocation. first_import_meta: bool, tree_shaking_mode: Option, - special_exports: Vc>, import_externals: bool, ignore_dynamic_requests: bool, } @@ -413,7 +412,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( let options = raw_module.options; let compile_time_info = raw_module.compile_time_info; let options = options.await?; - let special_exports = options.special_exports; let import_externals = options.import_externals; let origin = Vc::upcast::>(module); @@ -430,7 +428,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let parsed = if let Some(part) = part { let parsed = parse(source, ty, transforms); - let split_data = split(source.ident(), source, parsed, special_exports); + let split_data = split(source.ident(), source, parsed); part_of_module(split_data, part) } else { parse(source, ty, transforms) @@ -578,6 +576,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => Some(ModulePart::exports()), + ImportedSymbol::Namespace => None, }, Some(TreeShakingMode::ReexportsOnly) => match &r.imported_symbol { ImportedSymbol::ModuleEvaluation => { @@ -587,10 +586,10 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => None, + ImportedSymbol::Namespace => None, }, None => None, }, - special_exports, import_externals, ); @@ -815,7 +814,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( first_import_meta: true, tree_shaking_mode: options.tree_shaking_mode, import_externals: options.import_externals, - special_exports: options.special_exports, ignore_dynamic_requests: options.ignore_dynamic_requests, }; @@ -1974,7 +1972,6 @@ async fn handle_free_var_reference( .map(|export| ModulePart::export(export.clone())), None => None, }, - state.special_exports, state.import_externals, ) .resolve() diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index f27d4320f048d..c7b4b7c2d7168 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -23,7 +23,7 @@ use crate::{ /// This type is used for an advanced tree shkaing. #[turbo_tasks::value] pub struct EcmascriptModulePartAsset { - pub full_module: Vc, + pub(crate) full_module: Vc, pub(crate) part: Vc, pub(crate) import_externals: bool, } diff --git a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs new file mode 100644 index 0000000000000..9cf44e8983818 --- /dev/null +++ b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs @@ -0,0 +1,11 @@ +use swc_core::ecma::ast::*; + +pub fn contains_cjs(m: &Program) -> bool { + if let Program::Module(m) = m { + if m.body.iter().any(|s| s.is_module_decl()) { + return false; + } + } + + true +} diff --git a/crates/turbopack-ecmascript/src/tree_shake/graph.rs b/crates/turbopack-ecmascript/src/tree_shake/graph.rs index 20ef975394ed6..9531033047db0 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/graph.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/graph.rs @@ -13,11 +13,11 @@ use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ - op, ClassDecl, Decl, DefaultDecl, ExportAll, ExportDecl, ExportNamedSpecifier, - ExportSpecifier, Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, - ImportSpecifier, ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, - ModuleExportName, ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, - Stmt, VarDecl, VarDeclKind, VarDeclarator, + op, ClassDecl, Decl, DefaultDecl, ExportDecl, ExportNamedSpecifier, ExportSpecifier, + Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, ImportSpecifier, + ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleExportName, + ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, Stmt, VarDecl, + VarDeclKind, VarDeclarator, }, atoms::JsWord, utils::{find_pat_ids, private_ident, quote_ident}, @@ -26,9 +26,7 @@ use swc_core::{ use turbo_tasks::RcStr; use super::{ - util::{ - collect_top_level_decls, ids_captured_by, ids_used_by, ids_used_by_ignoring_nested, Vars, - }, + util::{ids_captured_by, ids_used_by, ids_used_by_ignoring_nested}, Key, TURBOPACK_PART_IMPORT_SOURCE, }; use crate::magic_identifier; @@ -193,8 +191,6 @@ pub(super) struct SplitModuleResult { /// Dependency between parts. pub part_deps: FxHashMap>, pub modules: Vec, - - pub star_reexports: Vec, } impl DepGraph { @@ -230,13 +226,7 @@ impl DepGraph { let mut exports = FxHashMap::default(); let mut part_deps = FxHashMap::<_, Vec<_>>::default(); - let star_reexports: Vec<_> = data - .values() - .filter_map(|v| v.content.as_module_decl()?.as_export_all()) - .cloned() - .collect(); let mut modules = vec![]; - let mut exports_module = Module::dummy(); if groups.graph_ix.is_empty() { // If there's no dependency, all nodes are in the module evaluaiotn group. @@ -283,24 +273,6 @@ impl DepGraph { if let Some(export) = &data[item].export { exports.insert(Key::Export(export.as_str().into()), ix as u32); - - let s = ExportSpecifier::Named(ExportNamedSpecifier { - span: DUMMY_SP, - orig: ModuleExportName::Ident(Ident::new(export.clone(), DUMMY_SP)), - exported: None, - is_type_only: false, - }); - exports_module.body.push(ModuleItem::ModuleDecl( - ModuleDecl::ExportNamed(NamedExport { - span: DUMMY_SP, - specifiers: vec![s], - src: Some(Box::new(TURBOPACK_PART_IMPORT_SOURCE.into())), - type_only: false, - with: Some(Box::new(create_turbopack_part_id_assert( - PartId::Export(export.to_string().into()), - ))), - }), - )); } } ItemId::Group(ItemIdGroupKind::ModuleEvaluation) => { @@ -323,7 +295,7 @@ impl DepGraph { let data = data.get(dep_item).unwrap(); for var in data.var_decls.iter() { - if required_vars.contains(var) { + if required_vars.remove(var) { specifiers.push(ImportSpecifier::Named(ImportNamedSpecifier { span: DUMMY_SP, local: var.clone().into(), @@ -394,21 +366,10 @@ impl DepGraph { modules.push(chunk); } - exports.insert(Key::Exports, modules.len() as u32); - - for star in &star_reexports { - exports_module - .body - .push(ModuleItem::ModuleDecl(ModuleDecl::ExportAll(star.clone()))); - } - - modules.push(exports_module); - SplitModuleResult { entrypoints: exports, part_deps, modules, - star_reexports, } } @@ -468,7 +429,7 @@ impl DepGraph { let ix = self.g.get_node(id); if let ItemId::Group(_) = id { - groups.push((vec![id.clone()], FxHashSet::default(), 1)); + groups.push((vec![id.clone()], FxHashSet::default())); global_done.insert(ix); } } @@ -486,8 +447,7 @@ impl DepGraph { global_done.extend(cycle.iter().copied()); - let len = ids.len(); - groups.push((ids, FxHashSet::default(), len)); + groups.push((ids, Default::default())); } } } @@ -522,7 +482,7 @@ impl DepGraph { .count(); if dependant_count >= 2 && count_of_startings >= 2 { - groups.push((vec![id.clone()], FxHashSet::default(), 1)); + groups.push((vec![id.clone()], FxHashSet::default())); global_done.insert(ix as u32); } } @@ -530,15 +490,11 @@ impl DepGraph { loop { let mut changed = false; - for (group, group_done, init_len) in &mut groups { - // Cycle group - - for i in 0..*init_len { - let start = &group[i]; - let start_ix = self.g.get_node(start); - changed |= - add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); - } + for (group, group_done) in &mut groups { + let start = &group[0]; + let start_ix = self.g.get_node(start); + changed |= + add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); } if !changed { @@ -601,7 +557,6 @@ impl DepGraph { unresolved_ctxt: SyntaxContext, top_level_ctxt: SyntaxContext, ) -> (Vec, FxHashMap) { - let top_level_vars = collect_top_level_decls(module); let mut exports = vec![]; let mut items = FxHashMap::default(); let mut ids = vec![]; @@ -742,41 +697,21 @@ impl DepGraph { }); { - let mut used_ids = if export.decl.is_fn_expr() { - ids_used_by_ignoring_nested( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - ids_used_by( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - }; - used_ids.read.remove(&default_var.to_id()); + let mut used_ids = ids_used_by_ignoring_nested( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + ); used_ids.write.insert(default_var.to_id()); - let mut captured_ids = if export.decl.is_fn_expr() { - ids_captured_by( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - Vars::default() - }; - captured_ids.read.remove(&default_var.to_id()); - + let captured_ids = + ids_captured_by(&export.decl, unresolved_ctxt, top_level_ctxt); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, write_vars: used_ids.write, eventual_write_vars: captured_ids.write, var_decls: [default_var.to_id()].into_iter().collect(), + side_effects: true, content: ModuleItem::ModuleDecl(item.clone()), ..Default::default() }; @@ -806,14 +741,9 @@ impl DepGraph { &export.expr, unresolved_ctxt, top_level_ctxt, - &top_level_vars, - ); - let captured_ids = ids_captured_by( - &export.expr, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, ); + let captured_ids = + ids_captured_by(&export.expr, unresolved_ctxt, top_level_ctxt); used_ids.write.insert(default_var.to_id()); @@ -913,7 +843,11 @@ impl DepGraph { kind: ItemIdItemKind::ImportBinding(si as _), }; ids.push(id.clone()); - let local = s.local().to_id(); + let local = match s { + ImportSpecifier::Named(s) => s.local.to_id(), + ImportSpecifier::Default(s) => s.local.to_id(), + ImportSpecifier::Namespace(s) => s.local.to_id(), + }; items.insert( id, ItemData { @@ -941,12 +875,7 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by( - &f.function, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); + let vars = ids_used_by(&f.function, unresolved_ctxt, top_level_ctxt); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(f.ident.to_id()); @@ -976,19 +905,19 @@ impl DepGraph { }; ids.push(id.clone()); - let mut vars = - ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let vars = ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(c.ident.to_id()); v }; - vars.write.insert(c.ident.to_id()); items.insert( id, ItemData { - read_vars: vars.read, - write_vars: vars.write, + is_hoisted: true, + eventual_read_vars: vars.read, + eventual_write_vars: vars.write, + write_vars: var_decls.clone(), var_decls, content: ModuleItem::Stmt(Stmt::Decl(Decl::Class(c.clone()))), ..Default::default() @@ -1008,24 +937,13 @@ impl DepGraph { ids.push(id.clone()); let decl_ids: Vec = find_pat_ids(&decl.name); - let vars = ids_used_by( + let vars = ids_used_by_ignoring_nested( &decl.init, unresolved_ctxt, top_level_ctxt, - &top_level_vars, ); let eventual_vars = - if matches!(decl.init.as_deref(), Some(Expr::Fn(..) | Expr::Arrow(..))) - { - ids_captured_by( - &decl.init, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ) - } else { - Vars::default() - }; + ids_captured_by(&decl.init, unresolved_ctxt, top_level_ctxt); let side_effects = vars.found_unresolved; @@ -1054,14 +972,9 @@ impl DepGraph { expr: box Expr::Assign(assign), .. })) => { - let mut used_ids = ids_used_by_ignoring_nested( - item, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); - let captured_ids = - ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let mut used_ids = + ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); + let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); if assign.op != op!("=") { used_ids.read.extend(used_ids.write.iter().cloned()); @@ -1070,7 +983,6 @@ impl DepGraph { &assign.left, unresolved_ctxt, top_level_ctxt, - &top_level_vars, ); used_ids.read.extend(extra_ids.read); used_ids.write.extend(extra_ids.write); @@ -1099,21 +1011,15 @@ impl DepGraph { ModuleItem::ModuleDecl( ModuleDecl::ExportDefaultDecl(..) | ModuleDecl::ExportDefaultExpr(..) - | ModuleDecl::ExportNamed(NamedExport { .. }) - | ModuleDecl::ExportAll(..), + | ModuleDecl::ExportNamed(NamedExport { .. }), ) => {} _ => { // Default to normal - let used_ids = ids_used_by_ignoring_nested( - item, - unresolved_ctxt, - top_level_ctxt, - &top_level_vars, - ); - let captured_ids = - ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); + let used_ids = + ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); + let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, @@ -1152,10 +1058,10 @@ impl DepGraph { for (local, export_name) in exports { let name = match &export_name { - Some(ModuleExportName::Ident(v)) => v.sym.clone(), - _ => local.0.clone(), + Some(ModuleExportName::Ident(v)) => v.to_id(), + _ => local.clone(), }; - let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.clone())); + let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.0.clone())); ids.push(id.clone()); items.insert( id.clone(), @@ -1172,8 +1078,8 @@ impl DepGraph { type_only: false, with: None, })), - read_vars: [local.clone()].into_iter().collect(), - export: Some(name), + read_vars: [name.clone()].into_iter().collect(), + export: Some(name.0), ..Default::default() }, ); diff --git a/crates/turbopack-ecmascript/src/tree_shake/mod.rs b/crates/turbopack-ecmascript/src/tree_shake/mod.rs index d5b8a8a31b557..c72b11ecfc1ab 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/mod.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/mod.rs @@ -1,16 +1,13 @@ -use std::{borrow::Cow, fmt::Write}; +use std::borrow::Cow; use anyhow::{bail, Result}; use indexmap::IndexSet; use rustc_hash::FxHashMap; use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP, GLOBALS}, - ecma::{ - ast::{ - ExportAll, ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, - ModuleExportName, ModuleItem, NamedExport, Program, - }, - codegen::{text_writer::JsWriter, Emitter}, + ecma::ast::{ + ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, ModuleExportName, + ModuleItem, NamedExport, Program, }, }; use turbo_tasks::{RcStr, ValueToString, Vc}; @@ -24,6 +21,7 @@ use crate::{analyzer::graph::EvalContext, parse::ParseResult, EcmascriptModuleAs pub mod asset; pub mod chunk_item; +mod cjs_finder; mod graph; pub mod merge; #[cfg(test)] @@ -112,10 +110,6 @@ impl Analyzer<'_> { for id in item.var_decls.iter() { let state = self.vars.entry(id.clone()).or_default(); - if state.declarator.is_none() { - state.declarator = Some(item_id.clone()); - } - if item.is_hoisted { state.last_writes.push(item_id.clone()); } else { @@ -177,11 +171,7 @@ impl Analyzer<'_> { if let Some(declarator) = &state.declarator { if declarator != item_id { // A write also depends on the declaration. - if item.side_effects { - self.g.add_strong_deps(item_id, [declarator]); - } else { - self.g.add_weak_deps(item_id, [declarator]); - } + self.g.add_weak_deps(item_id, [declarator].iter().copied()); } } } @@ -266,13 +256,6 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_strong_deps(item_id, state.last_writes.iter()); - - if let Some(declarator) = &state.declarator { - if declarator != item_id { - // A read also depends on the declaration. - self.g.add_strong_deps(item_id, [declarator]); - } - } } // For each var in EVENTUAL_WRITE_VARS: @@ -283,13 +266,6 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_weak_deps(item_id, state.last_reads.iter()); - - if let Some(declarator) = &state.declarator { - if declarator != item_id { - // A write also depends on the declaration. - self.g.add_strong_deps(item_id, [declarator]); - } - } } // (no state update happens, since this is only triggered by @@ -326,7 +302,6 @@ impl Analyzer<'_> { pub(crate) enum Key { ModuleEvaluation, Export(RcStr), - Exports, } /// Converts [Vc] to the index. @@ -337,9 +312,9 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result let key = match &*part { ModulePart::Evaluation => Key::ModuleEvaluation, ModulePart::Export(export) => Key::Export(export.await?.as_str().into()), - ModulePart::Exports => Key::Exports, ModulePart::Internal(part_id) => return Ok(*part_id), ModulePart::Locals + | ModulePart::Exports | ModulePart::Facade | ModulePart::RenamedExport { .. } | ModulePart::RenamedNamespace { .. } => { @@ -347,64 +322,23 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result } }; - let SplitResult::Ok { - entrypoints, - modules, - .. - } = &result - else { - bail!("split failed") + let entrypoints = match &result { + SplitResult::Ok { entrypoints, .. } => entrypoints, + _ => bail!("split failed"), }; - if let Some(id) = entrypoints.get(&key) { - return Ok(*id); - } - - // This is required to handle `export * from 'foo'` - if let ModulePart::Export(..) = &*part { - if let Some(&v) = entrypoints.get(&Key::Exports) { - return Ok(v); + let part_id = match entrypoints.get(&key) { + Some(id) => *id, + None => { + bail!( + "could not find part id for module part {:?} in {:?}", + key, + entrypoints + ) } - } - - let mut dump = String::new(); - - for (idx, m) in modules.iter().enumerate() { - let ParseResult::Ok { - program, - source_map, - .. - } = &*m.await? - else { - bail!("failed to get module") - }; - - { - let mut buf = vec![]; - - { - let wr = JsWriter::new(Default::default(), "\n", &mut buf, None); - - let mut emitter = Emitter { - cfg: Default::default(), - comments: None, - cm: source_map.clone(), - wr, - }; - - emitter.emit_program(program).unwrap(); - } - let code = String::from_utf8(buf).unwrap(); - - writeln!(dump, "# Module #{idx}:\n{code}\n\n\n")?; - } - } + }; - bail!( - "could not find part id for module part {:?} in {:?}\n\nModule dump:\n{dump}", - key, - entrypoints - ) + Ok(part_id) } #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] @@ -421,9 +355,6 @@ pub(crate) enum SplitResult { #[turbo_tasks(trace_ignore)] deps: FxHashMap>, - - #[turbo_tasks(debug_ignore, trace_ignore)] - star_reexports: Vec, }, Failed { parse_result: Vc, @@ -441,12 +372,7 @@ impl PartialEq for SplitResult { #[turbo_tasks::function] pub(super) async fn split_module(asset: Vc) -> Result> { - Ok(split( - asset.source().ident(), - asset.source(), - asset.parse(), - asset.options().await?.special_exports, - )) + Ok(split(asset.source().ident(), asset.source(), asset.parse())) } #[turbo_tasks::function] @@ -454,7 +380,6 @@ pub(super) async fn split( ident: Vc, source: Vc>, parsed: Vc, - special_exports: Vc>, ) -> Result> { let parse_result = parsed.await?; @@ -468,7 +393,7 @@ pub(super) async fn split( .. } => { // If the script file is a common js file, we cannot split the module - if util::should_skip_tree_shaking(program, &special_exports.await?) { + if cjs_finder::contains_cjs(program) { return Ok(SplitResult::Failed { parse_result: parsed, } @@ -494,7 +419,6 @@ pub(super) async fn split( entrypoints, part_deps, modules, - star_reexports, } = dep_graph.split_module(&items); assert_ne!(modules.len(), 0, "modules.len() == 0;\nModule: {module:?}",); @@ -507,6 +431,7 @@ pub(super) async fn split( modules.len() ); } + let modules = modules .into_iter() .map(|module| { @@ -515,6 +440,7 @@ pub(super) async fn split( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + false, Some(source), ); @@ -533,7 +459,6 @@ pub(super) async fn split( entrypoints, deps: part_deps, modules, - star_reexports, } .cell()) } @@ -558,7 +483,6 @@ pub(super) async fn part_of_module( modules, entrypoints, deps, - star_reexports, .. } => { debug_assert_ne!(modules.len(), 0, "modules.len() == 0"); @@ -633,6 +557,7 @@ pub(super) async fn part_of_module( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + true, None, ); return Ok(ParseResult::Ok { @@ -699,15 +624,12 @@ pub(super) async fn part_of_module( ))); } - module.body.extend(star_reexports.iter().map(|export_all| { - ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) - })); - let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, + true, None, ); return Ok(ParseResult::Ok { diff --git a/crates/turbopack-ecmascript/src/tree_shake/util.rs b/crates/turbopack-ecmascript/src/tree_shake/util.rs index 050f021e0c65e..79224046c7dd7 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/util.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/util.rs @@ -1,22 +1,17 @@ use std::hash::BuildHasherDefault; use indexmap::IndexSet; -use rustc_hash::{FxHashSet, FxHasher}; +use rustc_hash::FxHasher; use swc_core::{ common::SyntaxContext, ecma::{ ast::{ - ArrowExpr, AssignPatProp, AssignTarget, ClassDecl, ClassExpr, Constructor, DefaultDecl, - ExportDefaultDecl, ExportNamedSpecifier, ExportSpecifier, Expr, FnDecl, FnExpr, - Function, Id, Ident, ImportSpecifier, MemberExpr, MemberProp, NamedExport, Param, Pat, - Prop, PropName, VarDeclarator, *, + AssignTarget, BlockStmtOrExpr, Constructor, ExportNamedSpecifier, ExportSpecifier, + Expr, Function, Id, Ident, MemberExpr, MemberProp, NamedExport, Pat, PropName, }, visit::{noop_visit_type, Visit, VisitWith}, }, }; -use turbo_tasks::RcStr; - -use crate::TURBOPACK_HELPER; #[derive(Debug, Default, Clone, Copy)] enum Mode { @@ -32,11 +27,10 @@ struct Target { } /// A visitor which collects variables which are read or written. -pub(crate) struct IdentUsageCollector<'a> { +#[derive(Default)] +pub(crate) struct IdentUsageCollector { unresolved: SyntaxContext, top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, - vars: Vars, is_nested: bool, @@ -45,7 +39,7 @@ pub(crate) struct IdentUsageCollector<'a> { mode: Option, } -impl IdentUsageCollector<'_> { +impl IdentUsageCollector { fn with_nested(&mut self, f: impl FnOnce(&mut Self)) { if !self.target.eventual { return; @@ -64,13 +58,19 @@ impl IdentUsageCollector<'_> { } } -impl Visit for IdentUsageCollector<'_> { +impl Visit for IdentUsageCollector { fn visit_assign_target(&mut self, n: &AssignTarget) { self.with_mode(Some(Mode::Write), |this| { n.visit_children_with(this); }) } + fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) { + self.with_nested(|this| { + n.visit_children_with(this); + }) + } + fn visit_constructor(&mut self, n: &Constructor) { self.with_nested(|this| { n.visit_children_with(this); @@ -114,7 +114,6 @@ impl Visit for IdentUsageCollector<'_> { if n.span.ctxt != self.unresolved && n.span.ctxt != self.top_level && n.span.ctxt != SyntaxContext::empty() - && !self.top_level_vars.contains(&n.to_id()) { return; } @@ -169,16 +168,6 @@ impl Visit for IdentUsageCollector<'_> { } } - fn visit_prop(&mut self, n: &Prop) { - match n { - Prop::Shorthand(v) => { - self.with_mode(None, |c| c.visit_ident(v)); - } - - _ => n.visit_children_with(self), - } - } - noop_visit_type!(); } @@ -197,26 +186,18 @@ pub(crate) struct Vars { /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_captured_by<'a, N>( - n: &N, - unresolved: SyntaxContext, - top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, -) -> Vars +pub(crate) fn ids_captured_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: false, eventual: true, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars @@ -226,26 +207,18 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by<'a, N>( - n: &N, - unresolved: SyntaxContext, - top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, -) -> Vars +pub(crate) fn ids_used_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: true, eventual: true, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars @@ -255,256 +228,23 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by_ignoring_nested<'a, N>( +pub(crate) fn ids_used_by_ignoring_nested( n: &N, unresolved: SyntaxContext, top_level: SyntaxContext, - top_level_vars: &'a FxHashSet, ) -> Vars where - N: VisitWith>, + N: VisitWith, { let mut v = IdentUsageCollector { unresolved, top_level, - top_level_vars, target: Target { direct: true, eventual: false, }, - vars: Vars::default(), - is_nested: false, - mode: None, + ..Default::default() }; n.visit_with(&mut v); v.vars } - -pub struct TopLevelBindingCollector { - bindings: FxHashSet, - is_pat_decl: bool, -} - -impl TopLevelBindingCollector { - fn add(&mut self, i: &Ident) { - self.bindings.insert(i.to_id()); - } -} - -impl Visit for TopLevelBindingCollector { - noop_visit_type!(); - - fn visit_arrow_expr(&mut self, _: &ArrowExpr) {} - - fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) { - node.value.visit_with(self); - - if self.is_pat_decl { - self.add(&node.key); - } - } - - fn visit_class_decl(&mut self, node: &ClassDecl) { - self.add(&node.ident); - } - - fn visit_expr(&mut self, _: &Expr) {} - - fn visit_export_default_decl(&mut self, e: &ExportDefaultDecl) { - match &e.decl { - DefaultDecl::Class(ClassExpr { - ident: Some(ident), .. - }) => { - self.add(ident); - } - DefaultDecl::Fn(FnExpr { - ident: Some(ident), - function: f, - }) if f.body.is_some() => { - self.add(ident); - } - _ => {} - } - } - - fn visit_fn_decl(&mut self, node: &FnDecl) { - self.add(&node.ident); - } - - fn visit_import_specifier(&mut self, node: &ImportSpecifier) { - match node { - ImportSpecifier::Named(s) => self.add(&s.local), - ImportSpecifier::Default(s) => { - self.add(&s.local); - } - ImportSpecifier::Namespace(s) => { - self.add(&s.local); - } - } - } - - fn visit_param(&mut self, node: &Param) { - let old = self.is_pat_decl; - self.is_pat_decl = true; - node.visit_children_with(self); - self.is_pat_decl = old; - } - - fn visit_pat(&mut self, node: &Pat) { - node.visit_children_with(self); - - if self.is_pat_decl { - if let Pat::Ident(i) = node { - self.add(&i.id) - } - } - } - - fn visit_var_declarator(&mut self, node: &VarDeclarator) { - let old = self.is_pat_decl; - self.is_pat_decl = true; - node.name.visit_with(self); - - self.is_pat_decl = false; - node.init.visit_with(self); - self.is_pat_decl = old; - } -} - -/// Collects binding identifiers. -pub fn collect_top_level_decls(n: &N) -> FxHashSet -where - N: VisitWith, -{ - let mut v = TopLevelBindingCollector { - bindings: Default::default(), - is_pat_decl: false, - }; - n.visit_with(&mut v); - v.bindings -} - -pub fn should_skip_tree_shaking(m: &Program, special_exports: &[RcStr]) -> bool { - if let Program::Module(m) = m { - for item in m.body.iter() { - match item { - // Skip turbopack helpers. - ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - with, specifiers, .. - })) => { - if let Some(with) = with.as_deref().and_then(|v| v.as_import_with()) { - for item in with.values.iter() { - if item.key.sym == *TURBOPACK_HELPER { - // Skip tree shaking if the import is from turbopack-helper - return true; - } - } - } - - // TODO(PACK-3150): Tree shaking has a bug related to ModuleExportName::Str - for s in specifiers.iter() { - if let ImportSpecifier::Named(is) = s { - if matches!(is.imported, Some(ModuleExportName::Str(..))) { - return true; - } - } - } - } - - // Tree shaking has a bug related to ModuleExportName::Str - ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport { - src: Some(..), - specifiers, - .. - })) => { - for s in specifiers { - if let ExportSpecifier::Named(es) = s { - if matches!(es.orig, ModuleExportName::Str(..)) - || matches!(es.exported, Some(ModuleExportName::Str(..))) - { - return true; - } - } - } - } - - // Skip sever actions - ModuleItem::Stmt(Stmt::Expr(ExprStmt { - expr: box Expr::Lit(Lit::Str(Str { value, .. })), - .. - })) => { - if value == "use server" { - return true; - } - } - - // Skip special reexports that are recognized by next.js - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - decl: Decl::Var(box VarDecl { decls, .. }), - .. - })) => { - for decl in decls { - if let Pat::Ident(name) = &decl.name { - if special_exports.iter().any(|s| **s == *name.sym) { - return true; - } - } - } - } - - // Skip special reexports that are recognized by next.js - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - decl: Decl::Fn(f), - .. - })) => { - if special_exports.iter().any(|s| **s == *f.ident.sym) { - return true; - } - } - - _ => {} - } - } - - let mut visitor = UseServerFinder::default(); - m.visit_with(&mut visitor); - if visitor.abort { - return true; - } - - for item in m.body.iter() { - if item.is_module_decl() { - return false; - } - } - } - - true -} - -#[derive(Default)] -struct UseServerFinder { - abort: bool, -} - -impl Visit for UseServerFinder { - fn visit_expr_stmt(&mut self, e: &ExprStmt) { - e.visit_children_with(self); - - if let Expr::Lit(Lit::Str(Str { value, .. })) = &*e.expr { - if value == "use server" { - self.abort = true; - } - } - } - - fn visit_stmt(&mut self, n: &Stmt) { - if self.abort { - return; - } - - n.visit_children_with(self); - } - - noop_visit_type!(); -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md index 79c4fc3cbc295..66a2680795ce9 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md @@ -274,14 +274,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -334,14 +331,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -368,11 +362,9 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; - N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -383,7 +375,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -393,7 +384,6 @@ graph TD Export( "external1", ): 3, - Exports: 11, Export( "foo", ): 2, @@ -458,9 +448,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -481,9 +468,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -563,9 +547,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -577,22 +558,6 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 11 -```js -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js @@ -625,7 +590,6 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, - Exports: 8, Export( "foo", ): 2, @@ -685,9 +649,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; import { upper } from "module"; function internal() { @@ -709,9 +670,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -751,22 +709,6 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; -``` -## Part 8 -```js -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md index 073987fab8235..d121155292e1d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md @@ -292,14 +292,11 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; - Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; - Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; - Item14 --> Item5; ``` # Phase 4 ```mermaid @@ -355,14 +352,11 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; - Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; - Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; - Item14 --> Item5; Item15 --> Item1; Item15 --> Item2; Item15 --> Item11; @@ -387,14 +381,12 @@ graph TD N0 --> N6; N1 --> N10; N1 --> N9; - N1 --> N5; N2 --> N9; N2 --> N5; N3 --> N6; N4 --> N6; N4 --> N8; N4 --> N2; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -405,7 +397,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -415,7 +406,6 @@ graph TD Export( "external1", ): 1, - Exports: 11, Export( "foo", ): 3, @@ -462,9 +452,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -504,9 +491,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 2 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -586,9 +570,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -600,22 +581,6 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 11 -```js -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js @@ -649,7 +614,6 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 1, - Exports: 8, Export( "foo", ): 3, @@ -687,9 +651,6 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -734,9 +695,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -776,22 +734,6 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; -``` -## Part 8 -```js -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md index 3602e2dd5b590..eefa42f0d0b7a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md @@ -355,7 +355,6 @@ graph TD Export( "c2_2", ): 3, - Exports: 9, } ``` @@ -483,19 +482,6 @@ export { d3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -export { c1_1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c1_1" -}; -export { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c1_3" -}; -export { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c2_2" -}; - ``` ## Merged (module eval) ```js @@ -533,7 +519,6 @@ c2_2(); Export( "c2_2", ): 3, - Exports: 6, } ``` @@ -578,7 +563,6 @@ export { c2_2 }; ``` ## Part 4 ```js -function d1() {} function d2() {} function c1_1() { return c1_2(); @@ -589,9 +573,6 @@ function c1_2() { function c1_3() { return c1_1(d2); } -export { d1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { d2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -608,7 +589,6 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { ``` ## Part 5 ```js -function d3() {} function c2_1() { return c2_2(d3); } @@ -618,9 +598,6 @@ function c2_2() { function c2_3() { return c2_1(); } -export { d3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { c2_1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -631,19 +608,6 @@ export { c2_3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 6 -```js -export { c1_1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c1_1" -}; -export { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c1_3" -}; -export { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export c2_2" -}; - ``` ## Merged (module eval) ```js @@ -672,7 +636,6 @@ c2_2(); Export( "c2_2", ): 3, - Exports: 6, } ``` @@ -699,7 +662,6 @@ export { c1_3 }; Export( "c2_2", ): 3, - Exports: 6, } ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js deleted file mode 100644 index fd849eeea7373..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js +++ /dev/null @@ -1,34 +0,0 @@ -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; -import Document, { Html, Head, Main, NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -export default MyDocument; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md deleted file mode 100644 index 0db4dfc0f65db..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md +++ /dev/null @@ -1,596 +0,0 @@ -# Items - -Count: 14 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_jsx` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_jsxs` - -## Item 4: Stmt 0, `ImportBinding(2)` - -```js -import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; - -``` - -- Hoisted -- Declares: `_Fragment` - -## Item 5: Stmt 1, `ImportOfModule` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 1, `ImportBinding(0)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Document` - -## Item 7: Stmt 1, `ImportBinding(1)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Html` - -## Item 8: Stmt 1, `ImportBinding(2)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Head` - -## Item 9: Stmt 1, `ImportBinding(3)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `Main` - -## Item 10: Stmt 1, `ImportBinding(4)` - -```js -import Document, { Html, Head, Main, NextScript } from 'next/document'; - -``` - -- Hoisted -- Declares: `NextScript` - -## Item 11: Stmt 2, `Normal` - -```js -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} - -``` - -- Declares: `MyDocument` -- Reads: `Document`, `_jsxs`, `_Fragment`, `_jsx`, `Html`, `Head`, `Main`, `NextScript` -- Write: `Document`, `MyDocument` - -## Item 12: Stmt 3, `Normal` - -```js -export default MyDocument; - -``` - -- Side effects -- Declares: `__TURBOPACK__default__export__` -- Reads: `MyDocument` -- Write: `__TURBOPACK__default__export__` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item5; - Item2; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export default"]; - Item2 --> Item1; - Item11 --> Item6; - Item11 --> Item4; - Item11 --> Item5; - Item11 --> Item3; - Item11 --> Item7; - Item11 --> Item8; - Item11 --> Item9; - Item11 --> Item10; - Item12 --> Item11; - Item12 --> Item1; - Item12 --> Item2; - Item14 --> Item12; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item12; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #5), "default"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(1, ImportOfModule)]"]; - N4["Items: [ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(0, ImportBinding(2)), ItemId(1, ImportBinding(0)), ItemId(1, ImportBinding(1)), ItemId(1, ImportBinding(2)), ItemId(1, ImportBinding(3)), ItemId(1, ImportBinding(4)), ItemId(2, Normal), ItemId(3, Normal)]"]; - N0 --> N2; - N0 --> N3; - N0 --> N4; - N1 --> N4; - N3 --> N2; - N4 --> N2; - N4 --> N3; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, - Exports: 5, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import "react/jsx-runtime"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import 'next/document'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { jsx as _jsx } from "react/jsx-runtime"; -import { jsxs as _jsxs } from "react/jsx-runtime"; -import { Fragment as _Fragment } from "react/jsx-runtime"; -import Document from 'next/document'; -import { Html } from 'next/document'; -import { Head } from 'next/document'; -import { Main } from 'next/document'; -import { NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -const __TURBOPACK__default__export__ = MyDocument; -export { _jsx } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _jsxs } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _Fragment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Html } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Head } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Main } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextScript } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyDocument } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, - Exports: 5, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import "react/jsx-runtime"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import 'next/document'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { jsx as _jsx } from "react/jsx-runtime"; -import { jsxs as _jsxs } from "react/jsx-runtime"; -import { Fragment as _Fragment } from "react/jsx-runtime"; -import Document from 'next/document'; -import { Html } from 'next/document'; -import { Head } from 'next/document'; -import { Main } from 'next/document'; -import { NextScript } from 'next/document'; -class MyDocument extends Document { - static async getInitialProps(ctx) { - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: _jsxs(_Fragment, { - children: [ - initialProps.styles, - _jsx("style", { - dangerouslySetInnerHTML: { - __html: `html { background: hotpink; }` - } - }) - ] - }) - }; - } - render() { - return _jsxs(Html, { - children: [ - _jsx(Head, {}), - _jsxs("body", { - children: [ - _jsx(Main, {}), - _jsx(NextScript, {}) - ] - }) - ] - }); - } -} -const __TURBOPACK__default__export__ = MyDocument; -export { _jsx } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _jsxs } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _Fragment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Html } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Head } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { Main } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextScript } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyDocument } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md index b7655b3de241f..b797be2842de7 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md @@ -103,7 +103,7 @@ const routeModule = new AppRouteRouteModule({ - Side effects - Declares: `routeModule` - Reads: `AppRouteRouteModule`, `RouteKind`, `userland` -- Write: `routeModule`, `RouteKind`, `userland` +- Write: `routeModule`, `RouteKind` ## Item 10: Stmt 5, `VarDeclarator(0)` @@ -142,7 +142,6 @@ function patchFetch() { - Declares: `patchFetch` - Reads (eventual): `_patchFetch`, `serverHooks`, `staticGenerationAsyncStorage` - Write: `patchFetch` -- Write (eventual): `serverHooks`, `staticGenerationAsyncStorage` # Phase 1 ```mermaid @@ -283,8 +282,6 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; - Item12 -.-> Item17; - Item12 -.-> Item16; ``` # Phase 4 ```mermaid @@ -338,8 +335,6 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; - Item12 -.-> Item17; - Item12 -.-> Item16; Item13 --> Item1; Item13 --> Item2; Item13 --> Item3; @@ -373,8 +368,6 @@ graph TD N4 --> N12; N6 --> N11; N6 --> N12; - N6 --> N4; - N6 --> N3; N8 --> N7; N9 --> N7; N9 --> N8; @@ -407,7 +400,6 @@ graph TD Export( "routeModule", ): 1, - Exports: 13, Export( "originalPathname", ): 5, @@ -485,12 +477,6 @@ import "__TURBOPACK_PART__" assert { import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { patchFetch as patchFetch }; import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; function patchFetch() { @@ -608,28 +594,6 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 13 -```js -export { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export routeModule" -}; -export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export requestAsyncStorage" -}; -export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export staticGenerationAsyncStorage" -}; -export { serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export serverHooks" -}; -export { originalPathname } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export originalPathname" -}; -export { patchFetch } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export patchFetch" -}; - ``` ## Merged (module eval) ```js @@ -671,7 +635,6 @@ import "__TURBOPACK_PART__" assert { Export( "routeModule", ): 1, - Exports: 13, Export( "originalPathname", ): 5, @@ -859,28 +822,6 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 13 -```js -export { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export routeModule" -}; -export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export requestAsyncStorage" -}; -export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export staticGenerationAsyncStorage" -}; -export { serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export serverHooks" -}; -export { originalPathname } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export originalPathname" -}; -export { patchFetch } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export patchFetch" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md index 458f65fd2d252..c734bad84fb88 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md @@ -88,7 +88,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 3, Export( "b", ): 2, @@ -122,16 +121,6 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js @@ -143,7 +132,6 @@ export { b } from "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 3, Export( "b", ): 2, @@ -177,16 +165,6 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md index e21a6ea4860dc..7929d55a7d44b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md @@ -281,13 +281,10 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; - Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; - Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; - Item13 --> Item1; ``` # Phase 4 ```mermaid @@ -341,13 +338,10 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; - Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; - Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; - Item13 --> Item1; Item14 --> Item3; Item14 --> Item6; Item14 --> Item9; @@ -377,10 +371,9 @@ graph TD N3 --> N13; N4 --> N13; N4 --> N11; - N4 --> N6; N5 --> N11; - N5 --> N6; N5 --> N12; + N5 --> N6; N7 --> N6; N8 --> N7; N8 --> N6; @@ -409,7 +402,6 @@ graph TD Export( "initialCat", ): 3, - Exports: 14, Export( "cat", ): 2, @@ -471,9 +463,6 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; export { getChimera }; function getChimera() { return cat + dog; @@ -488,12 +477,12 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 12 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; function getDog() { return dog; } @@ -609,22 +598,6 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 14 -```js -export { dogRef } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export dogRef" -}; -export { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export cat" -}; -export { initialCat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export initialCat" -}; -export { getChimera } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getChimera" -}; - ``` ## Merged (module eval) ```js @@ -651,7 +624,6 @@ import "__TURBOPACK_PART__" assert { Export( "initialCat", ): 3, - Exports: 10, Export( "cat", ): 2, @@ -742,9 +714,6 @@ import { cat } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { getChimera }; function getChimera() { return cat + dog; @@ -799,22 +768,6 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 10 -```js -export { dogRef } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export dogRef" -}; -export { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export cat" -}; -export { initialCat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export initialCat" -}; -export { getChimera } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getChimera" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md index 0fbaba881b5bd..a19d842625785 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md @@ -41,7 +41,6 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; ``` # Phase 3 ```mermaid @@ -52,7 +51,6 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; ``` # Phase 4 ```mermaid @@ -63,8 +61,8 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item4 --> Item2; Item3 --> Item1; + Item4 --> Item2; ``` # Final ```mermaid @@ -80,7 +78,6 @@ graph TD Export( "fakeCat", ): 1, - Exports: 2, } ``` @@ -100,13 +97,6 @@ export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 2 -```js -export { fakeCat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export fakeCat" -}; - ``` ## Merged (module eval) ```js @@ -122,7 +112,6 @@ import "./lib"; Export( "fakeCat", ): 1, - Exports: 2, } ``` @@ -142,13 +131,6 @@ export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 2 -```js -export { fakeCat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export fakeCat" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md index b38d9dbf90f83..41b9426b0686b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md @@ -239,7 +239,6 @@ graph TD Export( "addMessageListener", ): 1, - Exports: 6, Export( "sendMessage", ): 2, @@ -362,19 +361,6 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 6 -```js -export { addMessageListener } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export addMessageListener" -}; -export { sendMessage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export sendMessage" -}; -export { connectHMR } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export connectHMR" -}; - ``` ## Merged (module eval) ```js @@ -392,7 +378,6 @@ export { connectHMR } from "__TURBOPACK_PART__" assert { Export( "addMessageListener", ): 1, - Exports: 6, Export( "sendMessage", ): 2, @@ -515,19 +500,6 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 6 -```js -export { addMessageListener } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export addMessageListener" -}; -export { sendMessage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export sendMessage" -}; -export { connectHMR } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export connectHMR" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md index dcaa3b1ed962c..361e8588ef2c0 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md @@ -465,11 +465,9 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; - Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; - Item19 --> Item5; ``` # Phase 4 ```mermaid @@ -538,11 +536,9 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; - Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; - Item19 --> Item5; Item20 --> Item1; Item20 --> Item2; Item20 --> Item3; @@ -559,9 +555,9 @@ graph TD N5["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch")), ItemId(9, Normal)]"]; N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs")), ItemId(11, Normal)]"]; N7["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses")), ItemId(12, Normal)]"]; - N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(0, ImportBinding(0)), ItemId(14, Normal)]"]; + N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(14, Normal)]"]; N9["Items: [ItemId(0, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(10, Normal)]"]; + N10["Items: [ItemId(10, Normal)]"]; N11["Items: [ItemId(13, Normal)]"]; N2 --> N3; N2 --> N10; @@ -570,8 +566,6 @@ graph TD N5 --> N10; N8 --> N11; N8 --> N9; - N8 --> N10; - N9 --> N10; N10 --> N11; N10 --> N9; N11 --> N9; @@ -605,7 +599,6 @@ graph TD Export( "formatDynamicAPIAccesses", ): 7, - Exports: 12, } ``` @@ -789,14 +782,10 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; export { createPostponedAbortSignal }; -import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -807,9 +796,6 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -817,9 +803,6 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -835,10 +818,9 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -848,9 +830,6 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -870,34 +849,6 @@ export { assertPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 12 -```js -export { createPrerenderState } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export createPrerenderState" -}; -export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export markCurrentScopeAsDynamic" -}; -export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export trackDynamicDataAccessed" -}; -export { Postpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export Postpone" -}; -export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export trackDynamicFetch" -}; -export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export usedDynamicAPIs" -}; -export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export formatDynamicAPIAccesses" -}; -export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export createPostponedAbortSignal" -}; - ``` ## Merged (module eval) ```js @@ -937,7 +888,6 @@ import '../../lib/url'; Export( "formatDynamicAPIAccesses", ): 7, - Exports: 12, } ``` @@ -1121,14 +1071,10 @@ export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; export { createPostponedAbortSignal }; -import React from 'react'; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -1139,9 +1085,6 @@ function createPostponedAbortSignal(reason) { } return controller.signal; } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1149,9 +1092,6 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { ``` ## Part 9 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import React from 'react'; const hasPostpone = typeof React.unstable_postpone === 'function'; export { React } from "__TURBOPACK_VAR__" assert { @@ -1167,10 +1107,9 @@ export { hasPostpone } from "__TURBOPACK_VAR__" assert { import { assertPostpone } from "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; -import "__TURBOPACK_PART__" assert { +import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import React from 'react'; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -1180,9 +1119,6 @@ function postponeWithTracking(prerenderState, expression, pathname) { }); React.unstable_postpone(reason); } -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1202,34 +1138,6 @@ export { assertPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 12 -```js -export { createPrerenderState } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export createPrerenderState" -}; -export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export markCurrentScopeAsDynamic" -}; -export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export trackDynamicDataAccessed" -}; -export { Postpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export Postpone" -}; -export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export trackDynamicFetch" -}; -export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export usedDynamicAPIs" -}; -export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export formatDynamicAPIAccesses" -}; -export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export createPostponedAbortSignal" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md index d903445cdfb18..5220a3ffac6a3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads: `IPC` -- Write: `IPC` +- Reads (eventual): `IPC` +- Write (eventual): `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,7 +274,6 @@ const improveConsole = (name, stream, addStack)=>{ ``` -- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -535,25 +534,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -851,7 +840,6 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -910,25 +898,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1226,12 +1204,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1289,25 +1267,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1605,19 +1573,18 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; - Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1638,7 +1605,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1647,51 +1614,41 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; - N0 --> N9; N0 --> N6; + N0 --> N2; N1 --> N6; - N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N9; + N6 --> N8; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N9; + N7 --> N8; N7 --> N6; - N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N7; - N9 --> N6; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Export( - "IPC", - ): 2, - Exports: 10, Export( "structuredError", ): 1, + Export( + "IPC", + ): 2, } ``` @@ -1711,19 +1668,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1778,9 +1738,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1814,7 +1771,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1849,7 +1806,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1874,9 +1831,6 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -2038,53 +1992,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export structuredError" -}; -export { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export IPC" -}; - ``` ## Merged (module eval) ```js @@ -2100,19 +2007,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2162,13 +2072,12 @@ export { improveConsole } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, - Export( - "IPC", - ): 2, - Exports: 10, Export( "structuredError", ): 1, + Export( + "IPC", + ): 2, } ``` @@ -2188,13 +2097,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2240,9 +2149,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2468,38 +2374,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); - -``` -## Part 10 -```js -export { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export structuredError" -}; -export { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export IPC" -}; - ``` ## Merged (module eval) ```js @@ -2515,13 +2389,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md index 32edc7597008f..6426c3f4376c8 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md @@ -299,7 +299,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 7, Export( "y", ): 2, @@ -389,16 +388,6 @@ x += 7; x += 8; x += 9; -``` -## Part 7 -```js -export { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export x" -}; -export { y } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export y" -}; - ``` ## Merged (module eval) ```js @@ -413,7 +402,6 @@ import "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 6, Export( "y", ): 2, @@ -490,16 +478,6 @@ x += 7; x += 8; x += 9; -``` -## Part 6 -```js -export { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export x" -}; -export { y } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export y" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md index c00cbd3e502da..adbe2ec572da3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md @@ -140,10 +140,10 @@ export const run = async (moduleFactory)=>{ ``` -- Side effects - Declares: `run` -- Reads: `ipc`, `queue` -- Write: `run`, `ipc`, `queue` +- Reads (eventual): `ipc`, `queue` +- Write: `run` +- Write (eventual): `ipc`, `queue` # Phase 1 ```mermaid @@ -171,9 +171,6 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item5 --> Item1; Item7 --> Item5; ``` # Phase 3 @@ -189,10 +186,9 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; ``` # Phase 4 ```mermaid @@ -207,31 +203,22 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; Item6 --> Item1; - Item6 --> Item5; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("run", #2), "run"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; - N0 --> N2; - N0 --> N3; - N1 --> N3; - N3 --> N2; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(Export(("run", #2), "run")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Exports: 4, Export( "run", ): 1, @@ -242,33 +229,13 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; "module evaluation"; +import "./index"; ``` ## Part 1 ```js -import { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { run }; - -``` -## Part 2 -```js -import "./index"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -376,22 +343,10 @@ export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export run" -}; - ``` ## Merged (module eval) ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; +import "./index"; "module evaluation"; ``` @@ -400,7 +355,6 @@ import "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 4, Export( "run", ): 1, @@ -411,33 +365,13 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; "module evaluation"; +import "./index"; ``` ## Part 1 ```js -import { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; export { run }; - -``` -## Part 2 -```js -import "./index"; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; import { IPC } from "./index"; const ipc = IPC; const queue = []; @@ -545,22 +479,10 @@ export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { run } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export run" -}; - ``` ## Merged (module eval) ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; +import "./index"; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md index d903445cdfb18..5220a3ffac6a3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads: `IPC` -- Write: `IPC` +- Reads (eventual): `IPC` +- Write (eventual): `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,7 +274,6 @@ const improveConsole = (name, stream, addStack)=>{ ``` -- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -535,25 +534,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -851,7 +840,6 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -910,25 +898,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1226,12 +1204,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1289,25 +1267,15 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; - Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; + Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item9; - Item12 --> Item10; - Item12 --> Item11; - Item12 -.-> Item6; - Item12 -.-> Item5; - Item12 -.-> Item4; - Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1605,19 +1573,18 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; - Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; + Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; - Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1638,7 +1605,7 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; N3["Items: [ItemId(0, ImportOfModule)]"]; @@ -1647,51 +1614,41 @@ graph TD N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N9["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N7; N0 --> N8; - N0 --> N9; N0 --> N6; + N0 --> N2; N1 --> N6; - N2 --> N9; N2 --> N8; N4 --> N3; N5 --> N3; N5 --> N4; - N6 --> N9; + N6 --> N8; N7 --> N3; N7 --> N4; N7 --> N5; - N7 --> N9; + N7 --> N8; N7 --> N6; - N8 --> N9; N8 --> N6; N8 --> N7; N8 --> N3; N8 --> N4; N8 --> N5; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N7; - N9 --> N6; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Export( - "IPC", - ): 2, - Exports: 10, Export( "structuredError", ): 1, + Export( + "IPC", + ): 2, } ``` @@ -1711,19 +1668,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; "module evaluation"; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -1778,9 +1738,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -1814,7 +1771,7 @@ import "./error"; ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; @@ -1849,7 +1806,7 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 @@ -1874,9 +1831,6 @@ export { PORT } from "__TURBOPACK_VAR__" assert { ``` ## Part 8 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { structuredError } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; @@ -2038,53 +1992,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export structuredError" -}; -export { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export IPC" -}; - ``` ## Merged (module eval) ```js @@ -2100,19 +2007,22 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import { createConnection } from "node:net"; import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; import { getProperError } from "./error"; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2162,13 +2072,12 @@ export { improveConsole } from "__TURBOPACK_VAR__" assert { ``` { ModuleEvaluation: 0, - Export( - "IPC", - ): 2, - Exports: 10, Export( "structuredError", ): 1, + Export( + "IPC", + ): 2, } ``` @@ -2188,13 +2097,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2240,9 +2149,6 @@ export { structuredError }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -2468,38 +2374,6 @@ export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); - -``` -## Part 10 -```js -export { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export structuredError" -}; -export { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export IPC" -}; - ``` ## Merged (module eval) ```js @@ -2515,13 +2389,13 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { +import { IPC } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js deleted file mode 100644 index 2f8e8f3d19740..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js +++ /dev/null @@ -1,44 +0,0 @@ -let clientComponentLoadStart = 0; -let clientComponentLoadTimes = 0; -let clientComponentLoadCount = 0; -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md deleted file mode 100644 index 331a120f8ad52..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md +++ /dev/null @@ -1,465 +0,0 @@ -# Items - -Count: 8 - -## Item 1: Stmt 0, `VarDeclarator(0)` - -```js -let clientComponentLoadStart = 0; - -``` - -- Declares: `clientComponentLoadStart` -- Write: `clientComponentLoadStart` - -## Item 2: Stmt 1, `VarDeclarator(0)` - -```js -let clientComponentLoadTimes = 0; - -``` - -- Declares: `clientComponentLoadTimes` -- Write: `clientComponentLoadTimes` - -## Item 3: Stmt 2, `VarDeclarator(0)` - -```js -let clientComponentLoadCount = 0; - -``` - -- Declares: `clientComponentLoadCount` -- Write: `clientComponentLoadCount` - -## Item 4: Stmt 3, `Normal` - -```js -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} - -``` - -- Hoisted -- Declares: `wrapClientComponentLoader` -- Reads (eventual): `clientComponentLoadStart` -- Write: `wrapClientComponentLoader` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` - -## Item 5: Stmt 4, `Normal` - -```js -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} - -``` - -- Hoisted -- Declares: `getClientComponentLoaderMetrics` -- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` -- Write: `getClientComponentLoaderMetrics` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; - N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N4["Items: [ItemId(1, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N1 --> N3; - N1 --> N5; - N1 --> N4; - N2 --> N3; - N2 --> N4; - N2 --> N5; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getClientComponentLoaderMetrics", - ): 2, - Exports: 6, - Export( - "wrapClientComponentLoader", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 6 -```js -export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export wrapClientComponentLoader" -}; -export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getClientComponentLoaderMetrics" -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getClientComponentLoaderMetrics", - ): 2, - Exports: 6, - Export( - "wrapClientComponentLoader", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - const startTime = performance.now(); - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = startTime; - } - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 6 -```js -export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export wrapClientComponentLoader" -}; -export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getClientComponentLoaderMetrics" -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js deleted file mode 100644 index 831bb0474831b..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js +++ /dev/null @@ -1,44 +0,0 @@ -let clientComponentLoadStart = 0; -let clientComponentLoadTimes = 0; -let clientComponentLoadCount = 0; -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md deleted file mode 100644 index 353e06f5e3ad0..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md +++ /dev/null @@ -1,465 +0,0 @@ -# Items - -Count: 8 - -## Item 1: Stmt 0, `VarDeclarator(0)` - -```js -let clientComponentLoadStart = 0; - -``` - -- Declares: `clientComponentLoadStart` -- Write: `clientComponentLoadStart` - -## Item 2: Stmt 1, `VarDeclarator(0)` - -```js -let clientComponentLoadTimes = 0; - -``` - -- Declares: `clientComponentLoadTimes` -- Write: `clientComponentLoadTimes` - -## Item 3: Stmt 2, `VarDeclarator(0)` - -```js -let clientComponentLoadCount = 0; - -``` - -- Declares: `clientComponentLoadCount` -- Write: `clientComponentLoadCount` - -## Item 4: Stmt 3, `Normal` - -```js -export function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} - -``` - -- Hoisted -- Declares: `wrapClientComponentLoader` -- Reads (eventual): `clientComponentLoadStart` -- Write: `wrapClientComponentLoader` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` - -## Item 5: Stmt 4, `Normal` - -```js -export function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} - -``` - -- Hoisted -- Declares: `getClientComponentLoaderMetrics` -- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` -- Write: `getClientComponentLoaderMetrics` -- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export wrapClientComponentLoader"]; - Item8; - Item8["export getClientComponentLoaderMetrics"]; - Item7 --> Item4; - Item8 --> Item5; - Item4 --> Item1; - Item4 --> Item3; - Item4 --> Item2; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader")), ItemId(3, Normal)]"]; - N2["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics")), ItemId(4, Normal)]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N4["Items: [ItemId(1, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N1 --> N3; - N1 --> N5; - N1 --> N4; - N2 --> N3; - N2 --> N4; - N2 --> N5; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getClientComponentLoaderMetrics", - ): 2, - Exports: 6, - Export( - "wrapClientComponentLoader", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 6 -```js -export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export wrapClientComponentLoader" -}; -export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getClientComponentLoaderMetrics" -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "getClientComponentLoaderMetrics", - ): 2, - Exports: 6, - Export( - "wrapClientComponentLoader", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; - -``` -## Part 1 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { wrapClientComponentLoader }; -function wrapClientComponentLoader(ComponentMod) { - if (!('performance' in globalThis)) { - return ComponentMod.__next_app__; - } - return { - require: (...args)=>{ - if (clientComponentLoadStart === 0) { - clientComponentLoadStart = performance.now(); - } - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.require(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - }, - loadChunk: (...args)=>{ - const startTime = performance.now(); - try { - clientComponentLoadCount += 1; - return ComponentMod.__next_app__.loadChunk(...args); - } finally{ - clientComponentLoadTimes += performance.now() - startTime; - } - } - }; -} -export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { getClientComponentLoaderMetrics }; -function getClientComponentLoaderMetrics(options = {}) { - const metrics = clientComponentLoadStart === 0 ? undefined : { - clientComponentLoadStart, - clientComponentLoadTimes, - clientComponentLoadCount - }; - if (options.reset) { - clientComponentLoadStart = 0; - clientComponentLoadTimes = 0; - clientComponentLoadCount = 0; - } - return metrics; -} -export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -let clientComponentLoadStart = 0; -export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -let clientComponentLoadTimes = 0; -export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -let clientComponentLoadCount = 0; -export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 6 -```js -export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export wrapClientComponentLoader" -}; -export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getClientComponentLoaderMetrics" -}; - -``` -## Merged (module eval) -```js -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md index ec441ed9dee16..add30fe1a5e6a 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md @@ -45,7 +45,6 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; ``` # Phase 3 @@ -59,7 +58,6 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; ``` # Phase 4 @@ -73,8 +71,8 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item4 --> Item1; Item5 --> Item2; + Item4 --> Item1; ``` # Final ```mermaid @@ -88,7 +86,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 3, Export( "cat", ): 2, @@ -122,16 +119,6 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { DOG } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export DOG" -}; -export { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export cat" -}; - ``` ## Merged (module eval) ```js @@ -143,7 +130,6 @@ export { cat } from "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 3, Export( "cat", ): 2, @@ -177,16 +163,6 @@ export { cat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { DOG } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export DOG" -}; -export { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export cat" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js deleted file mode 100644 index bf12a2b2e4066..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js +++ /dev/null @@ -1,44 +0,0 @@ -import crypto from 'crypto' -import { urlAlphabet } from './url-alphabet/index.js' -const POOL_SIZE_MULTIPLIER = 128 -let pool, poolOffset -let fillPool = bytes => { - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) - crypto.randomFillSync(pool) - poolOffset = 0 - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool) - poolOffset = 0 - } - poolOffset += bytes -} -let random = bytes => { - fillPool((bytes -= 0)) - return pool.subarray(poolOffset - bytes, poolOffset) -} -let customRandom = (alphabet, size, getRandom) => { - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 - let step = Math.ceil((1.6 * mask * size) / alphabet.length) - return () => { - let id = '' - while (true) { - let bytes = getRandom(step) - let i = step - while (i--) { - id += alphabet[bytes[i] & mask] || '' - if (id.length === size) return id - } - } - } -} -let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) -let nanoid = (size = 21) => { - fillPool((size -= 0)) - let id = '' - for (let i = poolOffset - size; i < poolOffset; i++) { - id += urlAlphabet[pool[i] & 63] - } - return id -} -export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md deleted file mode 100644 index 229602f229f54..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md +++ /dev/null @@ -1,960 +0,0 @@ -# Items - -Count: 18 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import crypto from 'crypto'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import crypto from 'crypto'; - -``` - -- Hoisted -- Declares: `crypto` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { urlAlphabet } from './url-alphabet/index.js'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { urlAlphabet } from './url-alphabet/index.js'; - -``` - -- Hoisted -- Declares: `urlAlphabet` - -## Item 5: Stmt 2, `VarDeclarator(0)` - -```js -const POOL_SIZE_MULTIPLIER = 128; - -``` - -- Declares: `POOL_SIZE_MULTIPLIER` -- Write: `POOL_SIZE_MULTIPLIER` - -## Item 6: Stmt 3, `VarDeclarator(0)` - -```js -let pool, poolOffset; - -``` - -- Declares: `pool` -- Write: `pool` - -## Item 7: Stmt 3, `VarDeclarator(1)` - -```js -let pool, poolOffset; - -``` - -- Declares: `poolOffset` -- Write: `poolOffset` - -## Item 8: Stmt 4, `VarDeclarator(0)` - -```js -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; - -``` - -- Side effects -- Declares: `fillPool` -- Reads: `pool`, `POOL_SIZE_MULTIPLIER`, `crypto`, `poolOffset` -- Write: `fillPool`, `pool`, `crypto`, `poolOffset` - -## Item 9: Stmt 5, `VarDeclarator(0)` - -```js -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; - -``` - -- Declares: `random` -- Reads: `fillPool`, `pool`, `poolOffset` -- Write: `random`, `pool` - -## Item 10: Stmt 6, `VarDeclarator(0)` - -```js -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; - -``` - -- Side effects -- Declares: `customRandom` -- Write: `customRandom` - -## Item 11: Stmt 7, `VarDeclarator(0)` - -```js -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); - -``` - -- Declares: `customAlphabet` -- Reads: `customRandom`, `random` -- Write: `customAlphabet` - -## Item 12: Stmt 8, `VarDeclarator(0)` - -```js -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; - -``` - -- Declares: `nanoid` -- Reads: `fillPool`, `poolOffset`, `urlAlphabet`, `pool` -- Write: `nanoid`, `urlAlphabet`, `pool` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item2; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item13["ModuleEvaluation"]; - Item14; - Item14["export nanoid"]; - Item15; - Item15["export customAlphabet"]; - Item16; - Item16["export customRandom"]; - Item17; - Item17["export urlAlphabet"]; - Item18; - Item18["export random"]; - Item2 --> Item1; - Item8 --> Item6; - Item8 --> Item5; - Item8 --> Item3; - Item8 --> Item7; - Item8 --> Item1; - Item8 --> Item2; - Item9 --> Item8; - Item9 --> Item6; - Item9 --> Item7; - Item10 --> Item1; - Item10 --> Item2; - Item10 --> Item8; - Item11 --> Item10; - Item11 --> Item9; - Item12 --> Item8; - Item12 --> Item7; - Item12 --> Item4; - Item12 --> Item9; - Item12 --> Item6; - Item14 --> Item12; - Item15 --> Item11; - Item16 --> Item10; - Item17 --> Item12; - Item17 --> Item4; - Item18 --> Item9; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item8; - Item13 --> Item10; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("nanoid", #2), "nanoid"))]"]; - N2["Items: [ItemId(Export(("customAlphabet", #2), "customAlphabet")), ItemId(7, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("customRandom", #2), "customRandom"))]"]; - N4["Items: [ItemId(Export(("urlAlphabet", #2), "urlAlphabet")), ItemId(1, ImportBinding(0))]"]; - N5["Items: [ItemId(Export(("random", #2), "random"))]"]; - N6["Items: [ItemId(0, ImportOfModule)]"]; - N7["Items: [ItemId(1, ImportOfModule)]"]; - N8["Items: [ItemId(3, VarDeclarator(0))]"]; - N9["Items: [ItemId(3, VarDeclarator(1))]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(2, VarDeclarator(0)), ItemId(4, VarDeclarator(0))]"]; - N11["Items: [ItemId(5, VarDeclarator(0))]"]; - N12["Items: [ItemId(6, VarDeclarator(0))]"]; - N13["Items: [ItemId(1, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N0 --> N6; - N0 --> N7; - N0 --> N10; - N0 --> N12; - N1 --> N13; - N2 --> N12; - N2 --> N11; - N3 --> N12; - N4 --> N13; - N5 --> N11; - N7 --> N6; - N10 --> N8; - N10 --> N9; - N10 --> N6; - N10 --> N7; - N11 --> N10; - N11 --> N8; - N11 --> N9; - N12 --> N6; - N12 --> N7; - N12 --> N10; - N13 --> N10; - N13 --> N9; - N13 --> N11; - N13 --> N8; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 14, - Export( - "customAlphabet", - ): 2, - Export( - "customRandom", - ): 3, - Export( - "urlAlphabet", - ): 4, - Export( - "random", - ): 5, - Export( - "nanoid", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { nanoid as nanoid }; - -``` -## Part 2 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { customAlphabet as customAlphabet }; -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); -export { customAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { customRandom as customRandom }; - -``` -## Part 4 -```js -import { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { urlAlphabet as urlAlphabet }; -import { urlAlphabet } from './url-alphabet/index.js'; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { random as random }; - -``` -## Part 6 -```js -import 'crypto'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import './url-alphabet/index.js'; - -``` -## Part 8 -```js -let pool; -export { pool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -let poolOffset; -export { poolOffset } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import crypto from 'crypto'; -const POOL_SIZE_MULTIPLIER = 128; -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; -export { crypto } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { fillPool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; -export { random } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; -export { customRandom } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { urlAlphabet } from './url-alphabet/index.js'; -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { nanoid } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 14 -```js -export { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export nanoid" -}; -export { customAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export customAlphabet" -}; -export { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export customRandom" -}; -export { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export urlAlphabet" -}; -export { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export random" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 14, - Export( - "customAlphabet", - ): 2, - Export( - "customRandom", - ): 3, - Export( - "urlAlphabet", - ): 4, - Export( - "random", - ): 5, - Export( - "nanoid", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { nanoid as nanoid }; - -``` -## Part 2 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { customAlphabet as customAlphabet }; -let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); -export { customAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -import { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { customRandom as customRandom }; - -``` -## Part 4 -```js -import { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -export { urlAlphabet as urlAlphabet }; -import { urlAlphabet } from './url-alphabet/index.js'; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 5 -```js -import { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { random as random }; - -``` -## Part 6 -```js -import 'crypto'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import './url-alphabet/index.js'; - -``` -## Part 8 -```js -let pool; -export { pool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -let poolOffset; -export { poolOffset } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import crypto from 'crypto'; -const POOL_SIZE_MULTIPLIER = 128; -let fillPool = (bytes)=>{ - if (!pool || pool.length < bytes) { - pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); - crypto.randomFillSync(pool); - poolOffset = 0; - } else if (poolOffset + bytes > pool.length) { - crypto.randomFillSync(pool); - poolOffset = 0; - } - poolOffset += bytes; -}; -export { crypto } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { fillPool } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -let random = (bytes)=>{ - fillPool((bytes -= 0)); - return pool.subarray(poolOffset - bytes, poolOffset); -}; -export { random } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -let customRandom = (alphabet, size, getRandom)=>{ - let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; - let step = Math.ceil((1.6 * mask * size) / alphabet.length); - return ()=>{ - let id = ''; - while(true){ - let bytes = getRandom(step); - let i = step; - while(i--){ - id += alphabet[bytes[i] & mask] || ''; - if (id.length === size) return id; - } - } - }; -}; -export { customRandom } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import { fillPool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import { poolOffset } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { pool } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { urlAlphabet } from './url-alphabet/index.js'; -let nanoid = (size = 21)=>{ - fillPool((size -= 0)); - let id = ''; - for(let i = poolOffset - size; i < poolOffset; i++){ - id += urlAlphabet[pool[i] & 63]; - } - return id; -}; -export { urlAlphabet } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { nanoid } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 14 -```js -export { nanoid } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export nanoid" -}; -export { customAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export customAlphabet" -}; -export { customRandom } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export customRandom" -}; -export { urlAlphabet } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export urlAlphabet" -}; -export { random } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export random" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js deleted file mode 100644 index 355cd43370ea1..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js +++ /dev/null @@ -1,122 +0,0 @@ -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -const INTERNALS = Symbol('internal response'); -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -/** - * This class extends the [Web `Response` API](https://developer.mozilla.org/docs/Web/API/Response) with additional convenience methods. - * - * Read more: [Next.js Docs: `NextResponse`](https://nextjs.org/docs/app/api-reference/functions/next-response) - */ export class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - // rest of props come from Response - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} - -//# sourceMappingURL=response.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md deleted file mode 100644 index 20d9b441f54eb..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md +++ /dev/null @@ -1,1161 +0,0 @@ -# Items - -Count: 17 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { stringifyCookie } from '../../web/spec-extension/cookies'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { stringifyCookie } from '../../web/spec-extension/cookies'; - -``` - -- Hoisted -- Declares: `stringifyCookie` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { NextURL } from '../next-url'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { NextURL } from '../next-url'; - -``` - -- Hoisted -- Declares: `NextURL` - -## Item 5: Stmt 2, `ImportOfModule` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 2, `ImportBinding(0)` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Declares: `toNodeOutgoingHttpHeaders` - -## Item 7: Stmt 2, `ImportBinding(1)` - -```js -import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; - -``` - -- Hoisted -- Declares: `validateURL` - -## Item 8: Stmt 3, `ImportOfModule` - -```js -import { ReflectAdapter } from './adapters/reflect'; - -``` - -- Hoisted -- Side effects - -## Item 9: Stmt 3, `ImportBinding(0)` - -```js -import { ReflectAdapter } from './adapters/reflect'; - -``` - -- Hoisted -- Declares: `ReflectAdapter` - -## Item 10: Stmt 4, `ImportOfModule` - -```js -import { ResponseCookies } from './cookies'; - -``` - -- Hoisted -- Side effects - -## Item 11: Stmt 4, `ImportBinding(0)` - -```js -import { ResponseCookies } from './cookies'; - -``` - -- Hoisted -- Declares: `ResponseCookies` - -## Item 12: Stmt 5, `VarDeclarator(0)` - -```js -const INTERNALS = Symbol('internal response'); - -``` - -- Side effects -- Declares: `INTERNALS` -- Write: `INTERNALS` - -## Item 13: Stmt 6, `VarDeclarator(0)` - -```js -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); - -``` - -- Side effects -- Declares: `REDIRECTS` -- Write: `REDIRECTS` - -## Item 14: Stmt 7, `Normal` - -```js -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} - -``` - -- Hoisted -- Declares: `handleMiddlewareField` -- Write: `handleMiddlewareField` - -## Item 15: Stmt 8, `Normal` - -```js -export class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} - -``` - -- Declares: `NextResponse` -- Reads: `ResponseCookies`, `stringifyCookie`, `handleMiddlewareField`, `ReflectAdapter`, `INTERNALS`, `NextURL`, `toNodeOutgoingHttpHeaders`, `NextResponse`, `REDIRECTS`, `validateURL` -- Write: `ReflectAdapter`, `REDIRECTS`, `NextResponse` - -# Phase 1 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item6; - Item2; - Item7; - Item3; - Item8; - Item9; - Item4; - Item10; - Item5; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item16["ModuleEvaluation"]; - Item17; - Item17["export NextResponse"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item4 --> Item1; - Item4 --> Item2; - Item4 --> Item3; - Item5 --> Item1; - Item5 --> Item2; - Item5 --> Item3; - Item5 --> Item4; - Item12 --> Item1; - Item12 --> Item2; - Item12 --> Item3; - Item12 --> Item4; - Item12 --> Item5; - Item13 --> Item1; - Item13 --> Item2; - Item13 --> Item3; - Item13 --> Item4; - Item13 --> Item5; - Item13 --> Item12; - Item15 --> Item11; - Item15 --> Item6; - Item15 --> Item14; - Item15 --> Item10; - Item15 --> Item12; - Item15 --> Item7; - Item15 --> Item8; - Item15 --> Item13; - Item15 --> Item9; - Item17 --> Item15; - Item16 --> Item1; - Item16 --> Item2; - Item16 --> Item3; - Item16 --> Item4; - Item16 --> Item5; - Item16 --> Item12; - Item16 --> Item13; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("NextResponse", #2), "NextResponse")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(2, ImportBinding(1)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(7, Normal), ItemId(8, Normal)]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(1, ImportOfModule)]"]; - N4["Items: [ItemId(2, ImportOfModule)]"]; - N5["Items: [ItemId(3, ImportOfModule)]"]; - N6["Items: [ItemId(4, ImportOfModule)]"]; - N7["Items: [ItemId(5, VarDeclarator(0))]"]; - N8["Items: [ItemId(6, VarDeclarator(0))]"]; - N0 --> N2; - N0 --> N3; - N0 --> N4; - N0 --> N5; - N0 --> N6; - N0 --> N7; - N0 --> N8; - N1 --> N7; - N1 --> N8; - N3 --> N2; - N4 --> N2; - N4 --> N3; - N5 --> N2; - N5 --> N3; - N5 --> N4; - N6 --> N2; - N6 --> N3; - N6 --> N4; - N6 --> N5; - N7 --> N2; - N7 --> N3; - N7 --> N4; - N7 --> N5; - N7 --> N6; - N8 --> N2; - N8 --> N3; - N8 --> N4; - N8 --> N5; - N8 --> N6; - N8 --> N7; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "NextResponse", - ): 1, - Exports: 9, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { INTERNALS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { REDIRECTS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -export { NextResponse }; -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders } from '../utils'; -import { validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} -export { stringifyCookie } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { validateURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ResponseCookies } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import '../../web/spec-extension/cookies'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import '../next-url'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import '../utils'; - -``` -## Part 5 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import './adapters/reflect'; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import './cookies'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -const INTERNALS = Symbol('internal response'); -export { INTERNALS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -export { REDIRECTS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -export { NextResponse } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export NextResponse" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "NextResponse", - ): 1, - Exports: 9, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { INTERNALS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { REDIRECTS } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -export { NextResponse }; -import { stringifyCookie } from '../../web/spec-extension/cookies'; -import { NextURL } from '../next-url'; -import { toNodeOutgoingHttpHeaders } from '../utils'; -import { validateURL } from '../utils'; -import { ReflectAdapter } from './adapters/reflect'; -import { ResponseCookies } from './cookies'; -function handleMiddlewareField(init, headers) { - var _init_request; - if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { - if (!(init.request.headers instanceof Headers)) { - throw new Error('request.headers must be an instance of Headers'); - } - const keys = []; - for (const [key, value] of init.request.headers){ - headers.set('x-middleware-request-' + key, value); - keys.push(key); - } - headers.set('x-middleware-override-headers', keys.join(',')); - } -} -class NextResponse extends Response { - constructor(body, init = {}){ - super(body, init); - const headers = this.headers; - const cookies = new ResponseCookies(headers); - const cookiesProxy = new Proxy(cookies, { - get (target, prop, receiver) { - switch(prop){ - case 'delete': - case 'set': - { - return (...args)=>{ - const result = Reflect.apply(target[prop], target, args); - const newHeaders = new Headers(headers); - if (result instanceof ResponseCookies) { - headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); - } - handleMiddlewareField(init, newHeaders); - return result; - }; - } - default: - return ReflectAdapter.get(target, prop, receiver); - } - } - }); - this[INTERNALS] = { - cookies: cookiesProxy, - url: init.url ? new NextURL(init.url, { - headers: toNodeOutgoingHttpHeaders(headers), - nextConfig: init.nextConfig - }) : undefined - }; - } - [Symbol.for('edge-runtime.inspect.custom')]() { - return { - cookies: this.cookies, - url: this.url, - body: this.body, - bodyUsed: this.bodyUsed, - headers: Object.fromEntries(this.headers), - ok: this.ok, - redirected: this.redirected, - status: this.status, - statusText: this.statusText, - type: this.type - }; - } - get cookies() { - return this[INTERNALS].cookies; - } - static json(body, init) { - const response = Response.json(body, init); - return new NextResponse(response.body, response); - } - static redirect(url, init) { - const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; - if (!REDIRECTS.has(status)) { - throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); - } - const initObj = typeof init === 'object' ? init : {}; - const headers = new Headers(initObj == null ? void 0 : initObj.headers); - headers.set('Location', validateURL(url)); - return new NextResponse(null, { - ...initObj, - headers, - status - }); - } - static rewrite(destination, init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-rewrite', validateURL(destination)); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } - static next(init) { - const headers = new Headers(init == null ? void 0 : init.headers); - headers.set('x-middleware-next', '1'); - handleMiddlewareField(init, headers); - return new NextResponse(null, { - ...init, - headers - }); - } -} -export { stringifyCookie } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { validateURL } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ResponseCookies } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -import '../../web/spec-extension/cookies'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import '../next-url'; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import '../utils'; - -``` -## Part 5 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import './adapters/reflect'; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import './cookies'; - -``` -## Part 7 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -const INTERNALS = Symbol('internal response'); -export { INTERNALS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const REDIRECTS = new Set([ - 301, - 302, - 303, - 307, - 308 -]); -export { REDIRECTS } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 9 -```js -export { NextResponse } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export NextResponse" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js deleted file mode 100644 index 3fafa47598599..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js +++ /dev/null @@ -1,214 +0,0 @@ -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; -let api; -// we want to allow users to use their own version of @opentelemetry/api if they -// want to, so we try to require it first, and if it fails we fall back to the -// version that is bundled with Next.js -// this is because @opentelemetry/api has to be synced with the version of -// @opentelemetry/tracing that is used, and we don't want to force users to use -// the version that is bundled with Next.js. -// the API is ~stable, so this should be fine -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -export class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -/** we use this map to propagate attributes from nested spans to the top span */ const rootSpanAttributesStore = new Map(); -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - /** - * Returns an instance to the trace with configured name. - * Since wrap / trace can be defined in any place prior to actual trace subscriber initialization, - * This should be lazily evaluated. - */ getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - // Active span is already set, too late to propagate. - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - // coerce options form overload - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - // Trying to get active scoped span to assign parent. If option specifies parent span manually, will try to use it. - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - // If there's error make sure it throws - return result.then((res)=>{ - span.end(); - // Need to pass down the promise result, - // it could be react stream response with error { error, stream } - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { getTracer, SpanStatusCode, SpanKind }; - -//# sourceMappingURL=tracer.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md deleted file mode 100644 index e8c8203b76367..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md +++ /dev/null @@ -1,1516 +0,0 @@ -# Items - -Count: 23 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Declares: `LogSpanAllowList` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; - -``` - -- Hoisted -- Declares: `NextVanillaSpanAllowlist` - -## Item 4: Stmt 1, `VarDeclarator(0)` - -```js -let api; - -``` - -- Declares: `api` -- Write: `api` - -## Item 5: Stmt 2, `Normal` - -```js -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` - -- Side effects -- Write: `api` - -## Item 6: Stmt 3, `VarDeclarator(0)` - -```js -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; - -``` - -- Declares: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` -- Reads: `api` -- Write: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` - -## Item 7: Stmt 4, `VarDeclarator(0)` - -```js -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; - -``` - -- Declares: `isPromise` -- Write: `isPromise` - -## Item 8: Stmt 5, `Normal` - -```js -export class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} - -``` - -- Declares: `BubbledError` -- Write: `BubbledError` - -## Item 9: Stmt 6, `Normal` - -```js -export function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} - -``` - -- Hoisted -- Declares: `isBubbledError` -- Reads (eventual): `BubbledError` -- Write: `isBubbledError` - -## Item 10: Stmt 7, `VarDeclarator(0)` - -```js -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; - -``` - -- Declares: `closeSpanWithError` -- Reads: `isBubbledError`, `SpanStatusCode` -- Write: `closeSpanWithError`, `SpanStatusCode` - -## Item 11: Stmt 8, `VarDeclarator(0)` - -```js -const rootSpanAttributesStore = new Map(); - -``` - -- Side effects -- Declares: `rootSpanAttributesStore` -- Write: `rootSpanAttributesStore` - -## Item 12: Stmt 9, `VarDeclarator(0)` - -```js -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); - -``` - -- Declares: `rootSpanIdKey` -- Reads: `api` -- Write: `rootSpanIdKey`, `api` - -## Item 13: Stmt 10, `VarDeclarator(0)` - -```js -let lastSpanId = 0; - -``` - -- Declares: `lastSpanId` -- Write: `lastSpanId` - -## Item 14: Stmt 11, `VarDeclarator(0)` - -```js -const getSpanId = ()=>lastSpanId++; - -``` - -- Declares: `getSpanId` -- Reads: `lastSpanId` -- Write: `getSpanId` - -## Item 15: Stmt 12, `VarDeclarator(0)` - -```js -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; - -``` - -- Declares: `clientTraceDataSetter` -- Write: `clientTraceDataSetter` - -## Item 16: Stmt 13, `Normal` - -```js -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} - -``` - -- Declares: `NextTracerImpl` -- Reads: `trace`, `context`, `propagation`, `clientTraceDataSetter`, `NextVanillaSpanAllowlist`, `ROOT_CONTEXT`, `getSpanId`, `rootSpanIdKey`, `rootSpanAttributesStore`, `LogSpanAllowList`, `closeSpanWithError`, `isPromise` -- Write: `trace`, `context`, `propagation`, `NextVanillaSpanAllowlist`, `rootSpanAttributesStore`, `LogSpanAllowList`, `NextTracerImpl` - -## Item 17: Stmt 14, `VarDeclarator(0)` - -```js -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); - -``` - -- Declares: `getTracer` -- Reads: `NextTracerImpl` -- Write: `getTracer` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; - Item9 --> Item8; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item7; - Item8; - Item9; - Item10; - Item11; - Item12; - Item13; - Item14; - Item15; - Item16; - Item17; - Item18; - Item18["ModuleEvaluation"]; - Item19; - Item19["export BubbledError"]; - Item20; - Item20["export isBubbledError"]; - Item21; - Item21["export getTracer"]; - Item22; - Item22["export SpanStatusCode"]; - Item23; - Item23["export SpanKind"]; - Item5 --> Item4; - Item5 --> Item1; - Item6 --> Item5; - Item6 --> Item4; - Item10 --> Item9; - Item10 --> Item6; - Item11 --> Item1; - Item11 --> Item5; - Item11 -.-> Item8; - Item12 --> Item5; - Item12 --> Item4; - Item12 -.-> Item6; - Item14 --> Item13; - Item16 --> Item6; - Item16 --> Item15; - Item16 --> Item3; - Item16 --> Item14; - Item16 --> Item12; - Item16 --> Item11; - Item16 --> Item2; - Item16 --> Item10; - Item16 --> Item7; - Item17 --> Item16; - Item19 --> Item8; - Item20 --> Item9; - Item21 --> Item17; - Item22 --> Item10; - Item22 --> Item6; - Item23 --> Item6; - Item9 --> Item8; - Item18 --> Item1; - Item18 --> Item5; - Item18 --> Item11; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("BubbledError", #2), "BubbledError"))]"]; - N2["Items: [ItemId(Export(("isBubbledError", #2), "isBubbledError"))]"]; - N3["Items: [ItemId(Export(("getTracer", #2), "getTracer")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(4, VarDeclarator(0)), ItemId(9, VarDeclarator(0)), ItemId(10, VarDeclarator(0)), ItemId(11, VarDeclarator(0)), ItemId(12, VarDeclarator(0)), ItemId(13, Normal), ItemId(14, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("SpanStatusCode", #2), "SpanStatusCode"))]"]; - N5["Items: [ItemId(Export(("SpanKind", #2), "SpanKind"))]"]; - N6["Items: [ItemId(0, ImportOfModule)]"]; - N7["Items: [ItemId(1, VarDeclarator(0))]"]; - N8["Items: [ItemId(2, Normal)]"]; - N9["Items: [ItemId(3, VarDeclarator(0))]"]; - N10["Items: [ItemId(5, Normal)]"]; - N11["Items: [ItemId(6, Normal)]"]; - N12["Items: [ItemId(7, VarDeclarator(0))]"]; - N13["Items: [ItemId(8, VarDeclarator(0))]"]; - N0 --> N6; - N0 --> N8; - N0 --> N13; - N1 --> N10; - N2 --> N11; - N3 --> N8; - N3 --> N7; - N3 --> N9; - N3 --> N13; - N3 --> N12; - N4 --> N12; - N4 --> N9; - N5 --> N9; - N8 --> N7; - N8 --> N6; - N9 --> N8; - N9 --> N7; - N11 --> N10; - N12 --> N11; - N12 --> N9; - N13 --> N6; - N13 --> N8; - N13 --> N10; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "isBubbledError", - ): 2, - Export( - "SpanKind", - ): 5, - Exports: 14, - Export( - "SpanStatusCode", - ): 4, - Export( - "BubbledError", - ): 1, - Export( - "getTracer", - ): 3, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { BubbledError }; - -``` -## Part 2 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { isBubbledError }; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import { closeSpanWithError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { getTracer as getTracer }; -import { LogSpanAllowList } from './constants'; -import { NextVanillaSpanAllowlist } from './constants'; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { isPromise } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { lastSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getTracer } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanStatusCode as SpanStatusCode }; - -``` -## Part 5 -```js -import { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanKind as SpanKind }; - -``` -## Part 6 -```js -import './constants'; - -``` -## Part 7 -```js -let api; -export { api } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` -## Part 9 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -export { context } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { propagation } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { trace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export { BubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -export { isBubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -const rootSpanAttributesStore = new Map(); -export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 14 -```js -export { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export BubbledError" -}; -export { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export isBubbledError" -}; -export { getTracer } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getTracer" -}; -export { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export SpanStatusCode" -}; -export { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export SpanKind" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "isBubbledError", - ): 2, - Export( - "SpanKind", - ): 5, - Exports: 14, - Export( - "SpanStatusCode", - ): 4, - Export( - "BubbledError", - ): 1, - Export( - "getTracer", - ): 3, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { BubbledError }; - -``` -## Part 2 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -export { isBubbledError }; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { context, propagation, trace, ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import { closeSpanWithError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { getTracer as getTracer }; -import { LogSpanAllowList } from './constants'; -import { NextVanillaSpanAllowlist } from './constants'; -const isPromise = (p)=>{ - return p !== null && typeof p === 'object' && typeof p.then === 'function'; -}; -const rootSpanIdKey = api.createContextKey('next.rootSpanId'); -let lastSpanId = 0; -const getSpanId = ()=>lastSpanId++; -const clientTraceDataSetter = { - set (carrier, key, value) { - carrier.push({ - key, - value - }); - } -}; -class NextTracerImpl { - getTracerInstance() { - return trace.getTracer('next.js', '0.0.1'); - } - getContext() { - return context; - } - getTracePropagationData() { - const activeContext = context.active(); - const entries = []; - propagation.inject(activeContext, entries, clientTraceDataSetter); - return entries; - } - getActiveScopeSpan() { - return trace.getSpan(context == null ? void 0 : context.active()); - } - withPropagatedContext(carrier, fn, getter) { - const activeContext = context.active(); - if (trace.getSpanContext(activeContext)) { - return fn(); - } - const remoteContext = propagation.extract(activeContext, carrier, getter); - return context.with(remoteContext, fn); - } - trace(...args) { - var _trace_getSpanContext; - const [type, fnOrOptions, fnOrEmpty] = args; - const { fn, options } = typeof fnOrOptions === 'function' ? { - fn: fnOrOptions, - options: {} - } : { - fn: fnOrEmpty, - options: { - ...fnOrOptions - } - }; - const spanName = options.spanName ?? type; - if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { - return fn(); - } - let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - let isRootSpan = false; - if (!spanContext) { - spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; - isRootSpan = true; - } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { - isRootSpan = true; - } - const spanId = getSpanId(); - options.attributes = { - 'next.span_name': spanName, - 'next.span_type': type, - ...options.attributes - }; - return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ - const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; - const onCleanup = ()=>{ - rootSpanAttributesStore.delete(spanId); - if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { - performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { - start: startTime, - end: performance.now() - }); - } - }; - if (isRootSpan) { - rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); - } - try { - if (fn.length > 1) { - return fn(span, (err)=>closeSpanWithError(span, err)); - } - const result = fn(span); - if (isPromise(result)) { - return result.then((res)=>{ - span.end(); - return res; - }).catch((err)=>{ - closeSpanWithError(span, err); - throw err; - }).finally(onCleanup); - } else { - span.end(); - onCleanup(); - } - return result; - } catch (err) { - closeSpanWithError(span, err); - onCleanup(); - throw err; - } - })); - } - wrap(...args) { - const tracer = this; - const [name, options, fn] = args.length === 3 ? args : [ - args[0], - {}, - args[1] - ]; - if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { - return fn; - } - return function() { - let optionsObj = options; - if (typeof optionsObj === 'function' && typeof fn === 'function') { - optionsObj = optionsObj.apply(this, arguments); - } - const lastArgId = arguments.length - 1; - const cb = arguments[lastArgId]; - if (typeof cb === 'function') { - const scopeBoundCb = tracer.getContext().bind(context.active(), cb); - return tracer.trace(name, optionsObj, (_span, done)=>{ - arguments[lastArgId] = function(err) { - done == null ? void 0 : done(err); - return scopeBoundCb.apply(this, arguments); - }; - return fn.apply(this, arguments); - }); - } else { - return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); - } - }; - } - startSpan(...args) { - const [type, options] = args; - const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); - return this.getTracerInstance().startSpan(type, options, spanContext); - } - getSpanContext(parentSpan) { - const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; - return spanContext; - } - getRootSpanAttributes() { - const spanId = context.active().getValue(rootSpanIdKey); - return rootSpanAttributesStore.get(spanId); - } -} -const getTracer = (()=>{ - const tracer = new NextTracerImpl(); - return ()=>tracer; -})(); -export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { isPromise } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { lastSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getSpanId } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getTracer } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanStatusCode as SpanStatusCode }; - -``` -## Part 5 -```js -import { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { SpanKind as SpanKind }; - -``` -## Part 6 -```js -import './constants'; - -``` -## Part 7 -```js -let api; -export { api } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 8 -```js -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -if (process.env.NEXT_RUNTIME === 'edge') { - api = require('@opentelemetry/api'); -} else { - try { - api = require('@opentelemetry/api'); - } catch (err) { - api = require('next/dist/compiled/@opentelemetry/api'); - } -} - -``` -## Part 9 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import { api } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; -export { context } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { propagation } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { trace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { SpanKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -class BubbledError extends Error { - constructor(bubble, result){ - super(); - this.bubble = bubble; - this.result = result; - } -} -export { BubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -import { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -function isBubbledError(error) { - if (typeof error !== 'object' || error === null) return false; - return error instanceof BubbledError; -} -export { isBubbledError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 12 -```js -import { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const closeSpanWithError = (span, error)=>{ - if (isBubbledError(error) && error.bubble) { - span.setAttribute('next.bubble', true); - } else { - if (error) { - span.recordException(error); - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error == null ? void 0 : error.message - }); - } - span.end(); -}; -export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 13 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -const rootSpanAttributesStore = new Map(); -export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 14 -```js -export { BubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export BubbledError" -}; -export { isBubbledError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export isBubbledError" -}; -export { getTracer } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getTracer" -}; -export { SpanStatusCode } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export SpanStatusCode" -}; -export { SpanKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export SpanKind" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js deleted file mode 100644 index dbdeaab4b2c2a..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js +++ /dev/null @@ -1,9 +0,0 @@ -import Stream from 'node:stream'; - -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; - -function fetch(){ - -} - -export default fetch; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md deleted file mode 100644 index e5e48962003c7..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md +++ /dev/null @@ -1,278 +0,0 @@ -# Items - -Count: 7 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import Stream from 'node:stream'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import Stream from 'node:stream'; - -``` - -- Hoisted -- Declares: `Stream` - -## Item 3: Stmt 1, `VarDeclarator(0)` - -```js -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; - -``` - -- Declares: `streamDestructionSupported` -- Reads: `Stream` -- Write: `streamDestructionSupported`, `Stream` - -## Item 4: Stmt 2, `Normal` - -```js -function fetch() {} - -``` - -- Hoisted -- Declares: `fetch` -- Write: `fetch` - -## Item 5: Stmt 3, `Normal` - -```js -export default fetch; - -``` - -- Side effects -- Declares: `__TURBOPACK__default__export__` -- Reads: `fetch` -- Write: `__TURBOPACK__default__export__` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item6; - Item6["ModuleEvaluation"]; - Item7; - Item7["export default"]; - Item3 --> Item2; - Item5 --> Item4; - Item5 --> Item1; - Item7 --> Item5; - Item6 --> Item1; - Item6 --> Item5; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #4), "default"))]"]; - N2["Items: [ItemId(0, ImportOfModule)]"]; - N3["Items: [ItemId(2, Normal), ItemId(3, Normal)]"]; - N0 --> N2; - N0 --> N3; - N1 --> N3; - N3 --> N2; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, - Exports: 4, -} -``` - - -# Modules (dev) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import 'node:stream'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -function fetch() {} -const __TURBOPACK__default__export__ = fetch; -export { fetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "default", - ): 1, - Exports: 4, -} -``` - - -# Modules (prod) -## Part 0 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` -## Part 1 -```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { __TURBOPACK__default__export__ as default }; - -``` -## Part 2 -```js -import 'node:stream'; - -``` -## Part 3 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -function fetch() {} -const __TURBOPACK__default__export__ = fetch; -export { fetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 4 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md index 6cc6ecc74a347..77cd4a23f2131 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md @@ -50,7 +50,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 1, } ``` @@ -61,10 +60,6 @@ graph TD "module evaluation"; process.turbopack = {}; -``` -## Part 1 -```js - ``` ## Merged (module eval) ```js @@ -77,7 +72,6 @@ process.turbopack = {}; ``` { ModuleEvaluation: 0, - Exports: 1, } ``` @@ -88,10 +82,6 @@ process.turbopack = {}; "module evaluation"; process.turbopack = {}; -``` -## Part 1 -```js - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js deleted file mode 100644 index 0d99a1926bc63..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { DEFAULT_ENVIRONMENT, parseEnvironment, } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -/** - * Gets the environment variables - */ -export function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md deleted file mode 100644 index 0ff6ef1b2b064..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md +++ /dev/null @@ -1,355 +0,0 @@ -# Items - -Count: 10 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Declares: `DEFAULT_ENVIRONMENT` - -## Item 3: Stmt 0, `ImportBinding(1)` - -```js -import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; - -``` - -- Hoisted -- Declares: `parseEnvironment` - -## Item 4: Stmt 1, `ImportOfModule` - -```js -import { _globalThis } from './globalThis'; - -``` - -- Hoisted -- Side effects - -## Item 5: Stmt 1, `ImportBinding(0)` - -```js -import { _globalThis } from './globalThis'; - -``` - -- Hoisted -- Declares: `_globalThis` - -## Item 6: Stmt 2, `Normal` - -```js -export function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} - -``` - -- Hoisted -- Declares: `getEnv` -- Reads (eventual): `parseEnvironment`, `_globalThis`, `DEFAULT_ENVIRONMENT` -- Write: `getEnv` - -## Item 7: Stmt 3, `Normal` - -```js -export function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} - -``` - -- Hoisted -- Declares: `getEnvWithoutDefaults` -- Reads (eventual): `parseEnvironment`, `_globalThis` -- Write: `getEnvWithoutDefaults` - -# Phase 1 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; - Item6 --> Item4; - Item6 --> Item5; - Item6 --> Item3; - Item7 --> Item4; - Item7 --> Item5; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item3; - Item4; - Item2; - Item5; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export getEnv"]; - Item10; - Item10["export getEnvWithoutDefaults"]; - Item2 --> Item1; - Item9 --> Item6; - Item10 --> Item7; - Item6 --> Item4; - Item6 --> Item5; - Item6 --> Item3; - Item7 --> Item4; - Item7 --> Item5; - Item8 --> Item1; - Item8 --> Item2; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("getEnv", #2), "getEnv")), ItemId(0, ImportBinding(0)), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(2, Normal)]"]; - N2["Items: [ItemId(Export(("getEnvWithoutDefaults", #2), "getEnvWithoutDefaults")), ItemId(0, ImportBinding(1)), ItemId(1, ImportBinding(0)), ItemId(3, Normal)]"]; - N1 --> N2; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 3, - Export( - "getEnv", - ): 1, - Export( - "getEnvWithoutDefaults", - ): 2, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import '../../utils/environment'; -import './globalThis'; - -``` -## Part 1 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -export { getEnv }; -import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnv } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { getEnvWithoutDefaults }; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -export { getEnv } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getEnv" -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getEnvWithoutDefaults" -}; - -``` -## Merged (module eval) -```js -import '../../utils/environment'; -import './globalThis'; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 3, - Export( - "getEnv", - ): 1, - Export( - "getEnvWithoutDefaults", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import '../../utils/environment'; -import './globalThis'; - -``` -## Part 1 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -export { getEnv }; -import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnv() { - var globalEnv = parseEnvironment(_globalThis); - return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); -} -export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnv } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { getEnvWithoutDefaults }; -import { parseEnvironment } from '../../utils/environment'; -import { _globalThis } from './globalThis'; -function getEnvWithoutDefaults() { - return parseEnvironment(_globalThis); -} -export { parseEnvironment } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { _globalThis } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -export { getEnv } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getEnv" -}; -export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getEnvWithoutDefaults" -}; - -``` -## Merged (module eval) -```js -import '../../utils/environment'; -import './globalThis'; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js deleted file mode 100644 index 3fa42f80742e1..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js +++ /dev/null @@ -1,9 +0,0 @@ -import { NextResponse } from "next/server"; - -export const GET = (req) => { - return NextResponse.json({ - pathname: req.nextUrl.pathname, - }); -}; - -export const runtime = "edge"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md deleted file mode 100644 index c6c9a53751928..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md +++ /dev/null @@ -1,252 +0,0 @@ -# Items - -Count: 7 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { NextResponse } from "next/server"; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { NextResponse } from "next/server"; - -``` - -- Hoisted -- Declares: `NextResponse` - -## Item 3: Stmt 1, `VarDeclarator(0)` - -```js -export const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; - -``` - -- Declares: `GET` -- Reads: `NextResponse` -- Write: `GET`, `NextResponse` - -## Item 4: Stmt 2, `VarDeclarator(0)` - -```js -export const runtime = "edge"; - -``` - -- Declares: `runtime` -- Write: `runtime` - -# Phase 1 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item2; - Item3; - Item4; - Item5; - Item5["ModuleEvaluation"]; - Item6; - Item6["export GET"]; - Item7; - Item7["export runtime"]; - Item3 --> Item2; - Item6 --> Item3; - Item7 --> Item4; - Item5 --> Item1; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("runtime", #2), "runtime")), ItemId(2, VarDeclarator(0))]"]; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 3, - Export( - "runtime", - ): 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import "next/server"; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from "next/server"; -const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { runtime }; -const runtime = "edge"; -export { runtime } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -export { GET } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export GET" -}; -export { runtime } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export runtime" -}; - -``` -## Merged (module eval) -```js -import "next/server"; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 3, - Export( - "runtime", - ): 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import "next/server"; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from "next/server"; -const GET = (req)=>{ - return NextResponse.json({ - pathname: req.nextUrl.pathname - }); -}; -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { runtime }; -const runtime = "edge"; -export { runtime } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 3 -```js -export { GET } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export GET" -}; -export { runtime } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export runtime" -}; - -``` -## Merged (module eval) -```js -import "next/server"; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md index 68fb073d93c3c..b786b9b06e654 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md @@ -98,7 +98,6 @@ graph TD Export( "RouteKind", ): 1, - Exports: 4, } ``` @@ -143,13 +142,6 @@ import { RouteKind } from "__TURBOPACK_PART__" assert { RouteKind["APP_ROUTE"] = "APP_ROUTE"; })(RouteKind || (RouteKind = {})); -``` -## Part 4 -```js -export { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export RouteKind" -}; - ``` ## Merged (module eval) ```js @@ -167,7 +159,6 @@ import "__TURBOPACK_PART__" assert { Export( "RouteKind", ): 1, - Exports: 4, } ``` @@ -212,13 +203,6 @@ import { RouteKind } from "__TURBOPACK_PART__" assert { RouteKind["APP_ROUTE"] = "APP_ROUTE"; })(RouteKind || (RouteKind = {})); -``` -## Part 4 -```js -export { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export RouteKind" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md index 271f9598383b2..ac5007085d28d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `random`, `order` +- Write: `shared`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -134,7 +134,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -169,7 +168,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -204,7 +202,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -219,21 +216,19 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a"))]"]; + N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; - N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N9; - N3 --> N9; + N2 --> N7; N3 --> N7; N5 --> N4; N6 --> N5; @@ -244,7 +239,6 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; - N9 --> N7; ``` # Entrypoints @@ -254,7 +248,6 @@ graph TD Export( "order", ): 1, - Exports: 10, Export( "b", ): 3, @@ -293,17 +286,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -380,33 +377,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js @@ -430,7 +400,6 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, - Exports: 10, Export( "b", ): 3, @@ -469,17 +438,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -556,33 +529,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md index 32f1a2d2b41de..c20663c4e6941 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md @@ -66,7 +66,7 @@ const shared = { - Declares: `shared` - Reads: `value`, `value2`, `value3` -- Write: `shared`, `value`, `value2`, `value3` +- Write: `shared` ## Item 7: Stmt 6, `Normal` @@ -90,7 +90,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 9: Stmt 8, `VarDeclarator(0)` @@ -104,7 +104,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -163,10 +163,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -208,10 +205,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -253,10 +247,7 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; - Item8 -.-> Item7; - Item9 --> Item8; Item9 --> Item6; - Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; Item10 --> Item1; @@ -269,8 +260,8 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("a", #2), "a"))]"]; + N0["Items: [ItemId(ModuleEvaluation), ItemId(6, Normal)]"]; + N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(7, VarDeclarator(0))]"]; N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(8, VarDeclarator(0))]"]; N3["Items: [ItemId(0, Normal)]"]; N4["Items: [ItemId(1, VarDeclarator(0))]"]; @@ -278,18 +269,14 @@ graph TD N6["Items: [ItemId(3, Normal)]"]; N7["Items: [ItemId(4, VarDeclarator(0))]"]; N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N9["Items: [ItemId(6, Normal)]"]; - N10["Items: [ItemId(7, VarDeclarator(0))]"]; N0 --> N3; N0 --> N4; N0 --> N5; N0 --> N6; N0 --> N7; - N0 --> N9; - N1 --> N10; - N2 --> N10; + N0 --> N8; + N1 --> N8; N2 --> N8; - N2 --> N9; N4 --> N3; N5 --> N3; N5 --> N4; @@ -303,21 +290,12 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N7; - N9 --> N8; - N9 --> N3; - N9 --> N4; - N9 --> N5; - N9 --> N6; - N9 --> N7; - N10 --> N8; - N10 --> N9; ``` # Entrypoints ``` { ModuleEvaluation: 0, - Exports: 11, Export( "b", ): 2, @@ -346,31 +324,33 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; "module evaluation"; +console.log(shared); ``` ## Part 1 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; export { b }; const b = { shared, @@ -466,11 +446,8 @@ export { shared } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 9 +## Merged (module eval) ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; @@ -486,57 +463,11 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -console.log(shared); - -``` -## Part 10 -```js import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 11 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - -``` -## Merged (module eval) -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; "module evaluation"; +console.log(shared); ``` # Entrypoints @@ -544,7 +475,6 @@ import "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 10, Export( "b", ): 2, @@ -582,17 +512,21 @@ console.log(shared); ``` ## Part 1 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; @@ -690,30 +624,6 @@ export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md index 271f9598383b2..ac5007085d28d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `random`, `order` +- Write: `shared`, `order` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a`, `shared` +- Write: `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b`, `shared` +- Write: `b` # Phase 1 ```mermaid @@ -134,7 +134,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -169,7 +168,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -204,7 +202,6 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; - Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -219,21 +216,19 @@ graph TD graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a"))]"]; + N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; N4["Items: [ItemId(0, VarDeclarator(0))]"]; N5["Items: [ItemId(1, Normal)]"]; N6["Items: [ItemId(2, VarDeclarator(0))]"]; N7["Items: [ItemId(3, VarDeclarator(0))]"]; N8["Items: [ItemId(4, Normal)]"]; - N9["Items: [ItemId(5, VarDeclarator(0))]"]; N0 --> N5; N0 --> N6; N0 --> N8; N1 --> N8; N1 --> N4; - N2 --> N9; - N3 --> N9; + N2 --> N7; N3 --> N7; N5 --> N4; N6 --> N5; @@ -244,7 +239,6 @@ graph TD N8 --> N4; N8 --> N5; N8 --> N6; - N9 --> N7; ``` # Entrypoints @@ -254,7 +248,6 @@ graph TD Export( "order", ): 1, - Exports: 10, Export( "b", ): 3, @@ -293,17 +286,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -380,33 +377,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js @@ -430,7 +400,6 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, - Exports: 10, Export( "b", ): 3, @@ -469,17 +438,21 @@ export { order }; ``` ## Part 2 ```js -import { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; export { a }; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -556,33 +529,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 9 -```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const a = { - shared, - a: "aaaaaaaaaaa" -}; -export { a } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md index 458f65fd2d252..c734bad84fb88 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md @@ -88,7 +88,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 3, Export( "b", ): 2, @@ -122,16 +121,6 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js @@ -143,7 +132,6 @@ export { b } from "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 3, Export( "b", ): 2, @@ -177,16 +165,6 @@ export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 3 -```js -export { a } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export a" -}; -export { b } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export b" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md index b9f46f6616847..bd41e8eaf0706 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md @@ -130,7 +130,6 @@ graph TD ``` { ModuleEvaluation: 0, - Exports: 4, Export( "DOG", ): 1, @@ -182,16 +181,6 @@ export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { DOG } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export DOG" -}; -export { CHIMERA } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export CHIMERA" -}; - ``` ## Merged (module eval) ```js @@ -203,7 +192,6 @@ export { CHIMERA } from "__TURBOPACK_PART__" assert { ``` { ModuleEvaluation: 0, - Exports: 4, Export( "DOG", ): 1, @@ -255,16 +243,6 @@ export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { DOG } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export DOG" -}; -export { CHIMERA } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export CHIMERA" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md index bcac867d26d06..7b1d2a8064a9b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md @@ -266,7 +266,7 @@ export const routeModule = new PagesRouteModule({ - Declares: `routeModule` - Reads: `PagesRouteModule`, `RouteKind`, `App`, `Document`, `userland` -- Write: `routeModule`, `RouteKind`, `App`, `Document`, `userland` +- Write: `routeModule`, `RouteKind` # Phase 1 ```mermaid @@ -438,18 +438,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -563,18 +551,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -688,18 +664,6 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; - Item24 -.-> Item13; - Item24 -.-> Item14; - Item24 -.-> Item15; - Item24 -.-> Item16; - Item24 -.-> Item17; - Item24 -.-> Item18; - Item24 -.-> Item19; - Item24 -.-> Item20; - Item24 -.-> Item21; - Item24 -.-> Item22; - Item24 -.-> Item23; - Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -718,22 +682,23 @@ graph TD Item25 --> Item5; Item25 --> Item6; Item25 --> Item13; + Item26 --> Item13; ``` # Final ```mermaid graph TD N0["Items: [ItemId(ModuleEvaluation)]"]; N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; - N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps"))]"]; - N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths"))]"]; - N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps"))]"]; - N5["Items: [ItemId(Export(("config", #2), "config"))]"]; - N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals"))]"]; - N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps"))]"]; - N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths"))]"]; - N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams"))]"]; - N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps"))]"]; - N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps"))]"]; + N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; + N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("config", #2), "config")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; + N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; + N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; + N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; + N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N12["Items: [ItemId(Export(("routeModule", #2), "routeModule")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(17, VarDeclarator(0))]"]; N13["Items: [ItemId(0, ImportOfModule)]"]; N14["Items: [ItemId(1, ImportOfModule)]"]; @@ -742,16 +707,6 @@ graph TD N17["Items: [ItemId(4, ImportOfModule)]"]; N18["Items: [ItemId(5, ImportOfModule)]"]; N19["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(6, Normal)]"]; - N20["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; - N21["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N22["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; - N23["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; - N24["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; - N25["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; - N26["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; - N27["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; - N28["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; - N29["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; N0 --> N13; N0 --> N14; N0 --> N15; @@ -760,27 +715,17 @@ graph TD N0 --> N18; N0 --> N19; N1 --> N19; - N2 --> N20; - N3 --> N21; - N4 --> N22; - N5 --> N23; - N6 --> N24; - N7 --> N25; - N8 --> N26; - N9 --> N27; - N10 --> N28; - N11 --> N29; - N12 --> N29; + N2 --> N19; + N3 --> N19; + N4 --> N19; + N5 --> N19; + N6 --> N19; + N7 --> N19; + N8 --> N19; + N9 --> N19; + N10 --> N19; + N11 --> N19; N12 --> N19; - N12 --> N20; - N12 --> N21; - N12 --> N22; - N12 --> N23; - N12 --> N24; - N12 --> N25; - N12 --> N26; - N12 --> N27; - N12 --> N28; N14 --> N13; N15 --> N13; N15 --> N14; @@ -796,22 +741,12 @@ graph TD N18 --> N15; N18 --> N16; N18 --> N17; - N19 --> N29; N19 --> N13; N19 --> N14; N19 --> N15; N19 --> N16; N19 --> N17; N19 --> N18; - N20 --> N29; - N21 --> N29; - N22 --> N29; - N23 --> N29; - N24 --> N29; - N25 --> N29; - N26 --> N29; - N27 --> N29; - N28 --> N29; ``` # Entrypoints @@ -845,7 +780,6 @@ graph TD Export( "unstable_getStaticProps", ): 7, - Exports: 30, Export( "default", ): 1, @@ -896,119 +830,209 @@ export { __TURBOPACK__default__export__ as default }; ``` ## Part 2 ```js -import { getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 20 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getStaticProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticProps = hoist(userland, 'getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 3 ```js -import { getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 21 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getStaticPaths }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 4 ```js -import { getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 22 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { getServerSideProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 5 ```js -import { config } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 23 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { config }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const config = hoist(userland, 'config'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { config } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 6 ```js -import { reportWebVitals } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 24 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { reportWebVitals }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 7 ```js -import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 25 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 8 ```js -import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 26 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticPaths }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 9 ```js -import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 27 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getStaticParams }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 10 ```js -import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 28 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getServerProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 11 ```js -import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; export { unstable_getServerSideProps }; +import { hoist } from './helpers'; +import * as userland from 'VAR_USERLAND'; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 12 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 19 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 20 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 21 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 22 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 23 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 24 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 25 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 26 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 27 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 28 -}; export { routeModule }; import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; import { RouteKind } from '../../server/future/route-kind'; @@ -1126,9 +1150,6 @@ import 'VAR_USERLAND'; ``` ## Part 19 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 13 }; @@ -1160,233 +1181,6 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 20 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 21 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 22 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 23 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { config } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 24 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 25 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 26 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 27 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 28 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 29 -}; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 29 -```js -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 30 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; -export { getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getStaticProps" -}; -export { getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getStaticPaths" -}; -export { getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getServerSideProps" -}; -export { config } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export config" -}; -export { reportWebVitals } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export reportWebVitals" -}; -export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticProps" -}; -export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticPaths" -}; -export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticParams" -}; -export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getServerProps" -}; -export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getServerSideProps" -}; -export { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export routeModule" -}; - ``` ## Merged (module eval) ```js @@ -1446,7 +1240,6 @@ import "__TURBOPACK_PART__" assert { Export( "unstable_getStaticProps", ): 7, - Exports: 20, Export( "default", ): 1, @@ -1848,46 +1641,6 @@ export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 20 -```js -export { default } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export default" -}; -export { getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getStaticProps" -}; -export { getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getStaticPaths" -}; -export { getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export getServerSideProps" -}; -export { config } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export config" -}; -export { reportWebVitals } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export reportWebVitals" -}; -export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticProps" -}; -export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticPaths" -}; -export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getStaticParams" -}; -export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getServerProps" -}; -export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export unstable_getServerSideProps" -}; -export { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export routeModule" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md index a682a132f414d..867b54c937d69 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md @@ -274,14 +274,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -334,14 +331,11 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; - Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; - Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; - Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` @@ -368,11 +362,9 @@ graph TD N2 --> N6; N3 --> N10; N3 --> N9; - N3 --> N5; N4 --> N6; N4 --> N8; N4 --> N1; - N4 --> N5; N6 --> N5; N7 --> N5; N7 --> N6; @@ -383,7 +375,6 @@ graph TD N9 --> N6; N9 --> N8; N10 --> N9; - N10 --> N5; ``` # Entrypoints @@ -393,7 +384,6 @@ graph TD Export( "external1", ): 3, - Exports: 11, Export( "foo", ): 2, @@ -458,9 +448,6 @@ import { internal } from "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; function external1() { return internal() + foobar; @@ -481,9 +468,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -563,9 +547,6 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; function internal() { return upper(foobar); @@ -577,22 +558,6 @@ export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 11 -```js -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js @@ -625,7 +590,6 @@ export { upper } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, - Exports: 8, Export( "foo", ): 2, @@ -685,9 +649,6 @@ export { foo } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external1 }; import { upper } from "module"; function internal() { @@ -709,9 +670,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; export { external2 }; function external2() { foobar += "."; @@ -751,22 +709,6 @@ import { foobar } from "__TURBOPACK_PART__" assert { }; foobar += "foo"; -``` -## Part 8 -```js -export { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foobar" -}; -export { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export foo" -}; -export { external1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external1" -}; -export { external2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export external2" -}; - ``` ## Merged (module eval) ```js @@ -793,7 +735,6 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, - Exports: 8, Export( "foo", ): 2, @@ -812,9 +753,6 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; export { external1 }; function internal() { @@ -842,7 +780,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { Export( "external1", ): 3, - Exports: 8, Export( "foo", ): 2, @@ -861,9 +798,6 @@ export { external1 } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; import { upper } from "module"; export { external1 }; function internal() { diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md index c36079b04971c..2324a75bfe17d 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md @@ -115,13 +115,12 @@ graph TD ``` { ModuleEvaluation: 0, - Export( - "effect", - ): 2, - Exports: 4, Export( "effects", ): 1, + Export( + "effect", + ): 2, } ``` @@ -165,16 +164,6 @@ export { effects } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export effects" -}; -export { effect } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export effect" -}; - ``` ## Merged (module eval) ```js @@ -187,13 +176,12 @@ await Promise.resolve(); ``` { ModuleEvaluation: 0, - Export( - "effect", - ): 2, - Exports: 4, Export( "effects", ): 1, + Export( + "effect", + ): 2, } ``` @@ -234,16 +222,6 @@ export { effects } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 4 -```js -export { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export effects" -}; -export { effect } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export effect" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js deleted file mode 100644 index fd7505a005999..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js +++ /dev/null @@ -1,10 +0,0 @@ -import { NextResponse } from 'next/server' -import { ClientComponent } from '../../ClientComponent' -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent' - -export function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent, - }) -} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md deleted file mode 100644 index 20fc2ac084576..0000000000000 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md +++ /dev/null @@ -1,298 +0,0 @@ -# Items - -Count: 9 - -## Item 1: Stmt 0, `ImportOfModule` - -```js -import { NextResponse } from 'next/server'; - -``` - -- Hoisted -- Side effects - -## Item 2: Stmt 0, `ImportBinding(0)` - -```js -import { NextResponse } from 'next/server'; - -``` - -- Hoisted -- Declares: `NextResponse` - -## Item 3: Stmt 1, `ImportOfModule` - -```js -import { ClientComponent } from '../../ClientComponent'; - -``` - -- Hoisted -- Side effects - -## Item 4: Stmt 1, `ImportBinding(0)` - -```js -import { ClientComponent } from '../../ClientComponent'; - -``` - -- Hoisted -- Declares: `ClientComponent` - -## Item 5: Stmt 2, `ImportOfModule` - -```js -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; - -``` - -- Hoisted -- Side effects - -## Item 6: Stmt 2, `ImportBinding(0)` - -```js -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; - -``` - -- Hoisted -- Declares: `MyModuleClientComponent` - -## Item 7: Stmt 3, `Normal` - -```js -export function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} - -``` - -- Hoisted -- Declares: `GET` -- Reads (eventual): `NextResponse`, `ClientComponent`, `MyModuleClientComponent` -- Write: `GET` -- Write (eventual): `NextResponse` - -# Phase 1 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; -``` -# Phase 2 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; -``` -# Phase 3 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; - Item7 --> Item4; - Item7 --> Item5; - Item7 --> Item6; -``` -# Phase 4 -```mermaid -graph TD - Item1; - Item4; - Item2; - Item5; - Item3; - Item6; - Item7; - Item8; - Item8["ModuleEvaluation"]; - Item9; - Item9["export GET"]; - Item2 --> Item1; - Item3 --> Item1; - Item3 --> Item2; - Item9 --> Item7; - Item7 --> Item4; - Item7 --> Item5; - Item7 --> Item6; - Item8 --> Item1; - Item8 --> Item2; - Item8 --> Item3; -``` -# Final -```mermaid -graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule), ItemId(2, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("GET", #2), "GET")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (dev) -## Part 0 -```js -"module evaluation"; -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from 'next/server'; -import { ClientComponent } from '../../ClientComponent'; -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; -function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { GET } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export GET" -}; - -``` -## Merged (module eval) -```js -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; -"module evaluation"; - -``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Exports: 2, - Export( - "GET", - ): 1, -} -``` - - -# Modules (prod) -## Part 0 -```js -"module evaluation"; -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; - -``` -## Part 1 -```js -export { GET }; -import { NextResponse } from 'next/server'; -import { ClientComponent } from '../../ClientComponent'; -import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; -function GET() { - return NextResponse.json({ - clientComponent: typeof ClientComponent, - myModuleClientComponent: typeof MyModuleClientComponent - }); -} -export { NextResponse } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { ClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { GET } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - -``` -## Part 2 -```js -export { GET } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export GET" -}; - -``` -## Merged (module eval) -```js -import 'next/server'; -import '../../ClientComponent'; -import 'my-module/MyModuleClientComponent'; -"module evaluation"; - -``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md index 28ecbdfae8a6a..052eb476d8e5f 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md @@ -171,7 +171,6 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; - Item2 --> Item1; Item2 -.-> Item9; ``` # Phase 4 @@ -208,7 +207,6 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; - Item2 --> Item1; Item2 -.-> Item9; Item8 --> Item3; Item8 --> Item4; @@ -235,7 +233,6 @@ graph TD N1 --> N9; N1 --> N4; N2 --> N9; - N2 --> N4; N2 --> N1; N3 --> N8; N5 --> N4; @@ -258,7 +255,6 @@ graph TD Export( "order", ): 1, - Exports: 10, Export( "func", ): 2, @@ -303,9 +299,6 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 1 }; @@ -402,19 +395,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { func } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export func" -}; -export { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export shared" -}; - ``` ## Merged (module eval) ```js @@ -441,7 +421,6 @@ import "__TURBOPACK_PART__" assert { Export( "order", ): 1, - Exports: 10, Export( "func", ): 2, @@ -486,9 +465,6 @@ export { order }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; export { func }; function func() { order.push("d"); @@ -582,19 +558,6 @@ import "__TURBOPACK_PART__" assert { }; order.push("c"); -``` -## Part 10 -```js -export { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export order" -}; -export { func } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export func" -}; -export { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: "export shared" -}; - ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js index c719e831a0c35..b496ad7226a0b 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map index 76543693cb889..8771340104287 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG,qOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js similarity index 91% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js index 61beca3561f02..d6d4fa4d32efa 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -150,14 +150,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; @@ -200,18 +198,34 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__, - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__, + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; ; })()), @@ -246,4 +260,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map index 08028c332a04d..20adfc3eda1b6 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_e0a7d8._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map @@ -20,16 +20,18 @@ {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 162, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 167, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 184, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 200, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 215, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 220, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, - {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 239, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 244, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 165, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 177, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 198, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 219, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js similarity index 90% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js index 0e8d24b6eaeed..281bddcb7f575 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js", { "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; @@ -191,19 +189,35 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; "module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__.cat); +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__.cat); ; })()), @@ -219,4 +233,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map similarity index 89% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map index bd930bbd92dfd..a64d074b155f2 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_87afd8._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map @@ -18,14 +18,16 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,8NAAI,GAAG"}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 217, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAI,GAAG"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 226, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 231, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js index 7bad58454328f..b829c74cc07a9 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map index 3156e34ae11ad..729da17d345fd 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map @@ -18,14 +18,14 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG,6OAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 211, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, - {"offset": {"line": 212, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, + {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js index 388520019ef8a..00dd5c50b44f6 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js @@ -141,14 +141,12 @@ __turbopack_esm__({ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; -; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; } ; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map index f088827fe8299..21f0e7a600376 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map @@ -18,12 +18,12 @@ {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG,gPAAA,CAAA,MAAG;AAClB"}}, - {"offset": {"line": 153, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 170, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 191, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 196, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 207, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG;AACf"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-wasm/src/module_asset.rs b/crates/turbopack-wasm/src/module_asset.rs index da3381b6923e4..c357e7abaf597 100644 --- a/crates/turbopack-wasm/src/module_asset.rs +++ b/crates/turbopack-wasm/src/module_asset.rs @@ -19,6 +19,7 @@ use turbopack_ecmascript::{ EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, references::async_module::OptionAsyncModule, + EcmascriptModuleAsset, }; use crate::{ @@ -61,43 +62,24 @@ impl WebAssemblyModuleAsset { } #[turbo_tasks::function] - async fn loader_as_module(self: Vc) -> Result>> { - let this = self.await?; - let query = &*this.source.ident().query().await?; + async fn loader(&self) -> Result> { + let query = &*self.source.ident().query().await?; let loader_source = if query == "?module" { - compiling_loader_source(this.source) + compiling_loader_source(self.source) } else { - instantiating_loader_source(this.source) + instantiating_loader_source(self.source) }; - let module = this.asset_context.process( + let module = self.asset_context.process( loader_source, Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(this.source, this.asset_context)), + "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(self.source, self.asset_context)), }))), ).module(); - Ok(module) - } - #[turbo_tasks::function] - async fn loader_as_resolve_origin(self: Vc) -> Result>> { - let module = self.loader_as_module(); - - let Some(esm_asset) = Vc::try_resolve_sidecast::>(module).await? - else { - bail!("WASM loader was not processed into an EcmascriptModuleAsset"); - }; - - Ok(esm_asset) - } - - #[turbo_tasks::function] - async fn loader(self: Vc) -> Result>> { - let module = self.loader_as_module(); - let Some(esm_asset) = - Vc::try_resolve_sidecast::>(module).await? + Vc::try_resolve_downcast_type::(module).await? else { bail!("WASM loader was not processed into an EcmascriptModuleAsset"); }; @@ -174,7 +156,7 @@ impl ResolveOrigin for WebAssemblyModuleAsset { #[turbo_tasks::function] fn get_inner_asset(self: Vc, request: Vc) -> Vc { - self.loader_as_resolve_origin().get_inner_asset(request) + self.loader().get_inner_asset(request) } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index 6e2570c972361..3eedd7243df0b 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -78,7 +78,6 @@ impl ModuleOptions { execution_context, ref rules, esm_url_rewrite_behavior, - special_exports, import_externals, ignore_dynamic_requests, use_swc_css, @@ -123,7 +122,6 @@ impl ModuleOptions { tree_shaking_mode, url_rewrite_behavior: esm_url_rewrite_behavior, import_externals, - special_exports, ignore_dynamic_requests, refresh, ..Default::default() diff --git a/crates/turbopack/src/module_options/module_options_context.rs b/crates/turbopack/src/module_options/module_options_context.rs index 41cab2b11815a..0b4121f69cc6a 100644 --- a/crates/turbopack/src/module_options/module_options_context.rs +++ b/crates/turbopack/src/module_options/module_options_context.rs @@ -141,7 +141,6 @@ pub struct ModuleOptionsContext { pub placeholder_for_future_extensions: (), pub tree_shaking_mode: Option, pub esm_url_rewrite_behavior: Option, - pub special_exports: Vc>, /// References to externals from ESM imports should use `import()` and make /// async modules. pub import_externals: bool, From ab96fc651e44fcb57a1a33084a49f924230d12ad Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 18 Jul 2024 08:57:01 +0200 Subject: [PATCH 25/73] merge InProgressDirty into InProgress (#8777) ### Description This saves some memory and streamlines the behavior. It also lazily removes collectibles, children and dependencies even when entering the previous InProgressDirty (now InProgress stale) state. ### Testing Instructions --- crates/turbo-tasks-memory/src/task.rs | 321 ++++++++---------- .../tests/dirty_in_progress.rs | 100 ++++++ 2 files changed, 244 insertions(+), 177 deletions(-) create mode 100644 crates/turbo-tasks-memory/tests/dirty_in_progress.rs diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 53791e9b9e2d4..f9ee262ba58f3 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -310,14 +310,22 @@ impl MaybeCollectibles { } struct InProgressState { + /// Event is fired when the task is Done. event: Event, + /// true, when the task was marked as finished. count_as_finished: bool, /// true, when the task wasn't changed since the last execution clean: bool, + /// true, when the task was invalidated while executing. It will be + /// scheduled again. + stale: bool, /// Dependencies and children that need to be disconnected once leaving - /// this state + /// this state. outdated_edges: TaskEdgesSet, + /// Children that are connected during execution. These children are already + /// removed from `outdated_edges`. new_children: TaskIdSet, + /// Collectibles that need to be removed once leaving this state. outdated_collectibles: MaybeCollectibles, } @@ -356,19 +364,10 @@ enum TaskStateType { /// Execution is happening /// - /// on finish this will move to Done + /// on finish this will move to Done (!stale) or Scheduled (stale) /// - /// on invalidation this will move to InProgressDirty + /// on invalidation this will set it's stale flag InProgress(Box), - - /// Invalid execution is happening - /// - /// on finish this will move to Scheduled - InProgressDirty { - event: Event, - outdated_edges: Box, - children_count: usize, - }, } impl TaskStateType { @@ -387,9 +386,6 @@ impl TaskStateType { TaskStateType::Dirty { outdated_edges, .. } => { Either::Right(Either::Right(outdated_edges.children())) } - TaskStateType::InProgressDirty { outdated_edges, .. } => { - Either::Right(Either::Right(outdated_edges.children())) - } TaskStateType::Scheduled { outdated_edges, .. } => { Either::Right(Either::Right(outdated_edges.children())) } @@ -414,7 +410,6 @@ impl TaskStateType { (edges, children) } TaskStateType::Dirty { outdated_edges, .. } - | TaskStateType::InProgressDirty { outdated_edges, .. } | TaskStateType::Scheduled { outdated_edges, .. } => { let mut edges = *outdated_edges; let children = edges.drain_children(); @@ -704,7 +699,7 @@ impl Task { let (future, span) = { let mut state = self.full_state_mut(); match state.state_type { - Done { .. } | InProgress { .. } | InProgressDirty { .. } => { + Done { .. } | InProgress { .. } => { // should not start in this state return None; } @@ -720,6 +715,7 @@ impl Task { event, count_as_finished: false, clean, + stale: false, outdated_edges, outdated_collectibles, new_children: Default::default(), @@ -824,6 +820,7 @@ impl Task { }; let TaskStateType::InProgress(box InProgressState { ref mut count_as_finished, + ref mut stale, ref mut outdated_collectibles, ref mut outdated_edges, .. @@ -831,7 +828,7 @@ impl Task { else { return; }; - if *count_as_finished { + if *count_as_finished || *stale { return; } *count_as_finished = true; @@ -878,7 +875,12 @@ impl Task { ) { let mut state = self.full_state_mut(); match state.state_type { - InProgress { .. } => match result { + InProgress(ref state) if state.stale => { + // We don't want to assign the output cell here + // as we want to avoid unnecessary updates + // TODO maybe this should be controlled by a heuristic + } + InProgress(..) => match result { Ok(Ok(result)) => { if state.output != result { if cfg!(feature = "print_task_invalidation") @@ -905,11 +907,7 @@ impl Task { } Err(message) => state.output.panic(message, turbo_tasks), }, - InProgressDirty { .. } => { - // We don't want to assign the output cell here - // as we want to avoid unnecessary updates - // TODO maybe this should be controlled by a heuristic - } + Dirty { .. } | Scheduled { .. } | Done { .. } => { panic!( "Task execution completed in unexpected state {}", @@ -934,99 +932,111 @@ impl Task { { let mut change_job = None; let mut remove_job = None; - let mut dependencies = DEPENDENCIES_TO_TRACK.with(|deps| deps.take()); + let dependencies = DEPENDENCIES_TO_TRACK.with(|deps| deps.take()); { let mut state = self.full_state_mut(); state .gc .execution_completed(duration, memory_usage, generation); - match state.state_type { - InProgress(box InProgressState { - ref mut event, - count_as_finished, - ref mut outdated_edges, - ref mut outdated_collectibles, - ref mut new_children, - clean: _, - }) => { - let event = event.take(); - let mut outdated_edges = take(outdated_edges); - let outdated_collectibles = outdated_collectibles.take_collectibles(); - let mut new_edges = take(&mut dependencies); - outdated_edges.remove_all(&new_edges); - for child in take(new_children) { - new_edges.insert(TaskEdge::Child(child)); - outdated_edges.remove(TaskEdge::Child(child)); + let InProgress(box InProgressState { + ref mut event, + count_as_finished, + ref mut outdated_edges, + ref mut outdated_collectibles, + ref mut new_children, + clean: _, + stale, + }) = state.state_type + else { + panic!( + "Task execution completed in unexpected state {}", + Task::state_string(&state) + ) + }; + let event = event.take(); + let outdated_collectibles = outdated_collectibles.take_collectibles(); + let mut outdated_edges = take(outdated_edges); + let mut new_edges = dependencies; + let new_children = take(new_children); + if stale { + for dep in new_edges.into_iter() { + // TODO Could be more efficent + outdated_edges.insert(dep); + } + for child in new_children { + outdated_edges.insert(TaskEdge::Child(child)); + } + if let Some(collectibles) = outdated_collectibles { + let mut change = TaskChange::default(); + for ((trait_type, value), count) in collectibles.into_iter() { + change.collectibles.push((trait_type, value, -count)); } - if !backend.has_gc() { - // This will stay here for longer, so make sure to not consume too much - // memory - for cells in state.cells.values_mut() { - cells.shrink_to_fit(); - } - state.cells.shrink_to_fit(); + change_job = state + .aggregation_node + .apply_change(&aggregation_context, change); + } + state.state_type = Scheduled { + event, + outdated_edges: Box::new(outdated_edges), + clean: false, + }; + drop(state); + schedule_task = true; + } else { + outdated_edges.remove_all(&new_edges); + for child in new_children { + new_edges.insert(TaskEdge::Child(child)); + outdated_edges.remove(TaskEdge::Child(child)); + } + if !backend.has_gc() { + // This will stay here for longer, so make sure to not consume too + // much memory + for cells in state.cells.values_mut() { + cells.shrink_to_fit(); } - state.state_type = Done { - stateful, - edges: new_edges.into_list(), + state.cells.shrink_to_fit(); + } + state.state_type = Done { + stateful, + edges: new_edges.into_list(), + }; + if !count_as_finished { + let mut change = TaskChange { + unfinished: -1, + #[cfg(feature = "track_unfinished")] + unfinished_tasks_update: vec![(self.id, -1)], + ..Default::default() }; - if !count_as_finished { - let mut change = TaskChange { - unfinished: -1, - #[cfg(feature = "track_unfinished")] - unfinished_tasks_update: vec![(self.id, -1)], - ..Default::default() - }; - if let Some(collectibles) = outdated_collectibles { - for ((trait_type, value), count) in collectibles.into_iter() { - change.collectibles.push((trait_type, value, -count)); - } + if let Some(collectibles) = outdated_collectibles { + for ((trait_type, value), count) in collectibles.into_iter() { + change.collectibles.push((trait_type, value, -count)); } - change_job = state - .aggregation_node - .apply_change(&aggregation_context, change); - } - let outdated_children = outdated_edges.drain_children(); - if !outdated_children.is_empty() { - remove_job = state.aggregation_node.handle_lost_edges( - &aggregation_context, - &self.id, - outdated_children, - ); } - event.notify(usize::MAX); - drop(state); - self.clear_dependencies(outdated_edges, backend, turbo_tasks); - } - InProgressDirty { - ref mut event, - ref mut outdated_edges, - children_count: _, - } => { - let event = event.take(); - for dep in take(outdated_edges).into_iter() { - // TODO Could be more efficent - dependencies.insert(dep); + change_job = state + .aggregation_node + .apply_change(&aggregation_context, change); + } else if let Some(collectibles) = outdated_collectibles { + let mut change = TaskChange::default(); + for ((trait_type, value), count) in collectibles.into_iter() { + change.collectibles.push((trait_type, value, -count)); } - let outdated_edges = take(&mut dependencies); - state.state_type = Scheduled { - event, - outdated_edges: Box::new(outdated_edges), - clean: false, - }; - schedule_task = true; + change_job = state + .aggregation_node + .apply_change(&aggregation_context, change); } - Dirty { .. } | Scheduled { .. } | Done { .. } => { - panic!( - "Task execution completed in unexpected state {}", - Task::state_string(&state) - ) + let outdated_children = outdated_edges.drain_children(); + if !outdated_children.is_empty() { + remove_job = state.aggregation_node.handle_lost_edges( + &aggregation_context, + &self.id, + outdated_children, + ); } - }; - } - if !dependencies.is_empty() { - self.clear_dependencies(dependencies, backend, turbo_tasks); + event.notify(usize::MAX); + drop(state); + self.clear_dependencies(outdated_edges, backend, turbo_tasks); + } } change_job.apply(&aggregation_context); remove_job.apply(&aggregation_context); @@ -1062,7 +1072,7 @@ impl Task { // already scheduled drop(state); } - Dirty { .. } | InProgressDirty { .. } => { + Dirty { .. } => { // already dirty drop(state); } @@ -1113,54 +1123,33 @@ impl Task { } } InProgress(box InProgressState { - ref mut event, - count_as_finished, - ref mut outdated_edges, - ref mut outdated_collectibles, - ref mut new_children, - clean: _, + ref mut count_as_finished, + ref mut clean, + ref mut stale, + .. }) => { - let event = event.take(); - let mut outdated_edges = take(outdated_edges); - let children_count = new_children.len(); - for child in take(new_children) { - outdated_edges.insert(TaskEdge::Child(child)); - } - let outdated_collectibles = outdated_collectibles.take_collectibles(); - let change = if count_as_finished { - let mut change = TaskChange { - unfinished: 1, - #[cfg(feature = "track_unfinished")] - unfinished_tasks_update: vec![(self.id, 1)], - ..Default::default() + if !*stale { + *clean = false; + *stale = true; + let change_job = if *count_as_finished { + *count_as_finished = false; + let change = TaskChange { + unfinished: 1, + #[cfg(feature = "track_unfinished")] + unfinished_tasks_update: vec![(self.id, 1)], + ..Default::default() + }; + Some( + state + .aggregation_node + .apply_change(&aggregation_context, change), + ) + } else { + None }; - if let Some(collectibles) = outdated_collectibles { - for ((trait_type, value), count) in collectibles.into_iter() { - change.collectibles.push((trait_type, value, -count)); - } - } - Some(change) - } else if let Some(collectibles) = outdated_collectibles { - let mut change = TaskChange::default(); - for ((trait_type, value), count) in collectibles.into_iter() { - change.collectibles.push((trait_type, value, -count)); - } - Some(change) - } else { - None - }; - let change_job = change.and_then(|change| { - state - .aggregation_node - .apply_change(&aggregation_context, change) - }); - state.state_type = InProgressDirty { - event, - outdated_edges: Box::new(outdated_edges), - children_count, - }; - drop(state); - change_job.apply(&aggregation_context); + drop(state); + change_job.apply(&aggregation_context); + } } } } @@ -1186,7 +1175,7 @@ impl Task { // already scheduled drop(state); } - InProgressDirty { .. } | InProgress(..) => { + InProgress(..) => { // already in progress drop(state); } @@ -1398,15 +1387,13 @@ impl Task { fn state_string(state: &TaskState) -> &'static str { match state.state_type { Scheduled { .. } => "scheduled", - InProgress(box InProgressState { - count_as_finished: false, - .. - }) => "in progress", + InProgress(box InProgressState { stale: true, .. }) => "in progress (stale)", + InProgress(box InProgressState { clean: true, .. }) => "in progress (clean)", InProgress(box InProgressState { count_as_finished: true, .. }) => "in progress (marked as finished)", - InProgressDirty { .. } => "in progress (dirty)", + InProgress(box InProgressState { .. }) => "in progress", Done { .. } => "done", Dirty { .. } => "dirty", } @@ -1446,24 +1433,6 @@ impl Task { )); } } - TaskStateType::InProgressDirty { - outdated_edges, - children_count, - .. - } => { - if outdated_edges.insert(TaskEdge::Child(child_id)) { - *children_count += 1; - let number_of_children = *children_count; - let mut guard = TaskGuard::from_full(self.id, state); - add_job = Some(handle_new_edge( - &aggregation_context, - &mut guard, - &self.id, - &child_id, - number_of_children, - )); - } - } _ => panic!("Unexpected task state when adding a child task"), } } @@ -1555,9 +1524,7 @@ impl Task { change_job.apply(&aggregation_context); Ok(Err(listener)) } - Scheduled { ref event, .. } - | InProgress(box InProgressState { ref event, .. }) - | InProgressDirty { ref event, .. } => { + Scheduled { ref event, .. } | InProgress(box InProgressState { ref event, .. }) => { let listener = event.listen_with_note(note); drop(state); Ok(Err(listener)) diff --git a/crates/turbo-tasks-memory/tests/dirty_in_progress.rs b/crates/turbo-tasks-memory/tests/dirty_in_progress.rs new file mode 100644 index 0000000000000..91e0b13dd9e7f --- /dev/null +++ b/crates/turbo-tasks-memory/tests/dirty_in_progress.rs @@ -0,0 +1,100 @@ +#![feature(arbitrary_self_types)] + +use std::time::Duration; + +use anyhow::{bail, Result}; +use turbo_tasks::{emit, CollectiblesSource, RcStr, State, ValueToString, Vc}; +use turbo_tasks_testing::{register, run}; + +register!(); + +#[tokio::test] +async fn dirty_in_progress() { + run! { + let cases = [ + (1, 3, 2, 2, ""), + (11, 13, 12, 42, "12"), + (1, 13, 11, 42, "11"), + (1, 3, 11, 42, "11"), + (11, 3, 2, 2, ""), + (11, 13, 2, 2, ""), + ]; + for (a, b, c, value, collectible) in cases { + println!("{} -> {} -> {} = {} {}", a, b, c, value, collectible); + let input = ChangingInput { + state: State::new(a), + }.cell(); + let input_val = input.await?; + let output = compute(input); + output.await?; + println!("update to {}", b); + input_val.state.set(b); + tokio::time::sleep(Duration::from_millis(100)).await; + println!("update to {}", c); + input_val.state.set(c); + let read = output.strongly_consistent().await?; + assert_eq!(read.value, value); + assert_eq!(read.collectible, collectible); + } + } +} + +#[turbo_tasks::value] +struct ChangingInput { + state: State, +} + +#[turbo_tasks::value] +struct Output { + value: u32, + collectible: String, +} + +#[turbo_tasks::value] +struct Collectible { + value: u32, +} + +#[turbo_tasks::value_impl] +impl ValueToString for Collectible { + #[turbo_tasks::function] + fn to_string(&self) -> Vc { + Vc::cell(self.value.to_string().into()) + } +} + +#[turbo_tasks::function] +async fn inner_compute(input: Vc) -> Result> { + println!("start inner_compute"); + let value = *input.await?.state.get(); + tokio::time::sleep(Duration::from_millis(200)).await; + if value > 10 { + let collectible: Vc> = Vc::upcast(Collectible { value }.cell()); + emit(collectible); + + println!("end inner_compute with collectible"); + Ok(Vc::cell(42)) + } else { + println!("end inner_compute without collectible"); + Ok(Vc::cell(value)) + } +} + +#[turbo_tasks::function] +async fn compute(input: Vc) -> Result> { + println!("start compute"); + let operation = inner_compute(input); + let value = *operation.await?; + let collectibles = operation.peek_collectibles::>(); + if collectibles.len() > 1 { + bail!("expected 0..1 collectible, found {}", collectibles.len()); + } + let first = collectibles.iter().next(); + let collectible = if let Some(first) = first { + first.to_string().await?.to_string() + } else { + "".to_string() + }; + println!("end compute"); + Ok(Output { value, collectible }.cell()) +} From cc6fb51778d2fa3569c2c4394352686077dabd96 Mon Sep 17 00:00:00 2001 From: Anthony Shew Date: Thu, 18 Jul 2024 09:05:58 -0600 Subject: [PATCH 26/73] Update basic example. (#8784) --- examples/basic/apps/docs/app/page.module.css | 21 +++++++++ examples/basic/apps/docs/app/page.tsx | 5 +- examples/basic/apps/web/app/page.module.css | 21 +++++++++ examples/basic/apps/web/app/page.tsx | 5 +- examples/basic/package.json | 2 +- examples/basic/pnpm-lock.yaml | 48 ++++++++++---------- examples/basic/turbo.json | 1 + 7 files changed, 69 insertions(+), 34 deletions(-) diff --git a/examples/basic/apps/docs/app/page.module.css b/examples/basic/apps/docs/app/page.module.css index 7e128b80d6c1d..3630662c6f311 100644 --- a/examples/basic/apps/docs/app/page.module.css +++ b/examples/basic/apps/docs/app/page.module.css @@ -90,6 +90,27 @@ a.secondary { min-width: 180px; } +button.secondary { + appearance: none; + border-radius: 128px; + height: 48px; + padding: 0 20px; + border: none; + font-family: var(--font-geist-sans); + border: 1px solid transparent; + transition: background 0.2s, color 0.2s, border-color 0.2s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + line-height: 20px; + font-weight: 500; + background: transparent; + border-color: var(--gray-alpha-200); + min-width: 180px; +} + .footer { font-family: var(--font-geist-sans); grid-row-start: 3; diff --git a/examples/basic/apps/docs/app/page.tsx b/examples/basic/apps/docs/app/page.tsx index 3fd4028ee602a..0284bae645816 100644 --- a/examples/basic/apps/docs/app/page.tsx +++ b/examples/basic/apps/docs/app/page.tsx @@ -46,10 +46,7 @@ export default function Home() { Read our docs - diff --git a/examples/basic/apps/web/app/page.module.css b/examples/basic/apps/web/app/page.module.css index 7e128b80d6c1d..3630662c6f311 100644 --- a/examples/basic/apps/web/app/page.module.css +++ b/examples/basic/apps/web/app/page.module.css @@ -90,6 +90,27 @@ a.secondary { min-width: 180px; } +button.secondary { + appearance: none; + border-radius: 128px; + height: 48px; + padding: 0 20px; + border: none; + font-family: var(--font-geist-sans); + border: 1px solid transparent; + transition: background 0.2s, color 0.2s, border-color 0.2s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + line-height: 20px; + font-weight: 500; + background: transparent; + border-color: var(--gray-alpha-200); + min-width: 180px; +} + .footer { font-family: var(--font-geist-sans); grid-row-start: 3; diff --git a/examples/basic/apps/web/app/page.tsx b/examples/basic/apps/web/app/page.tsx index b84d782ed5758..b5c042cd357a8 100644 --- a/examples/basic/apps/web/app/page.tsx +++ b/examples/basic/apps/web/app/page.tsx @@ -46,10 +46,7 @@ export default function Home() { Read our docs - diff --git a/examples/basic/package.json b/examples/basic/package.json index 34595f8ca205a..e9fa9353bc171 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -9,7 +9,7 @@ }, "devDependencies": { "prettier": "^3.2.5", - "turbo": "^2.0.3", + "turbo": "^2.0.7", "typescript": "^5.4.5" }, "packageManager": "pnpm@8.15.6", diff --git a/examples/basic/pnpm-lock.yaml b/examples/basic/pnpm-lock.yaml index 4cf3daead838a..b56d2da0b332a 100644 --- a/examples/basic/pnpm-lock.yaml +++ b/examples/basic/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^3.2.5 version: 3.2.5 turbo: - specifier: ^2.0.3 - version: 2.0.3 + specifier: ^2.0.7 + version: 2.0.7 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -3540,7 +3540,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -3683,7 +3682,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} dependencies: js-tokens: 4.0.0 - dev: true /lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -4298,7 +4296,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - dev: true + dev: false /react@19.0.0-rc-f994737d14-20240522: resolution: {integrity: sha512-SeU2v5Xy6FotVhKz0pMS2gvYP7HlkF0qgTskj3JzA1vlxcb3dQjxlm9t0ZlJqcgoyI3VFAw7bomuDMdgy1nBuw==} @@ -4994,64 +4992,64 @@ packages: typescript: 5.3.3 dev: true - /turbo-darwin-64@2.0.3: - resolution: {integrity: sha512-v7ztJ8sxdHw3SLfO2MhGFeeU4LQhFii1hIGs9uBiXns/0YTGOvxLeifnfGqhfSrAIIhrCoByXO7nR9wlm10n3Q==} + /turbo-darwin-64@2.0.7: + resolution: {integrity: sha512-J1RBvQGqKeUwLJrZbfrm4tHshagdMeGAwd7rpLpfUrw0PNmGfcBazJf6dIGXG59/GHzJmS0/eAZ8qDchfVbIFA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@2.0.3: - resolution: {integrity: sha512-LUcqvkV9Bxtng6QHbevp8IK8zzwbIxM6HMjCE7FEW6yJBN1KwvTtRtsGBwwmTxaaLO0wD1Jgl3vgkXAmQ4fqUw==} + /turbo-darwin-arm64@2.0.7: + resolution: {integrity: sha512-h1JK8uuEjoHx1SvvTZiottj+4kDmiv+hivnLUzNwO75qKblMsd38IsFB0J2sMRz7JacFlf+3ry8SItznBW67Xw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@2.0.3: - resolution: {integrity: sha512-xpdY1suXoEbsQsu0kPep2zrB8ijv/S5aKKrntGuQ62hCiwDFoDcA/Z7FZ8IHQ2u+dpJARa7yfiByHmizFE0r5Q==} + /turbo-linux-64@2.0.7: + resolution: {integrity: sha512-dsr7GFeHAYVMnXWDDjhpsAQetejU4OlkNBRA5hfmnIcl2sSyOYa3EvoeJ6j5z5vTNIJ9VO4I1h0jK3lTjEoonA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@2.0.3: - resolution: {integrity: sha512-MBACTcSR874L1FtLL7gkgbI4yYJWBUCqeBN/iE29D+8EFe0d3fAyviFlbQP4K/HaDYet1i26xkkOiWr0z7/V9A==} + /turbo-linux-arm64@2.0.7: + resolution: {integrity: sha512-bJbwXvyX1XPzY1jHgkqggls/L4yFyHVK8GGACF3kcg6x7lYV2SXkUYRyOC3WqzW7euqa9Zw/32jrIPP4Qy31Vw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@2.0.3: - resolution: {integrity: sha512-zi3YuKPkM9JxMTshZo3excPk37hUrj5WfnCqh4FjI26ux6j/LJK+Dh3SebMHd9mR7wP9CMam4GhmLCT+gDfM+w==} + /turbo-windows-64@2.0.7: + resolution: {integrity: sha512-aBH+5A7IN957MqXMrw8xN0CWtH/fPFL+xTlloO6074Eaa8WfnctSAnaSujm6f4xF2T8lFx+ZprBvnO9oKvLQQQ==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@2.0.3: - resolution: {integrity: sha512-wmed4kkenLvRbidi7gISB4PU77ujBuZfgVGDZ4DXTFslE/kYpINulwzkVwJIvNXsJtHqyOq0n6jL8Zwl3BrwDg==} + /turbo-windows-arm64@2.0.7: + resolution: {integrity: sha512-ButUCpO5nTi+jyTSIY2mQ9dVz+mCGxJ6sHyn0xGlNoJWdisKXb0BtWCLAjM26gg/yp9Kt1MBowMQyYVruPV0Qw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@2.0.3: - resolution: {integrity: sha512-jF1K0tTUyryEWmgqk1V0ALbSz3VdeZ8FXUo6B64WsPksCMCE48N5jUezGOH2MN0+epdaRMH8/WcPU0QQaVfeLA==} + /turbo@2.0.7: + resolution: {integrity: sha512-76iNWZpmKAKjj+yL0Wtcu2LpDIM5Nz7JS3fHOZPYS0AKuC2boJ24276VAiK4PKwbpBB//TYKDpSLuQ6cfR49pg==} hasBin: true optionalDependencies: - turbo-darwin-64: 2.0.3 - turbo-darwin-arm64: 2.0.3 - turbo-linux-64: 2.0.3 - turbo-linux-arm64: 2.0.3 - turbo-windows-64: 2.0.3 - turbo-windows-arm64: 2.0.3 + turbo-darwin-64: 2.0.7 + turbo-darwin-arm64: 2.0.7 + turbo-linux-64: 2.0.7 + turbo-linux-arm64: 2.0.7 + turbo-windows-64: 2.0.7 + turbo-windows-arm64: 2.0.7 dev: true /type-check@0.4.0: diff --git a/examples/basic/turbo.json b/examples/basic/turbo.json index c3b687eb66a66..807e324753413 100644 --- a/examples/basic/turbo.json +++ b/examples/basic/turbo.json @@ -1,5 +1,6 @@ { "$schema": "https://turbo.build/schema.json", + "ui": "tui", "tasks": { "build": { "dependsOn": ["^build"], From b5fd753b531ec106cddf069bd9e0aca5d7ea77d8 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Thu, 18 Jul 2024 14:03:18 -0400 Subject: [PATCH 27/73] feat(turborepo): give potential tasks on empty `turbo run` (#8726) ### Description Instead of showing a generic error when a user calls `turbo run` with no tasks, we show the potential tasks along with the packages where they're defined. We cut off this list at 80 characters to prevent wrapping. Also obeys the filter flag. ### Testing Instructions Added tests in `no-args.t` --- .github/workflows/turborepo-test.yml | 2 +- crates/turborepo-lib/src/cli/error.rs | 58 ++++++++++++- crates/turborepo-lib/src/cli/mod.rs | 14 +-- crates/turborepo-lib/src/commands/run.rs | 1 - crates/turborepo-lib/src/run/mod.rs | 26 +++++- turborepo-tests/integration/tests/no-args.t | 96 ++++++++++++++++++++- 6 files changed, 183 insertions(+), 14 deletions(-) diff --git a/.github/workflows/turborepo-test.yml b/.github/workflows/turborepo-test.yml index 55ae4c0312167..dff8bc7409537 100644 --- a/.github/workflows/turborepo-test.yml +++ b/.github/workflows/turborepo-test.yml @@ -169,7 +169,7 @@ jobs: needs: [determine_jobs, build_turborepo] if: needs.determine_jobs.outputs.turborepo_integration == 'true' runs-on: ${{ matrix.os.runner }} - timeout-minutes: 30 + timeout-minutes: 45 strategy: fail-fast: false matrix: diff --git a/crates/turborepo-lib/src/cli/error.rs b/crates/turborepo-lib/src/cli/error.rs index 2882190ce94a5..4295580d08075 100644 --- a/crates/turborepo-lib/src/cli/error.rs +++ b/crates/turborepo-lib/src/cli/error.rs @@ -1,15 +1,19 @@ use std::backtrace; +use itertools::Itertools; use miette::Diagnostic; use thiserror::Error; use turborepo_repository::package_graph; +use turborepo_telemetry::events::command::CommandEventBuilder; +use turborepo_ui::{color, BOLD, GREY}; use crate::{ - commands::{bin, generate, prune}, + commands::{bin, generate, prune, run::get_signal, CommandBase}, daemon::DaemonError, rewrite_json::RewriteError, run, - run::watch, + run::{builder::RunBuilder, watch}, + signal::SignalHandler, }; #[derive(Debug, Error, Diagnostic)] @@ -20,8 +24,6 @@ pub enum Error { Bin(#[from] bin::Error, #[backtrace] backtrace::Backtrace), #[error(transparent)] Path(#[from] turbopath::PathError), - #[error("at least one task must be specified")] - NoTasks(#[backtrace] backtrace::Backtrace), #[error(transparent)] #[diagnostic(transparent)] Config(#[from] crate::config::Error), @@ -53,3 +55,51 @@ pub enum Error { #[diagnostic(transparent)] Watch(#[from] watch::Error), } + +const MAX_CHARS_PER_TASK_LINE: usize = 100; + +pub async fn print_potential_tasks( + base: CommandBase, + telemetry: CommandEventBuilder, +) -> Result<(), Error> { + let signal = get_signal()?; + let handler = SignalHandler::new(signal); + let ui = base.ui; + + let run_builder = RunBuilder::new(base)?; + let run = run_builder.build(&handler, telemetry).await?; + let potential_tasks = run.get_potential_tasks()?; + + println!("No tasks provided, here are some potential ones to run\n",); + + for (task, packages) in potential_tasks + .into_iter() + .sorted_by(|(_, a), (_, b)| b.len().cmp(&a.len())) + { + let task = color!(ui, BOLD, "{}", task); + let mut line_length = 0; + + let mut packages_str = String::with_capacity(MAX_CHARS_PER_TASK_LINE); + for (idx, package) in packages.iter().sorted().enumerate() { + if line_length > MAX_CHARS_PER_TASK_LINE { + if idx != packages.len() { + packages_str.push_str(&format!(" and {} more", packages.len() - idx)); + } + + break; + } + + line_length += package.len() + 2; + if idx != 0 { + packages_str.push_str(", "); + } + packages_str.push_str(package); + } + + let packages = color!(ui, GREY, "{}", packages_str); + + println!(" {}\n {}", task, packages) + } + + Ok(()) +} diff --git a/crates/turborepo-lib/src/cli/mod.rs b/crates/turborepo-lib/src/cli/mod.rs index f4b399b434cfc..bb776c1ee4db8 100644 --- a/crates/turborepo-lib/src/cli/mod.rs +++ b/crates/turborepo-lib/src/cli/mod.rs @@ -1,4 +1,4 @@ -use std::{backtrace, backtrace::Backtrace, env, fmt, fmt::Display, io, mem, process}; +use std::{backtrace::Backtrace, env, fmt, fmt::Display, io, mem, process}; use biome_deserialize_macros::Deserializable; use camino::{Utf8Path, Utf8PathBuf}; @@ -24,6 +24,7 @@ use turborepo_telemetry::{ use turborepo_ui::UI; use crate::{ + cli::error::print_potential_tasks, commands::{ bin, daemon, generate, info, link, login, logout, prune, run, scan, telemetry, unlink, CommandBase, @@ -995,6 +996,7 @@ pub async fn run( // missing any execution args. .clone() .ok_or_else(|| Error::NoCommand(Backtrace::capture()))?; + if execution_args.tasks.is_empty() { let mut cmd = ::command(); let _ = cmd.print_help(); @@ -1221,17 +1223,19 @@ pub async fn run( } => { let event = CommandEventBuilder::new("run").with_parent(&root_telemetry); event.track_call(); - // in the case of enabling the run stub, we want to be able to opt-in - // to the rust codepath for running turbo + + let base = CommandBase::new(cli_args.clone(), repo_root, version, ui); + if execution_args.tasks.is_empty() { - return Err(Error::NoTasks(backtrace::Backtrace::capture())); + print_potential_tasks(base, event).await?; + process::exit(1); } if let Some((file_path, include_args)) = run_args.profile_file_and_include_args() { // TODO: Do we want to handle the result / error? let _ = logger.enable_chrome_tracing(file_path, include_args); } - let base = CommandBase::new(cli_args.clone(), repo_root, version, ui); + run_args.track(&event); event.track_run_code_path(CodePath::Rust); let exit_code = run::run(base, event).await.inspect(|code| { diff --git a/crates/turborepo-lib/src/commands/run.rs b/crates/turborepo-lib/src/commands/run.rs index cda41c7cea33c..fe9c251eedbe7 100644 --- a/crates/turborepo-lib/src/commands/run.rs +++ b/crates/turborepo-lib/src/commands/run.rs @@ -45,7 +45,6 @@ pub async fn run(base: CommandBase, telemetry: CommandEventBuilder) -> Result Result>, Error> { + let mut tasks = BTreeMap::new(); + for (name, info) in self.pkg_dep_graph.packages() { + if !self.filtered_pkgs.contains(name) { + continue; + } + for task_name in info.package_json.scripts.keys() { + tasks + .entry(task_name.clone()) + .or_insert_with(Vec::new) + .push(name.to_string()) + } + } + + Ok(tasks) + } + pub fn has_experimental_ui(&self) -> bool { self.experimental_ui } diff --git a/turborepo-tests/integration/tests/no-args.t b/turborepo-tests/integration/tests/no-args.t index dc079a8b5b31e..6e77b3227e8ad 100644 --- a/turborepo-tests/integration/tests/no-args.t +++ b/turborepo-tests/integration/tests/no-args.t @@ -1,5 +1,5 @@ Setup - $ . ${TESTDIR}/../../helpers/setup.sh + $ . ${TESTDIR}/../../helpers/setup_integration_test.sh Make sure exit code is 2 when no args are passed $ ${TURBO} @@ -111,14 +111,106 @@ Make sure exit code is 2 when no args are passed Use "none" to remove prefixes from task logs. Use "task" to get task id prefixing. Use "auto" to let turbo decide how to prefix the logs based on the execution environment. In most cases this will be the same as "task". Note that tasks running in parallel interleave their logs, so removing prefixes can make it difficult to associate logs with tasks. Use --log-order=grouped to prevent interleaving. (default auto) [default: auto] [possible values: auto, none, task] [1] +Run without any tasks, get a list of potential tasks to run $ ${TURBO} run - x at least one task must be specified + No tasks provided, here are some potential ones to run + build + my-app, util + maybefails + my-app, util [1] +Run again with a filter and get only the packages that match + $ ${TURBO} run --filter my-app + No tasks provided, here are some potential ones to run + + build + my-app + maybefails + my-app + [1] + + Run again with an environment variable that corresponds to a run argument and assert that we get the full help output. $ TURBO_LOG_ORDER=stream ${TURBO} 2>&1 > out.txt [1] $ cat out.txt | head -n1 The build system that makes ship happen + +Initialize a new monorepo + $ . ${TESTDIR}/../../helpers/setup_integration_test.sh composable_config > /dev/null 2>&1 + + $ ${TURBO} run + No tasks provided, here are some potential ones to run + + build + invalid-config, my-app, util + maybefails + my-app, util + add-keys-task + add-keys + add-keys-underlying-task + add-keys + added-task + add-tasks + cached-task-1 + cached + cached-task-2 + cached + cached-task-3 + cached + cached-task-4 + missing-workspace-config + config-change-task + config-change + cross-workspace-task + cross-workspace + cross-workspace-underlying-task + blank-pkg + missing-workspace-config-task + missing-workspace-config + missing-workspace-config-task-with-deps + missing-workspace-config + missing-workspace-config-underlying-task + missing-workspace-config + missing-workspace-config-underlying-topo-task + blank-pkg + omit-keys-task + omit-keys + omit-keys-task-with-deps + omit-keys + omit-keys-underlying-task + omit-keys + omit-keys-underlying-topo-task + blank-pkg + override-values-task + override-values + override-values-task-with-deps + override-values + override-values-task-with-deps-2 + override-values + override-values-underlying-task + override-values + override-values-underlying-topo-task + blank-pkg + persistent-task-1 + persistent + persistent-task-1-parent + persistent + persistent-task-2 + persistent + persistent-task-2-parent + persistent + persistent-task-3 + persistent + persistent-task-3-parent + persistent + persistent-task-4 + persistent + persistent-task-4-parent + persistent + trailing-comma + bad-json + [1] From f9bf6705b0e1b6b904c63168b9f64075fccc8aaf Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Thu, 18 Jul 2024 16:46:19 -0500 Subject: [PATCH 28/73] chore(ci): run JS package tests on node 18 (#8730) --- .github/workflows/test-js-packages.yml | 9 +++++++-- .github/workflows/turborepo-native-lib-test.yml | 9 +++++++-- packages/turbo-repository/turbo.json | 13 ++++--------- turbo.json | 2 ++ 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test-js-packages.yml b/.github/workflows/test-js-packages.yml index f1870cccadf6a..d4394bec5f2c5 100644 --- a/.github/workflows/test-js-packages.yml +++ b/.github/workflows/test-js-packages.yml @@ -52,7 +52,7 @@ jobs: docs: ${{ steps.docs.outputs.diff != '' }} js_packages: - name: JS Package Tests + name: "JS Package Tests (${{matrix.os.name}}, Node ${{matrix.node-version}})" timeout-minutes: 30 if: needs.determine_jobs.outputs.ci == 'true' || needs.determine_jobs.outputs.packages == 'true' || needs.determine_jobs.outputs.docs == 'true' needs: [determine_jobs] @@ -69,6 +69,9 @@ jobs: - "metal" - name: macos runner: macos-12 + node-version: + - 18 + - 20 env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ vars.TURBO_TEAM }} @@ -92,7 +95,7 @@ jobs: uses: ./.github/actions/setup-turborepo-environment with: github-token: "${{ secrets.GITHUB_TOKEN }}" - node-version: "20" + node-version: ${{ matrix.node-version }} - name: Install Global Turbo uses: ./.github/actions/install-global-turbo @@ -104,6 +107,8 @@ jobs: # changes, and we don't want to enable that beahvior for _all_ our JS packages. run: | TURBO_API= turbo run check-types test --filter="!turborepo-repository" --filter={./packages/*}...[${{ github.event.pull_request.base.sha || 'HEAD^1' }}] --color --env-mode=strict + env: + NODE_VERSION: ${{ matrix.node-version }} summary: name: Turborepo JS Test Summary diff --git a/.github/workflows/turborepo-native-lib-test.yml b/.github/workflows/turborepo-native-lib-test.yml index 453db792e6fee..f4a61973514b2 100644 --- a/.github/workflows/turborepo-native-lib-test.yml +++ b/.github/workflows/turborepo-native-lib-test.yml @@ -11,7 +11,7 @@ permissions: jobs: js_native_packages: - name: JS Native Package Tests + name: "@turbo/repository (${{matrix.os.name}}, Node ${{matrix.node-version}})" timeout-minutes: 30 runs-on: ${{ matrix.os.runner }} strategy: @@ -26,6 +26,9 @@ jobs: - "metal" - name: macos runner: macos-latest + node-version: + - 18 + - 20 env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ vars.TURBO_TEAM }} @@ -48,7 +51,7 @@ jobs: with: windows: ${{ matrix.os.name == 'windows' }} github-token: "${{ secrets.GITHUB_TOKEN }}" - node-version: "20" + node-version: ${{ matrix.node-version }} - name: Install Global Turbo uses: ./.github/actions/install-global-turbo @@ -57,3 +60,5 @@ jobs: # Manually set TURBO_API to an empty string to override Hetzner env run: | TURBO_API= turbo run test --filter "turborepo-repository" --color --env-mode=strict + env: + NODE_VERSION: ${{ matrix.node-version }} diff --git a/packages/turbo-repository/turbo.json b/packages/turbo-repository/turbo.json index 73d364c08f778..ba3111139fba9 100644 --- a/packages/turbo-repository/turbo.json +++ b/packages/turbo-repository/turbo.json @@ -1,18 +1,13 @@ { "$schema": "../../docs/public/schema.json", - "extends": [ - "//" - ], + "extends": ["//"], "tasks": { "build": { - "dependsOn": [ - "cli#rust-src" - ] + "dependsOn": ["cli#rust-src"], + "env": ["NODE_VERSION"] }, "test": { - "dependsOn": [ - "build" - ] + "dependsOn": ["build"] } } } diff --git a/turbo.json b/turbo.json index 69333d8550048..af2d1679e2863 100644 --- a/turbo.json +++ b/turbo.json @@ -28,6 +28,8 @@ "test": { "outputs": ["coverage/**/*"], + "env": ["NODE_VERSION"], + // ^build is generically set here, we haven't fully enumerated which workspaces // actually need to build before running tests. "dependsOn": ["^build"] From 8de0996c8fe310ff45c4583e9629abd9455bb350 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Thu, 18 Jul 2024 17:03:18 -0500 Subject: [PATCH 29/73] chore(ci): rm unused input to custom action (#8789) --- .github/workflows/turborepo-native-lib-test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/turborepo-native-lib-test.yml b/.github/workflows/turborepo-native-lib-test.yml index f4a61973514b2..0b6e5a31cbc22 100644 --- a/.github/workflows/turborepo-native-lib-test.yml +++ b/.github/workflows/turborepo-native-lib-test.yml @@ -49,7 +49,6 @@ jobs: - name: Setup Turborepo Environment uses: ./.github/actions/setup-turborepo-environment with: - windows: ${{ matrix.os.name == 'windows' }} github-token: "${{ secrets.GITHUB_TOKEN }}" node-version: ${{ matrix.node-version }} From c5ae6fbd63bff4c73122c6ca8716e59336bdf386 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Thu, 18 Jul 2024 22:32:24 -0500 Subject: [PATCH 30/73] chore(ci): JS tests don't need to setup rust and capnproto (#8787) --- .github/workflows/test-js-packages.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-js-packages.yml b/.github/workflows/test-js-packages.yml index d4394bec5f2c5..2e4de376bec24 100644 --- a/.github/workflows/test-js-packages.yml +++ b/.github/workflows/test-js-packages.yml @@ -91,11 +91,13 @@ jobs: ref: ${{ github.ref }} fetch-depth: ${{ steps.fetch-depth.outputs.depth }} - - name: Setup Turborepo Environment - uses: ./.github/actions/setup-turborepo-environment + - name: "Setup Node" + uses: ./.github/actions/setup-node with: - github-token: "${{ secrets.GITHUB_TOKEN }}" + extra-flags: --no-optional node-version: ${{ matrix.node-version }} + env: + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 - name: Install Global Turbo uses: ./.github/actions/install-global-turbo From 332589aac2dc4dc4a4f2051b5b4891fe6de14ff2 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Fri, 19 Jul 2024 09:04:10 +0200 Subject: [PATCH 31/73] fix watcher bug with file creation (#8785) ### Description Sometimes file creation is reported as ModifyKind::Data on macOS. We need to account for that... FS weirdness... ### Testing Instructions --- crates/turbo-tasks-fs/src/watcher.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/turbo-tasks-fs/src/watcher.rs b/crates/turbo-tasks-fs/src/watcher.rs index 371777bcbfc97..d031af9b61768 100644 --- a/crates/turbo-tasks-fs/src/watcher.rs +++ b/crates/turbo-tasks-fs/src/watcher.rs @@ -271,6 +271,17 @@ impl DiskWatcher { | ModifyKind::Metadata(MetadataKind::Any), ) => { batched_invalidate_path.extend(paths.clone()); + #[cfg(target_os = "macos")] + { + // Sometimes file creation is reported as + // ModifyKind::Data on macOS. + paths.iter().for_each(|path| { + if let Some(parent) = path.parent() { + batched_invalidate_path_dir + .insert(PathBuf::from(parent)); + } + }); + } } EventKind::Create(_) => { batched_invalidate_path_and_children.extend(paths.clone()); From 3c2991c0213ea74b734ae6b1266d0c947e712e0a Mon Sep 17 00:00:00 2001 From: Thomas Knickman Date: Fri, 19 Jul 2024 10:36:17 -0400 Subject: [PATCH 32/73] feat(turbo): add VERCEL to pass through (#8794) ### Description This is required so frameworks like svelte can auto detect their CI environment without always needing to include it in your turbo.json ### Testing Instructions --- crates/turborepo-lib/src/task_hash.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/turborepo-lib/src/task_hash.rs b/crates/turborepo-lib/src/task_hash.rs index ff8eb11c3e893..72179cff3d596 100644 --- a/crates/turborepo-lib/src/task_hash.rs +++ b/crates/turborepo-lib/src/task_hash.rs @@ -490,6 +490,7 @@ impl<'a> TaskHasher<'a> { "JB_INTERPRETER", "_JETBRAINS_TEST_RUNNER_RUN_SCOPE_TYPE", // Vercel specific + "VERCEL", "VERCEL_*", "NEXT_*", "USE_OUTPUT_FOR_EDGE_FUNCTIONS", From b51e9e437744e1632daf363890d99ebdd8bdd146 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:16:44 -0400 Subject: [PATCH 33/73] release(turborepo): 2.0.8 (#8795) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index 19176815f7a7f..9d8f082163ec9 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.7", + "version": "2.0.8", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index b74f5125c4f5b..2298e99397972 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.7", + "version": "2.0.8", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index 0f627151917f9..d12a9f8694645 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.7", + "version": "2.0.8", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index 6bd470ca7a392..3af8786e6f22b 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.7", + "version": "2.0.8", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index cf20ed49b2d82..b516256d4498e 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.7", + "version": "2.0.8", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index 3fd545c1522f6..f63028d20f515 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.7", + "version": "2.0.8", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index b35ef23c56a29..69ba8f19cda48 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.7", + "version": "2.0.8", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index cecfbb992b703..8cee9fa010576 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.7", + "version": "2.0.8", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index 3700274689d6f..4592cd732701c 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.7", + "version": "2.0.8", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.7", - "turbo-darwin-arm64": "2.0.7", - "turbo-linux-64": "2.0.7", - "turbo-linux-arm64": "2.0.7", - "turbo-windows-64": "2.0.7", - "turbo-windows-arm64": "2.0.7" + "turbo-darwin-64": "2.0.8", + "turbo-darwin-arm64": "2.0.8", + "turbo-linux-64": "2.0.8", + "turbo-linux-arm64": "2.0.8", + "turbo-windows-64": "2.0.8", + "turbo-windows-arm64": "2.0.8" } } diff --git a/version.txt b/version.txt index 7a9d87b1a7cb0..7cdb5b2721607 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.7 +2.0.8 latest From 5a68e3af256c14ddda9930604da25221cba4774a Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Fri, 19 Jul 2024 12:33:03 -0400 Subject: [PATCH 34/73] feature(turborepo): fancy package.json errors (#8299) ### Description More fancy errors! Since we now have span info for package.json files, we can produce errors pointing to locations in package.json. ### Testing Instructions --- crates/turborepo-errors/src/lib.rs | 1 - crates/turborepo-lib/src/cli/error.rs | 1 + crates/turborepo-lib/src/engine/mod.rs | 7 +- crates/turborepo-lib/src/run/error.rs | 2 + .../src/run/summary/task_factory.rs | 1 + .../turborepo-lib/src/task_graph/visitor.rs | 15 ++- crates/turborepo-lib/src/turbo_json/mod.rs | 4 +- .../src/package_graph/builder.rs | 13 +-- .../src/package_graph/dep_splitter.rs | 2 +- .../turborepo-repository/src/package_json.rs | 48 +++++++--- .../src/package_manager/mod.rs | 92 ++++++++++++------- .../src/package_manager/pnpm.rs | 4 +- .../src/package_manager/yarn.rs | 12 ++- .../fixtures/basic_monorepo/package.json | 1 + .../integration/tests/invalid-package-json.t | 50 ++++++++++ .../integration/tests/recursive-turbo.t | 22 +++++ 16 files changed, 212 insertions(+), 63 deletions(-) create mode 100644 turborepo-tests/integration/tests/recursive-turbo.t diff --git a/crates/turborepo-errors/src/lib.rs b/crates/turborepo-errors/src/lib.rs index 701d0ba704f5d..43314adbefebd 100644 --- a/crates/turborepo-errors/src/lib.rs +++ b/crates/turborepo-errors/src/lib.rs @@ -191,7 +191,6 @@ impl Deref for Spanned { &self.value } } - pub trait WithMetadata { fn add_text(&mut self, text: Arc); fn add_path(&mut self, path: Arc); diff --git a/crates/turborepo-lib/src/cli/error.rs b/crates/turborepo-lib/src/cli/error.rs index 4295580d08075..712d850136de6 100644 --- a/crates/turborepo-lib/src/cli/error.rs +++ b/crates/turborepo-lib/src/cli/error.rs @@ -30,6 +30,7 @@ pub enum Error { #[error(transparent)] ChromeTracing(#[from] crate::tracing::Error), #[error(transparent)] + #[diagnostic(transparent)] BuildPackageGraph(#[from] package_graph::builder::Error), #[error(transparent)] Rewrite(#[from] RewriteError), diff --git a/crates/turborepo-lib/src/engine/mod.rs b/crates/turborepo-lib/src/engine/mod.rs index 3e6b7ac712043..501051bb4ae2c 100644 --- a/crates/turborepo-lib/src/engine/mod.rs +++ b/crates/turborepo-lib/src/engine/mod.rs @@ -586,8 +586,11 @@ mod test { let scripts = if had_build { BTreeMap::from_iter( [ - ("build".to_string(), "echo built!".to_string()), - ("dev".to_string(), "echo running dev!".to_string()), + ("build".to_string(), Spanned::new("echo built!".to_string())), + ( + "dev".to_string(), + Spanned::new("echo running dev!".to_string()), + ), ] .into_iter(), ) diff --git a/crates/turborepo-lib/src/run/error.rs b/crates/turborepo-lib/src/run/error.rs index aca34ea786df5..706a3ba5a6e79 100644 --- a/crates/turborepo-lib/src/run/error.rs +++ b/crates/turborepo-lib/src/run/error.rs @@ -29,6 +29,7 @@ pub enum Error { #[diagnostic(transparent)] PackageJson(#[from] turborepo_repository::package_json::Error), #[error(transparent)] + #[diagnostic(transparent)] PackageManager(#[from] turborepo_repository::package_manager::Error), #[error(transparent)] #[diagnostic(transparent)] @@ -49,6 +50,7 @@ pub enum Error { #[error(transparent)] TaskHash(#[from] task_hash::Error), #[error(transparent)] + #[diagnostic(transparent)] Visitor(#[from] task_graph::VisitorError), #[error("error registering signal handler: {0}")] SignalHandler(std::io::Error), diff --git a/crates/turborepo-lib/src/run/summary/task_factory.rs b/crates/turborepo-lib/src/run/summary/task_factory.rs index e2bbaeb726a2d..4f3effccffd5a 100644 --- a/crates/turborepo-lib/src/run/summary/task_factory.rs +++ b/crates/turborepo-lib/src/run/summary/task_factory.rs @@ -114,6 +114,7 @@ impl<'a> TaskSummaryFactory<'a> { .package_json .scripts .get(task_id.task()) + .map(|script| script.as_inner()) .cloned() .unwrap_or_else(|| "".to_string()); diff --git a/crates/turborepo-lib/src/task_graph/visitor.rs b/crates/turborepo-lib/src/task_graph/visitor.rs index 773c342492c71..3852edf766f63 100644 --- a/crates/turborepo-lib/src/task_graph/visitor.rs +++ b/crates/turborepo-lib/src/task_graph/visitor.rs @@ -10,6 +10,7 @@ use console::{Style, StyledObject}; use either::Either; use futures::{stream::FuturesUnordered, StreamExt}; use itertools::Itertools; +use miette::{Diagnostic, NamedSource, SourceSpan}; use regex::Regex; use tokio::sync::{mpsc, oneshot}; use tracing::{debug, error, Instrument, Span}; @@ -67,7 +68,7 @@ pub struct Visitor<'a> { is_watch: bool, } -#[derive(Debug, thiserror::Error)] +#[derive(Debug, thiserror::Error, Diagnostic)] pub enum Error { #[error("cannot find package {package_name} for task {task_id}")] MissingPackage { @@ -77,7 +78,14 @@ pub enum Error { #[error( "root task {task_name} ({command}) looks like it invokes turbo and might cause a loop" )] - RecursiveTurbo { task_name: String, command: String }, + RecursiveTurbo { + task_name: String, + command: String, + #[label("task found here")] + span: Option, + #[source_code] + text: NamedSource, + }, #[error("Could not find definition for task")] MissingDefinition, #[error("error while executing engine: {0}")] @@ -186,9 +194,12 @@ impl<'a> Visitor<'a> { match command { Some(cmd) if info.package() == ROOT_PKG_NAME && turbo_regex().is_match(&cmd) => { package_task_event.track_error(TrackedErrors::RecursiveError); + let (span, text) = cmd.span_and_text("package.json"); return Err(Error::RecursiveTurbo { task_name: info.to_string(), command: cmd.to_string(), + span, + text, }); } _ => (), diff --git a/crates/turborepo-lib/src/turbo_json/mod.rs b/crates/turborepo-lib/src/turbo_json/mod.rs index eb4c483298b3c..db4045ba741e7 100644 --- a/crates/turborepo-lib/src/turbo_json/mod.rs +++ b/crates/turborepo-lib/src/turbo_json/mod.rs @@ -794,7 +794,7 @@ mod tests { #[test_case( None, PackageJson { - scripts: [("build".to_string(), "echo build".to_string())].into_iter().collect(), + scripts: [("build".to_string(), Spanned::new("echo build".to_string()))].into_iter().collect(), ..PackageJson::default() }, TurboJson { @@ -818,7 +818,7 @@ mod tests { } }"#), PackageJson { - scripts: [("test".to_string(), "echo test".to_string())].into_iter().collect(), + scripts: [("test".to_string(), Spanned::new("echo test".to_string()))].into_iter().collect(), ..PackageJson::default() }, TurboJson { diff --git a/crates/turborepo-repository/src/package_graph/builder.rs b/crates/turborepo-repository/src/package_graph/builder.rs index c7b068009b0b7..6adce3b9f9088 100644 --- a/crates/turborepo-repository/src/package_graph/builder.rs +++ b/crates/turborepo-repository/src/package_graph/builder.rs @@ -1,7 +1,4 @@ -use std::{ - backtrace::Backtrace, - collections::{BTreeMap, HashMap, HashSet}, -}; +use std::collections::{BTreeMap, HashMap, HashSet}; use miette::Diagnostic; use petgraph::graph::{Graph, NodeIndex}; @@ -36,11 +33,9 @@ pub struct PackageGraphBuilder<'a, T> { #[derive(Debug, Diagnostic, thiserror::Error)] pub enum Error { - #[error("could not resolve workspaces: {0}")] - PackageManager( - #[from] crate::package_manager::Error, - #[backtrace] Backtrace, - ), + #[error("could not resolve workspaces")] + #[diagnostic(transparent)] + PackageManager(#[from] crate::package_manager::Error), #[error( "Failed to add workspace \"{name}\" from \"{path}\", it already exists at \ \"{existing_path}\"" diff --git a/crates/turborepo-repository/src/package_graph/dep_splitter.rs b/crates/turborepo-repository/src/package_graph/dep_splitter.rs index 02cca9fcd04d2..bd8ff52311a0c 100644 --- a/crates/turborepo-repository/src/package_graph/dep_splitter.rs +++ b/crates/turborepo-repository/src/package_graph/dep_splitter.rs @@ -175,7 +175,7 @@ impl<'a> DependencyVersion<'a> { _ => { // If we got this far, then we need to check the workspace package version to // see it satisfies the dependencies range to determin whether - // or not its an internal or external dependency. + // or not it's an internal or external dependency. let constraint = node_semver::Range::parse(self.version); let version = node_semver::Version::parse(package_version); diff --git a/crates/turborepo-repository/src/package_json.rs b/crates/turborepo-repository/src/package_json.rs index 61de1d3fedde0..2618e7b1c1caa 100644 --- a/crates/turborepo-repository/src/package_json.rs +++ b/crates/turborepo-repository/src/package_json.rs @@ -1,4 +1,7 @@ -use std::collections::{BTreeMap, HashMap}; +use std::{ + collections::{BTreeMap, HashMap}, + sync::Arc, +}; use anyhow::Result; use biome_deserialize::{json::deserialize_from_json_str, Text}; @@ -8,7 +11,7 @@ use biome_json_parser::JsonParserOptions; use miette::Diagnostic; use serde::Serialize; use turbopath::{AbsoluteSystemPath, RelativeUnixPathBuf}; -use turborepo_errors::ParseDiagnostic; +use turborepo_errors::{ParseDiagnostic, Spanned, WithMetadata}; use turborepo_unescape::UnescapedString; #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize)] @@ -19,7 +22,7 @@ pub struct PackageJson { #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub package_manager: Option, + pub package_manager: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub dependencies: Option>, #[serde(skip_serializing_if = "Option::is_none")] @@ -29,7 +32,7 @@ pub struct PackageJson { #[serde(skip_serializing_if = "Option::is_none")] pub peer_dependencies: Option>, #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] - pub scripts: BTreeMap, + pub scripts: BTreeMap>, #[serde(skip_serializing_if = "Option::is_none")] pub resolutions: Option>, #[serde(skip_serializing_if = "Option::is_none")] @@ -53,12 +56,12 @@ pub struct PnpmConfig { pub struct RawPackageJson { pub name: Option, pub version: Option, - pub package_manager: Option, + pub package_manager: Option>, pub dependencies: Option>, pub dev_dependencies: Option>, pub optional_dependencies: Option>, pub peer_dependencies: Option>, - pub scripts: BTreeMap, + pub scripts: BTreeMap>, pub resolutions: Option>, pub pnpm: Option, // Unstructured fields kept for round trip capabilities @@ -85,12 +88,32 @@ pub enum Error { Parse(#[related] Vec), } +impl WithMetadata for RawPackageJson { + fn add_text(&mut self, text: Arc) { + if let Some(ref mut package_manager) = self.package_manager { + package_manager.add_text(text.clone()); + } + self.scripts + .iter_mut() + .for_each(|(_, v)| v.add_text(text.clone())); + } + + fn add_path(&mut self, path: Arc) { + if let Some(ref mut package_manager) = self.package_manager { + package_manager.add_path(path.clone()); + } + self.scripts + .iter_mut() + .for_each(|(_, v)| v.add_path(path.clone())); + } +} + impl From for PackageJson { fn from(raw: RawPackageJson) -> Self { Self { name: raw.name.map(|s| s.into()), version: raw.version.map(|s| s.into()), - package_manager: raw.package_manager.map(|s| s.into()), + package_manager: raw.package_manager.map(|s| s.map(|s| s.into())), dependencies: raw .dependencies .map(|m| m.into_iter().map(|(k, v)| (k, v.into())).collect()), @@ -106,7 +129,7 @@ impl From for PackageJson { scripts: raw .scripts .into_iter() - .map(|(k, v)| (k, v.into())) + .map(|(k, v)| (k, v.map(|v| v.into()))) .collect(), resolutions: raw .resolutions @@ -158,9 +181,12 @@ impl PackageJson { } // We expect a result if there are no errors - Ok(result - .expect("no parse errors produced but no result") - .into()) + let mut package_json = result.expect("no parse errors produced but no result"); + + package_json.add_path(path.into()); + package_json.add_text(contents.into()); + + Ok(package_json.into()) } // Utility method for easy construction of package.json during testing diff --git a/crates/turborepo-repository/src/package_manager/mod.rs b/crates/turborepo-repository/src/package_manager/mod.rs index 2f04c99de57ec..c0a54382af8d0 100644 --- a/crates/turborepo-repository/src/package_manager/mod.rs +++ b/crates/turborepo-repository/src/package_manager/mod.rs @@ -15,11 +15,14 @@ use bun::BunDetector; use globwalk::{fix_glob_pattern, ValidatedGlob}; use itertools::{Either, Itertools}; use lazy_regex::{lazy_regex, Lazy}; +use miette::{Diagnostic, NamedSource, SourceSpan}; +use node_semver::SemverError; use npm::NpmDetector; use regex::Regex; use serde::{Deserialize, Serialize}; use thiserror::Error; use turbopath::{AbsoluteSystemPath, AbsoluteSystemPathBuf, PathError, RelativeUnixPath}; +use turborepo_errors::Spanned; use turborepo_lockfiles::Lockfile; use wax::{Any, Glob, Program}; use which::which; @@ -262,7 +265,7 @@ impl From for Error { } } -#[derive(Debug, Error)] +#[derive(Debug, Error, Diagnostic)] pub enum Error { #[error("io error: {0}")] Io(#[from] std::io::Error, #[backtrace] backtrace::Backtrace), @@ -283,8 +286,15 @@ pub enum Error { #[error("We detected multiple package managers in your repository: {}. Please remove one \ of them.", managers.join(", "))] MultiplePackageManagers { managers: Vec }, - #[error(transparent)] - Semver(#[from] node_semver::SemverError), + #[error("invalid semantic version: {explanation}")] + #[diagnostic(code(invalid_semantic_version))] + InvalidVersion { + explanation: String, + #[label("version found here")] + span: Option, + #[source_code] + text: NamedSource, + }, #[error("{0}: {1}")] // this will be something like "cannot find binary: " Which(which::Error, String), @@ -293,9 +303,17 @@ pub enum Error { #[error(transparent)] Path(#[from] turbopath::PathError), #[error( - "We could not parse the packageManager field in package.json, expected: {0}, received: {1}" + "could not parse the packageManager field in package.json, expected to match regular \ + expression {pattern}" )] - InvalidPackageManager(String, String), + #[diagnostic(code(invalid_package_manager_field))] + InvalidPackageManager { + pattern: String, + #[label("invalid `packageManager` field")] + span: Option, + #[source_code] + text: NamedSource, + }, #[error(transparent)] WalkError(#[from] globwalk::WalkError), #[error("invalid workspace glob {0}: {1}")] @@ -309,8 +327,6 @@ pub enum Error { WorkspaceDiscovery(#[from] discovery::Error), #[error("missing packageManager field in package.json")] MissingPackageManager, - #[error("{0} set in packageManager is not a supported package manager")] - UnsupportedPackageManager(String), } impl From for Error { @@ -441,13 +457,23 @@ impl PackageManager { }; let (manager, version) = Self::parse_package_manager_string(package_manager)?; - let version = version.parse()?; + let version = version.parse().map_err(|err: SemverError| { + let (span, text) = package_manager.span_and_text("package.json"); + Error::InvalidVersion { + explanation: err.to_string(), + span, + text, + } + })?; + match manager { "npm" => Ok(PackageManager::Npm), "bun" => Ok(PackageManager::Bun), "yarn" => Ok(YarnDetector::detect_berry_or_yarn(&version)?), "pnpm" => Ok(PnpmDetector::detect_pnpm6_or_pnpm(&version)?), - _ => Err(Error::UnsupportedPackageManager(manager.to_owned())), + _ => unreachable!( + "found invalid package manager even though regex should have caught it" + ), } } @@ -482,16 +508,20 @@ impl PackageManager { Self::get_package_manager(package_json).or_else(|_| Self::detect_package_manager(repo_root)) } - pub(crate) fn parse_package_manager_string(manager: &str) -> Result<(&str, &str), Error> { + pub(crate) fn parse_package_manager_string( + manager: &Spanned, + ) -> Result<(&str, &str), Error> { if let Some(captures) = PACKAGE_MANAGER_PATTERN.captures(manager) { let manager = captures.name("manager").unwrap().as_str(); let version = captures.name("version").unwrap().as_str(); Ok((manager, version)) } else { - Err(Error::InvalidPackageManager( - PACKAGE_MANAGER_PATTERN.to_string(), - manager.to_string(), - )) + let (span, text) = manager.span_and_text("package.json"); + Err(Error::InvalidPackageManager { + pattern: PACKAGE_MANAGER_PATTERN.to_string(), + span, + text, + }) } } @@ -631,7 +661,7 @@ mod tests { struct TestCase { name: String, - package_manager: String, + package_manager: Spanned, expected_manager: String, expected_version: String, expected_error: bool, @@ -729,70 +759,70 @@ mod tests { let tests = vec![ TestCase { name: "errors with a tag version".to_owned(), - package_manager: "npm@latest".to_owned(), + package_manager: Spanned::new("npm@latest".to_owned()), expected_manager: "".to_owned(), expected_version: "".to_owned(), expected_error: true, }, TestCase { name: "errors with no version".to_owned(), - package_manager: "npm".to_owned(), + package_manager: Spanned::new("npm".to_owned()), expected_manager: "".to_owned(), expected_version: "".to_owned(), expected_error: true, }, TestCase { name: "requires fully-qualified semver versions (one digit)".to_owned(), - package_manager: "npm@1".to_owned(), + package_manager: Spanned::new("npm@1".to_owned()), expected_manager: "".to_owned(), expected_version: "".to_owned(), expected_error: true, }, TestCase { name: "requires fully-qualified semver versions (two digits)".to_owned(), - package_manager: "npm@1.2".to_owned(), + package_manager: Spanned::new("npm@1.2".to_owned()), expected_manager: "".to_owned(), expected_version: "".to_owned(), expected_error: true, }, TestCase { name: "supports custom labels".to_owned(), - package_manager: "npm@1.2.3-alpha.1".to_owned(), + package_manager: Spanned::new("npm@1.2.3-alpha.1".to_owned()), expected_manager: "npm".to_owned(), expected_version: "1.2.3-alpha.1".to_owned(), expected_error: false, }, TestCase { name: "only supports specified package managers".to_owned(), - package_manager: "pip@1.2.3".to_owned(), + package_manager: Spanned::new("pip@1.2.3".to_owned()), expected_manager: "".to_owned(), expected_version: "".to_owned(), expected_error: true, }, TestCase { name: "supports npm".to_owned(), - package_manager: "npm@0.0.1".to_owned(), + package_manager: Spanned::new("npm@0.0.1".to_owned()), expected_manager: "npm".to_owned(), expected_version: "0.0.1".to_owned(), expected_error: false, }, TestCase { name: "supports pnpm".to_owned(), - package_manager: "pnpm@0.0.1".to_owned(), + package_manager: Spanned::new("pnpm@0.0.1".to_owned()), expected_manager: "pnpm".to_owned(), expected_version: "0.0.1".to_owned(), expected_error: false, }, TestCase { name: "supports yarn".to_owned(), - package_manager: "yarn@111.0.1".to_owned(), + package_manager: Spanned::new("yarn@111.0.1".to_owned()), expected_manager: "yarn".to_owned(), expected_version: "111.0.1".to_owned(), expected_error: false, }, TestCase { name: "supports bun".to_owned(), - package_manager: "bun@1.0.1".to_owned(), + package_manager: Spanned::new("bun@1.0.1".to_owned()), expected_manager: "bun".to_owned(), expected_version: "1.0.1".to_owned(), expected_error: false, @@ -814,29 +844,29 @@ mod tests { #[test] fn test_read_package_manager() -> Result<(), Error> { let mut package_json = PackageJson { - package_manager: Some("npm@8.19.4".to_string()), + package_manager: Some(Spanned::new("npm@8.19.4".to_string())), ..Default::default() }; let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Npm); - package_json.package_manager = Some("yarn@2.0.0".to_string()); + package_json.package_manager = Some(Spanned::new("yarn@2.0.0".to_string())); let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Berry); - package_json.package_manager = Some("yarn@1.9.0".to_string()); + package_json.package_manager = Some(Spanned::new("yarn@1.9.0".to_string())); let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Yarn); - package_json.package_manager = Some("pnpm@6.0.0".to_string()); + package_json.package_manager = Some(Spanned::new("pnpm@6.0.0".to_string())); let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Pnpm6); - package_json.package_manager = Some("pnpm@7.2.0".to_string()); + package_json.package_manager = Some(Spanned::new("pnpm@7.2.0".to_string())); let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Pnpm); - package_json.package_manager = Some("bun@1.0.1".to_string()); + package_json.package_manager = Some(Spanned::new("bun@1.0.1".to_string())); let package_manager = PackageManager::read_package_manager(&package_json)?; assert_eq!(package_manager, PackageManager::Bun); diff --git a/crates/turborepo-repository/src/package_manager/pnpm.rs b/crates/turborepo-repository/src/package_manager/pnpm.rs index 6a51288d230a5..e89bea7163fff 100644 --- a/crates/turborepo-repository/src/package_manager/pnpm.rs +++ b/crates/turborepo-repository/src/package_manager/pnpm.rs @@ -24,8 +24,8 @@ impl<'a> PnpmDetector<'a> { } pub fn detect_pnpm6_or_pnpm(version: &Version) -> Result { - let pnpm6_constraint: Range = "<7.0.0".parse()?; - let pnpm9_constraint: Range = ">=9.0.0-alpha.0".parse()?; + let pnpm6_constraint: Range = "<7.0.0".parse().expect("valid version"); + let pnpm9_constraint: Range = ">=9.0.0-alpha.0".parse().expect("valid version"); if pnpm6_constraint.satisfies(version) { Ok(PackageManager::Pnpm6) } else if pnpm9_constraint.satisfies(version) { diff --git a/crates/turborepo-repository/src/package_manager/yarn.rs b/crates/turborepo-repository/src/package_manager/yarn.rs index cf4b27e75b12e..f81d31d145dc0 100644 --- a/crates/turborepo-repository/src/package_manager/yarn.rs +++ b/crates/turborepo-repository/src/package_manager/yarn.rs @@ -1,5 +1,6 @@ use std::process::Command; +use miette::NamedSource; use node_semver::{Range, Version}; use turbopath::{AbsoluteSystemPath, RelativeUnixPath}; use which::which; @@ -32,11 +33,18 @@ impl<'a> YarnDetector<'a> { .current_dir(self.repo_root) .output()?; let yarn_version_output = String::from_utf8(output.stdout)?; - Ok(yarn_version_output.trim().parse()?) + yarn_version_output + .trim() + .parse() + .map_err(|err| Error::InvalidVersion { + explanation: format!("{} {}", yarn_version_output, err), + span: None, + text: NamedSource::new("yarn --version", yarn_version_output), + }) } pub fn detect_berry_or_yarn(version: &Version) -> Result { - let berry_constraint: Range = ">=2.0.0-0".parse()?; + let berry_constraint: Range = ">=2.0.0-0".parse().expect("valid version"); if berry_constraint.satisfies(version) { Ok(PackageManager::Berry) } else { diff --git a/turborepo-tests/integration/fixtures/basic_monorepo/package.json b/turborepo-tests/integration/fixtures/basic_monorepo/package.json index b3601d4b13a2c..e86a3bf3c329b 100644 --- a/turborepo-tests/integration/fixtures/basic_monorepo/package.json +++ b/turborepo-tests/integration/fixtures/basic_monorepo/package.json @@ -3,6 +3,7 @@ "scripts": { "something": "turbo run build" }, + "packageManager": "bower", "workspaces": [ "apps/**", "packages/**" diff --git a/turborepo-tests/integration/tests/invalid-package-json.t b/turborepo-tests/integration/tests/invalid-package-json.t index de27f0df1066f..cc2a586a0d4c3 100644 --- a/turborepo-tests/integration/tests/invalid-package-json.t +++ b/turborepo-tests/integration/tests/invalid-package-json.t @@ -2,12 +2,59 @@ Setup $ . ${TESTDIR}/../../helpers/setup_integration_test.sh Clear name field $ jq '.name = ""' apps/my-app/package.json > package.json.new + $ mv apps/my-app/package.json apps/my-app/package.json.old $ mv package.json.new apps/my-app/package.json Build should fail due to missing name field $ ${TURBO} build 1> ERR [1] $ grep -F --quiet 'x package.json must have a name field:' ERR +Restore name field + $ mv apps/my-app/package.json.old apps/my-app/package.json + +Clear add invalid packageManager field + $ jq '.packageManager = "bower@8.19.4"' package.json > package.json.new + $ mv package.json.new package.json + +Build should fail due to invalid packageManager field (sed removes the square brackets) + $ ${TURBO} build 2>&1 | sed 's/\[\([^]]*\)\]/\\1/g' + invalid_package_manager_field + + x could not resolve workspaces + `-> could not parse the packageManager field in package.json, expected to + match regular expression (?Pbun|npm|pnpm|yarn)@(?P\d+ + \.\d+\.\d+(-.+)?) + ,-\1 + 5 | }, + 6 | "packageManager": "bower@8.19.4", + : ^^^^^^^|^^^^^^ + : `-- invalid `packageManager` field + 7 | "workspaces": [ + `---- + + +Add invalid packageManager field that passes the regex. + $ jq '.packageManager = "npm@0.3.211111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"' package.json > package.json.new + $ mv package.json.new package.json + + $ ${TURBO} build 2>&1 | sed 's/\[\([^]]*\)\]/\(\1)/g' + invalid_semantic_version + + x could not resolve workspaces + `-> invalid semantic version: Failed to parse an integer component of a + semver string: number too large to fit in target type + ,-\(.*package.json:5:1\) (re) + 5 | }, + 6 | "packageManager": "npm@0.3.211111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + : `-- version found here + 7 | "workspaces": [ + `---- + +Restore packageManager field + $ jq '.packageManager = "npm@8.19.4"' package.json > package.json.new + $ mv package.json.new package.json + Add a trailing comma $ echo "{ \"name\": \"foobar\", }" > package.json.new $ mv package.json.new apps/my-app/package.json @@ -23,3 +70,6 @@ Build should fail due to trailing comma (sed replaces square brackets with paren : ^ `---- + + + diff --git a/turborepo-tests/integration/tests/recursive-turbo.t b/turborepo-tests/integration/tests/recursive-turbo.t new file mode 100644 index 0000000000000..910276dffda71 --- /dev/null +++ b/turborepo-tests/integration/tests/recursive-turbo.t @@ -0,0 +1,22 @@ +Setup + $ . ${TESTDIR}/../../helpers/setup_integration_test.sh + +sed replaces the square brackets with parentheses so prysk can parse the file path + $ ${TURBO} something 2>&1 | sed 's/\[\([^]]*\)\]/\(\1)/g' + \xe2\x80\xa2 Packages in scope: //, another, my-app, util (esc) + \xe2\x80\xa2 Running something in 4 packages (esc) + \xe2\x80\xa2 Remote caching disabled (esc) + x root task //#something (turbo run build) looks like it invokes turbo and + | might cause a loop + ,-\(.*package.json:3:1\) (re) + 3 | "scripts": { + 4 | "something": "turbo run build" + : ^^^^^^^^|^^^^^^^^ + : `-- task found here + 5 | }, + `---- + + + + + From 925ed6f9276dc54c4d68a22192f7e86bbac42a93 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Fri, 19 Jul 2024 13:43:34 -0400 Subject: [PATCH 35/73] feat(turborepo): turbo ls with filter (#8779) ### Description Implements `turbo ls`, a command that lets you list your packages and get information about them. Uses the existing `turbo info` code. To keep the tests for configuration and package manager inference, I also added a hidden `turbo config` command that lists config in JSON. ### Testing Instructions Added tests for `ls` and kept existing ones for `config` --- crates/turborepo-lib/src/cli/error.rs | 5 +- crates/turborepo-lib/src/cli/mod.rs | 47 +++-- crates/turborepo-lib/src/commands/config.rs | 53 +++++ crates/turborepo-lib/src/commands/info.rs | 185 ------------------ crates/turborepo-lib/src/commands/ls.rs | 181 +++++++++++++++++ crates/turborepo-lib/src/commands/mod.rs | 3 +- crates/turborepo-lib/src/run/mod.rs | 12 ++ .../integration/tests/command-info.t | 23 --- .../integration/tests/command-ls.t | 37 ++++ turborepo-tests/integration/tests/config.t | 38 ++-- turborepo-tests/integration/tests/no-args.t | 1 + .../integration/tests/package-manager.t | 10 +- .../integration/tests/turbo-help.t | 2 + 13 files changed, 343 insertions(+), 254 deletions(-) create mode 100644 crates/turborepo-lib/src/commands/config.rs delete mode 100644 crates/turborepo-lib/src/commands/info.rs create mode 100644 crates/turborepo-lib/src/commands/ls.rs delete mode 100644 turborepo-tests/integration/tests/command-info.t create mode 100644 turborepo-tests/integration/tests/command-ls.t diff --git a/crates/turborepo-lib/src/cli/error.rs b/crates/turborepo-lib/src/cli/error.rs index 712d850136de6..673c7a0f40b41 100644 --- a/crates/turborepo-lib/src/cli/error.rs +++ b/crates/turborepo-lib/src/cli/error.rs @@ -8,7 +8,7 @@ use turborepo_telemetry::events::command::CommandEventBuilder; use turborepo_ui::{color, BOLD, GREY}; use crate::{ - commands::{bin, generate, prune, run::get_signal, CommandBase}, + commands::{bin, generate, ls, prune, run::get_signal, CommandBase}, daemon::DaemonError, rewrite_json::RewriteError, run, @@ -42,6 +42,9 @@ pub enum Error { Generate(#[from] generate::Error), #[error(transparent)] #[diagnostic(transparent)] + Ls(#[from] ls::Error), + #[error(transparent)] + #[diagnostic(transparent)] Prune(#[from] prune::Error), #[error(transparent)] PackageJson(#[from] turborepo_repository::package_json::Error), diff --git a/crates/turborepo-lib/src/cli/mod.rs b/crates/turborepo-lib/src/cli/mod.rs index bb776c1ee4db8..e804c4ee09c7d 100644 --- a/crates/turborepo-lib/src/cli/mod.rs +++ b/crates/turborepo-lib/src/cli/mod.rs @@ -9,7 +9,7 @@ use clap::{ use clap_complete::{generate, Shell}; pub use error::Error; use serde::Serialize; -use tracing::{debug, error}; +use tracing::{debug, error, log::warn}; use turbopath::AbsoluteSystemPathBuf; use turborepo_api_client::AnonAPIClient; use turborepo_repository::inference::{RepoMode, RepoState}; @@ -26,8 +26,8 @@ use turborepo_ui::UI; use crate::{ cli::error::print_potential_tasks, commands::{ - bin, daemon, generate, info, link, login, logout, prune, run, scan, telemetry, unlink, - CommandBase, + bin, config, daemon, generate, link, login, logout, ls, prune, run, scan, telemetry, + unlink, CommandBase, }, get_version, run::watch::WatchClient, @@ -491,13 +491,20 @@ pub enum Command { }, /// Turbo your monorepo by running a number of 'repo lints' to /// identify common issues, suggest fixes, and improve performance. - Scan {}, + Scan, #[clap(hide = true)] - Info { - workspace: Option, - // We output turbo info as json. Currently just for internal testing - #[clap(long)] - json: bool, + Config, + /// EXPERIMENTAL: List packages in your monorepo. + Ls { + /// Use the given selector to specify package(s) to act as + /// entry points. The syntax mirrors pnpm's syntax, and + /// additional documentation and examples can be found in + /// turbo's documentation https://turbo.build/repo/docs/reference/command-line-reference/run#--filter + #[clap(short = 'F', long, group = "scope-filter-group")] + filter: Vec, + /// Get insight into a specific package, such as + /// its dependencies and tasks + packages: Vec, }, /// Link your local directory to a Vercel organization and enable remote /// caching. @@ -1134,14 +1141,20 @@ pub async fn run( Ok(1) } } - Command::Info { workspace, json } => { - CommandEventBuilder::new("info") - .with_parent(&root_telemetry) - .track_call(); - let json = *json; - let workspace = workspace.clone(); - let mut base = CommandBase::new(cli_args, repo_root, version, ui); - info::run(&mut base, workspace.as_deref(), json).await?; + Command::Config => { + let base = CommandBase::new(cli_args.clone(), repo_root, version, ui); + config::run(base).await?; + Ok(0) + } + Command::Ls { filter, packages } => { + warn!("ls command is experimental and may change in the future"); + let event = CommandEventBuilder::new("info").with_parent(&root_telemetry); + + event.track_call(); + let filter = filter.clone(); + let packages = packages.clone(); + let base = CommandBase::new(cli_args, repo_root, version, ui); + ls::run(base, packages, event, filter).await?; Ok(0) } diff --git a/crates/turborepo-lib/src/commands/config.rs b/crates/turborepo-lib/src/commands/config.rs new file mode 100644 index 0000000000000..f3d3d04dbaa68 --- /dev/null +++ b/crates/turborepo-lib/src/commands/config.rs @@ -0,0 +1,53 @@ +use serde::Serialize; +use turborepo_repository::{ + package_graph::PackageGraph, package_json::PackageJson, package_manager::PackageManager, +}; + +use crate::{cli, commands::CommandBase}; + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct ConfigOutput<'a> { + api_url: &'a str, + login_url: &'a str, + team_slug: Option<&'a str>, + team_id: Option<&'a str>, + signature: bool, + preflight: bool, + timeout: u64, + upload_timeout: u64, + enabled: bool, + spaces_id: Option<&'a str>, + ui: bool, + package_manager: PackageManager, +} + +pub async fn run(base: CommandBase) -> Result<(), cli::Error> { + let config = base.config()?; + let root_package_json = PackageJson::load(&base.repo_root.join_component("package.json"))?; + + let package_graph = PackageGraph::builder(&base.repo_root, root_package_json) + .build() + .await?; + + let package_manager = package_graph.package_manager(); + + println!( + "{}", + serde_json::to_string_pretty(&ConfigOutput { + api_url: config.api_url(), + login_url: config.login_url(), + team_slug: config.team_slug(), + team_id: config.team_id(), + signature: config.signature(), + preflight: config.preflight(), + timeout: config.timeout(), + upload_timeout: config.upload_timeout(), + enabled: config.enabled(), + spaces_id: config.spaces_id(), + ui: config.ui(), + package_manager: *package_manager, + })? + ); + Ok(()) +} diff --git a/crates/turborepo-lib/src/commands/info.rs b/crates/turborepo-lib/src/commands/info.rs deleted file mode 100644 index 9e65fae22238e..0000000000000 --- a/crates/turborepo-lib/src/commands/info.rs +++ /dev/null @@ -1,185 +0,0 @@ -//! A command for outputting information about a turborepo. -//! Currently just for internal use (not a public command) -//! Can output in either text or JSON -//! Different than run summary or dry run because it can include -//! sensitive data like your auth token -use serde::Serialize; -use turbopath::AnchoredSystemPath; -use turborepo_repository::{ - package_graph::{PackageGraph, PackageName, PackageNode}, - package_json::PackageJson, - package_manager::PackageManager, -}; -use turborepo_ui::GREY; - -use crate::{cli, commands::CommandBase, config::ConfigurationOptions}; - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -struct InfoConfig { - api_url: Option, - login_url: Option, - team_slug: Option, - team_id: Option, - token: Option, - signature: Option, - preflight: Option, - timeout: Option, - enabled: Option, - spaces_id: Option, -} - -impl<'a> From<&'a ConfigurationOptions> for InfoConfig { - fn from(config: &'a ConfigurationOptions) -> Self { - Self { - api_url: config.api_url.clone(), - login_url: config.login_url.clone(), - team_slug: config.team_slug.clone(), - team_id: config.team_id.clone(), - token: config.token.clone(), - signature: config.signature, - preflight: config.preflight, - timeout: config.timeout, - enabled: config.enabled, - spaces_id: config.spaces_id.clone(), - } - } -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -struct RepositoryDetails<'a> { - config: InfoConfig, - package_manager: &'a PackageManager, - workspaces: Vec<(&'a PackageName, RepositoryWorkspaceDetails<'a>)>, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -struct RepositoryWorkspaceDetails<'a> { - path: &'a AnchoredSystemPath, -} - -#[derive(Serialize)] -struct WorkspaceDetails<'a> { - name: &'a str, - dependencies: Vec<&'a str>, -} - -pub async fn run( - base: &mut CommandBase, - workspace: Option<&str>, - json: bool, -) -> Result<(), cli::Error> { - let root_package_json = PackageJson::load(&base.repo_root.join_component("package.json"))?; - - let package_graph = PackageGraph::builder(&base.repo_root, root_package_json) - .build() - .await?; - - let config = base.config()?; - - if let Some(workspace) = workspace { - let workspace_details = WorkspaceDetails::new(&package_graph, workspace); - if json { - println!("{}", serde_json::to_string_pretty(&workspace_details)?); - } else { - workspace_details.print(); - } - } else { - let repo_details = RepositoryDetails::new(&package_graph, config); - if json { - println!("{}", serde_json::to_string_pretty(&repo_details)?); - } else { - repo_details.print()?; - } - } - - Ok(()) -} - -impl<'a> RepositoryDetails<'a> { - fn new(package_graph: &'a PackageGraph, config: &'a ConfigurationOptions) -> Self { - let mut workspaces: Vec<_> = package_graph - .packages() - .map(|(workspace_name, workspace_info)| { - let workspace_details = RepositoryWorkspaceDetails { - path: workspace_info.package_path(), - }; - - (workspace_name, workspace_details) - }) - .collect(); - workspaces.sort_by(|a, b| a.0.cmp(b.0)); - - Self { - config: config.into(), - package_manager: package_graph.package_manager(), - workspaces, - } - } - fn print(&self) -> Result<(), cli::Error> { - let is_logged_in = self.config.token.is_some(); - let is_linked = self.config.team_id.is_some(); - let team_slug = self.config.team_slug.as_deref(); - - match (is_logged_in, is_linked, team_slug) { - (true, true, Some(slug)) => println!("You are logged in and linked to {}", slug), - (true, true, None) => println!("You are logged in and linked"), - (true, false, _) => println!("You are logged in but not linked"), - (false, _, _) => println!("You are not logged in"), - } - - // We subtract 1 for the root workspace - println!( - "{} packages found in workspace\n", - self.workspaces.len() - 1 - ); - - for (workspace_name, entry) in &self.workspaces { - if matches!(workspace_name, PackageName::Root) { - continue; - } - println!("- {} {}", workspace_name, GREY.apply_to(entry.path)); - } - - Ok(()) - } -} - -impl<'a> WorkspaceDetails<'a> { - fn new(package_graph: &'a PackageGraph, workspace_name: &'a str) -> Self { - let workspace_node = match workspace_name { - "//" => PackageNode::Root, - name => PackageNode::Workspace(PackageName::Other(name.to_string())), - }; - - let transitive_dependencies = package_graph.transitive_closure(Some(&workspace_node)); - - let mut workspace_dep_names: Vec<&str> = transitive_dependencies - .into_iter() - .filter_map(|dependency| match dependency { - PackageNode::Root | PackageNode::Workspace(PackageName::Root) => Some("root"), - PackageNode::Workspace(PackageName::Other(dep_name)) - if dep_name == workspace_name => - { - None - } - PackageNode::Workspace(PackageName::Other(dep_name)) => Some(dep_name.as_str()), - }) - .collect(); - workspace_dep_names.sort(); - - Self { - name: workspace_name, - dependencies: workspace_dep_names, - } - } - - fn print(&self) { - println!("{} depends on:", self.name); - for dep_name in &self.dependencies { - println!("- {}", dep_name); - } - } -} diff --git a/crates/turborepo-lib/src/commands/ls.rs b/crates/turborepo-lib/src/commands/ls.rs new file mode 100644 index 0000000000000..8de3d80c64ef7 --- /dev/null +++ b/crates/turborepo-lib/src/commands/ls.rs @@ -0,0 +1,181 @@ +//! A command for outputting info about packages and tasks in a turborepo. + +use miette::Diagnostic; +use thiserror::Error; +use turbopath::AnchoredSystemPath; +use turborepo_repository::{ + package_graph::{PackageName, PackageNode}, + package_manager::PackageManager, +}; +use turborepo_telemetry::events::command::CommandEventBuilder; +use turborepo_ui::{color, cprint, cprintln, BOLD, BOLD_GREEN, GREY, UI}; + +use crate::{ + cli, + cli::{Command, ExecutionArgs}, + commands::{run::get_signal, CommandBase}, + run::{builder::RunBuilder, Run}, + signal::SignalHandler, +}; + +#[derive(Debug, Error, Diagnostic)] +pub enum Error { + #[error("package `{package}` not found")] + PackageNotFound { package: String }, +} + +struct RepositoryDetails<'a> { + ui: UI, + package_manager: &'a PackageManager, + packages: Vec<(&'a PackageName, &'a AnchoredSystemPath)>, +} + +struct PackageDetails<'a> { + ui: UI, + name: &'a str, + tasks: Vec<(&'a str, &'a str)>, + dependencies: Vec<&'a str>, +} + +pub async fn run( + mut base: CommandBase, + packages: Vec, + telemetry: CommandEventBuilder, + filter: Vec, +) -> Result<(), cli::Error> { + let signal = get_signal()?; + let handler = SignalHandler::new(signal); + + // We fake a run command, so we can construct a `Run` type + base.args_mut().command = Some(Command::Run { + run_args: Box::default(), + execution_args: Box::new(ExecutionArgs { + filter, + ..Default::default() + }), + }); + + let run_builder = RunBuilder::new(base)?; + let run = run_builder.build(&handler, telemetry).await?; + + if packages.is_empty() { + RepositoryDetails::new(&run).print()?; + } else { + for package in packages { + let package_details = PackageDetails::new(&run, &package)?; + package_details.print(); + } + } + + Ok(()) +} + +impl<'a> RepositoryDetails<'a> { + fn new(run: &'a Run) -> Self { + let ui = run.ui(); + let package_graph = run.pkg_dep_graph(); + let filtered_pkgs = run.filtered_pkgs(); + + let mut packages: Vec<_> = package_graph + .packages() + .filter_map(|(package_name, package_info)| { + if !filtered_pkgs.contains(package_name) { + return None; + } + + Some((package_name, package_info.package_path())) + }) + .collect(); + packages.sort_by(|a, b| a.0.cmp(b.0)); + + Self { + ui, + package_manager: package_graph.package_manager(), + packages, + } + } + fn print(&self) -> Result<(), cli::Error> { + if self.packages.len() == 1 { + cprintln!(self.ui, BOLD, "{} package\n", self.packages.len()); + } else { + cprintln!(self.ui, BOLD, "{} packages\n", self.packages.len()); + } + + for (package_name, entry) in &self.packages { + if matches!(package_name, PackageName::Root) { + continue; + } + println!(" {} {}", package_name, GREY.apply_to(entry)); + } + + Ok(()) + } +} + +impl<'a> PackageDetails<'a> { + fn new(run: &'a Run, package: &'a str) -> Result { + let ui = run.ui(); + let package_graph = run.pkg_dep_graph(); + let package_node = match package { + "//" => PackageNode::Root, + name => PackageNode::Workspace(PackageName::Other(name.to_string())), + }; + + let package_json = package_graph + .package_json(package_node.as_package_name()) + .ok_or_else(|| Error::PackageNotFound { + package: package.to_string(), + })?; + + let transitive_dependencies = package_graph.transitive_closure(Some(&package_node)); + + let mut package_dep_names: Vec<&str> = transitive_dependencies + .into_iter() + .filter_map(|dependency| match dependency { + PackageNode::Root | PackageNode::Workspace(PackageName::Root) => None, + PackageNode::Workspace(PackageName::Other(dep_name)) if dep_name == package => None, + PackageNode::Workspace(PackageName::Other(dep_name)) => Some(dep_name.as_str()), + }) + .collect(); + package_dep_names.sort(); + + Ok(Self { + ui, + name: package, + dependencies: package_dep_names, + tasks: package_json + .scripts + .iter() + .map(|(name, command)| (name.as_str(), command.as_str())) + .collect(), + }) + } + + fn print(&self) { + let name = color!(self.ui, BOLD_GREEN, "{}", self.name); + let depends_on = color!(self.ui, BOLD, "depends on"); + let dependencies = if self.dependencies.is_empty() { + "".to_string() + } else { + self.dependencies.join(", ") + }; + println!( + "{} {}: {}", + name, + depends_on, + color!(self.ui, GREY, "{}", dependencies) + ); + println!(); + + cprint!(self.ui, BOLD, "tasks:"); + if self.tasks.is_empty() { + println!(" "); + } else { + println!(); + } + for (name, command) in &self.tasks { + println!(" {}: {}", name, color!(self.ui, GREY, "{}", command)); + } + println!(); + } +} diff --git a/crates/turborepo-lib/src/commands/mod.rs b/crates/turborepo-lib/src/commands/mod.rs index 57eafed677f0f..bd0d980bebab1 100644 --- a/crates/turborepo-lib/src/commands/mod.rs +++ b/crates/turborepo-lib/src/commands/mod.rs @@ -12,12 +12,13 @@ use crate::{ }; pub(crate) mod bin; +pub(crate) mod config; pub(crate) mod daemon; pub(crate) mod generate; -pub(crate) mod info; pub(crate) mod link; pub(crate) mod login; pub(crate) mod logout; +pub(crate) mod ls; pub(crate) mod prune; pub(crate) mod run; pub(crate) mod scan; diff --git a/crates/turborepo-lib/src/run/mod.rs b/crates/turborepo-lib/src/run/mod.rs index e95d142efe156..16cf9731c5d60 100644 --- a/crates/turborepo-lib/src/run/mod.rs +++ b/crates/turborepo-lib/src/run/mod.rs @@ -160,6 +160,18 @@ impl Run { Ok(tasks) } + pub fn pkg_dep_graph(&self) -> &PackageGraph { + &self.pkg_dep_graph + } + + pub fn filtered_pkgs(&self) -> &HashSet { + &self.filtered_pkgs + } + + pub fn ui(&self) -> UI { + self.ui + } + pub fn has_experimental_ui(&self) -> bool { self.experimental_ui } diff --git a/turborepo-tests/integration/tests/command-info.t b/turborepo-tests/integration/tests/command-info.t deleted file mode 100644 index 2be68da5e5bdb..0000000000000 --- a/turborepo-tests/integration/tests/command-info.t +++ /dev/null @@ -1,23 +0,0 @@ -Setup - $ . ${TESTDIR}/../../helpers/setup_integration_test.sh - -Run info - $ ${TURBO} info - You are not logged in - 3 packages found in workspace - - - another packages(\/|\\)another (re) - - my-app apps(\/|\\)my-app (re) - - util packages(\/|\\)util (re) - - -Run info on package `another` - $ ${TURBO} info another - another depends on: - - root - -Run info on package `my-app` - $ ${TURBO} info my-app - my-app depends on: - - root - - util diff --git a/turborepo-tests/integration/tests/command-ls.t b/turborepo-tests/integration/tests/command-ls.t new file mode 100644 index 0000000000000..d0ab97647f9e2 --- /dev/null +++ b/turborepo-tests/integration/tests/command-ls.t @@ -0,0 +1,37 @@ +Setup + $ . ${TESTDIR}/../../helpers/setup_integration_test.sh + +Run info + $ ${TURBO} ls + WARNING ls command is experimental and may change in the future + 3 packages + + another packages[\/\\]another (re) + my-app apps[\/\\]my-app (re) + util packages[\/\\]util (re) + +Run info with filter + $ ${TURBO} ls -F my-app... + WARNING ls command is experimental and may change in the future + 2 packages + + my-app apps[\/\\]my-app (re) + util packages[\/\\]util (re) + +Run info on package `another` + $ ${TURBO} ls another + WARNING ls command is experimental and may change in the future + another depends on: + + tasks: + + +Run info on package `my-app` + $ ${TURBO} ls my-app + WARNING ls command is experimental and may change in the future + my-app depends on: util + + tasks: + build: echo building + maybefails: exit 4 + diff --git a/turborepo-tests/integration/tests/config.t b/turborepo-tests/integration/tests/config.t index 01913b55f604b..5428994f5a87e 100644 --- a/turborepo-tests/integration/tests/config.t +++ b/turborepo-tests/integration/tests/config.t @@ -2,46 +2,40 @@ Setup $ . ${TESTDIR}/../../helpers/setup_integration_test.sh Run test run - $ ${TURBO} info --json | jq .config + $ ${TURBO} config { - "apiUrl": null, - "loginUrl": null, + "apiUrl": "https://vercel.com/api", + "loginUrl": "https://vercel.com", "teamSlug": null, "teamId": null, - "token": null, - "signature": null, - "preflight": null, - "timeout": null, - "enabled": null, - "spacesId": null + "signature": false, + "preflight": false, + "timeout": 30, + "uploadTimeout": 60, + "enabled": true, + "spacesId": null, + "ui": false, + "packageManager": "npm" } Run test run with api overloaded - $ ${TURBO} info --json --api http://localhost:8000 | jq .config.apiUrl + $ ${TURBO} config --api http://localhost:8000 | jq .apiUrl "http://localhost:8000" -Run test run with token overloaded - $ ${TURBO} info --json --token 1234567890 | jq .config.token - "1234567890" - -Run test run with token overloaded from both TURBO_TOKEN and VERCEL_ARTIFACTS_TOKEN - $ TURBO_TOKEN=turbo VERCEL_ARTIFACTS_TOKEN=vercel ${TURBO} info --json | jq .config.token - "vercel" - Run test run with team overloaded - $ ${TURBO} info --json --team vercel | jq .config.teamSlug + $ ${TURBO} config --team vercel | jq .teamSlug "vercel" Run test run with team overloaded from both env and flag (flag should take precedence) - $ TURBO_TEAM=vercel ${TURBO} info --json --team turbo | jq .config.teamSlug + $ TURBO_TEAM=vercel ${TURBO} config --team turbo | jq .teamSlug "turbo" Run test run with remote cache timeout env variable set - $ TURBO_REMOTE_CACHE_TIMEOUT=123 ${TURBO} info --json | jq .config.timeout + $ TURBO_REMOTE_CACHE_TIMEOUT=123 ${TURBO} config | jq .timeout 123 Run test run with remote cache timeout from both env and flag (flag should take precedence) - $ TURBO_REMOTE_CACHE_TIMEOUT=123 ${TURBO} info --json --remote-cache-timeout 456 | jq .config.timeout + $ TURBO_REMOTE_CACHE_TIMEOUT=123 ${TURBO} config --remote-cache-timeout 456 | jq .timeout 456 Use our custom turbo config with an invalid env var diff --git a/turborepo-tests/integration/tests/no-args.t b/turborepo-tests/integration/tests/no-args.t index 6e77b3227e8ad..0d74331d3fdee 100644 --- a/turborepo-tests/integration/tests/no-args.t +++ b/turborepo-tests/integration/tests/no-args.t @@ -14,6 +14,7 @@ Make sure exit code is 2 when no args are passed generate Generate a new app / package telemetry Enable or disable anonymous telemetry scan Turbo your monorepo by running a number of 'repo lints' to identify common issues, suggest fixes, and improve performance + ls EXPERIMENTAL: List packages in your monorepo link Link your local directory to a Vercel organization and enable remote caching login Login to your Vercel account logout Logout to your Vercel account diff --git a/turborepo-tests/integration/tests/package-manager.t b/turborepo-tests/integration/tests/package-manager.t index 34caf8a93253e..c1c879c89c0cf 100644 --- a/turborepo-tests/integration/tests/package-manager.t +++ b/turborepo-tests/integration/tests/package-manager.t @@ -2,14 +2,14 @@ Setup $ . ${TESTDIR}/../../helpers/setup_integration_test.sh basic_monorepo "npm@8.19.4" Run test run - $ TURBO_LOG_VERBOSITY=off ${TURBO} info --json | jq .packageManager + $ TURBO_LOG_VERBOSITY=off ${TURBO} config | jq .packageManager "npm" Set package manager to yarn in package.json $ jq '.packageManager = "yarn@1.22.7"' package.json > package.json.tmp && mv package.json.tmp package.json Run test run - $ TURBO_LOG_VERBOSITY=off ${TURBO} info --json | jq .packageManager + $ TURBO_LOG_VERBOSITY=off ${TURBO} config | jq .packageManager "yarn" Set up .yarnrc.yml @@ -19,7 +19,7 @@ Set package manager to berry in package.json $ jq '.packageManager = "yarn@2.0.0"' package.json > package.json.tmp && mv package.json.tmp package.json Run test run - $ TURBO_LOG_VERBOSITY=off ${TURBO} info --json | jq .packageManager + $ TURBO_LOG_VERBOSITY=off ${TURBO} config | jq .packageManager "berry" Set package manager to pnpm6 in package.json @@ -30,12 +30,12 @@ Set up pnpm-workspace.yaml $ echo " - apps/*" >> pnpm-workspace.yaml Run test run - $ TURBO_LOG_VERBOSITY=off ${TURBO} info --json | jq .packageManager + $ TURBO_LOG_VERBOSITY=off ${TURBO} config | jq .packageManager "pnpm6" Set package manager to pnpm in package.json $ jq '.packageManager = "pnpm@7.0.0"' package.json > package.json.tmp && mv package.json.tmp package.json Run test run - $ TURBO_LOG_VERBOSITY=off ${TURBO} info --json | jq .packageManager + $ TURBO_LOG_VERBOSITY=off ${TURBO} config | jq .packageManager "pnpm" diff --git a/turborepo-tests/integration/tests/turbo-help.t b/turborepo-tests/integration/tests/turbo-help.t index bb2bad7144ec1..ef6fdc5d3c4de 100644 --- a/turborepo-tests/integration/tests/turbo-help.t +++ b/turborepo-tests/integration/tests/turbo-help.t @@ -14,6 +14,7 @@ Test help flag generate Generate a new app / package telemetry Enable or disable anonymous telemetry scan Turbo your monorepo by running a number of 'repo lints' to identify common issues, suggest fixes, and improve performance + ls EXPERIMENTAL: List packages in your monorepo link Link your local directory to a Vercel organization and enable remote caching login Login to your Vercel account logout Logout to your Vercel account @@ -127,6 +128,7 @@ Test help flag generate Generate a new app / package telemetry Enable or disable anonymous telemetry scan Turbo your monorepo by running a number of 'repo lints' to identify common issues, suggest fixes, and improve performance + ls EXPERIMENTAL: List packages in your monorepo link Link your local directory to a Vercel organization and enable remote caching login Login to your Vercel account logout Logout to your Vercel account From f00b73d80d3182a9b321adc5feb8759977bb512b Mon Sep 17 00:00:00 2001 From: Thomas Knickman Date: Fri, 19 Jul 2024 14:58:56 -0400 Subject: [PATCH 36/73] feat(examples): bump turbo for svelte (#8796) ### Description Update turbo in svelte example to pickup latest passthrough --- examples/with-svelte/package.json | 2 +- examples/with-svelte/pnpm-lock.yaml | 44 ++++++++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/with-svelte/package.json b/examples/with-svelte/package.json index 759479c72ce73..ae545a53f2469 100644 --- a/examples/with-svelte/package.json +++ b/examples/with-svelte/package.json @@ -9,7 +9,7 @@ "devDependencies": { "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.2", - "turbo": "^2.0.3" + "turbo": "^2.0.8" }, "packageManager": "pnpm@8.15.6", "engines": { diff --git a/examples/with-svelte/pnpm-lock.yaml b/examples/with-svelte/pnpm-lock.yaml index f23298a8a8ec4..4bf4c79f84592 100644 --- a/examples/with-svelte/pnpm-lock.yaml +++ b/examples/with-svelte/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^3.2.2 version: 3.2.2(prettier@3.2.5)(svelte@4.2.12) turbo: - specifier: ^2.0.3 - version: 2.0.3 + specifier: ^2.0.8 + version: 2.0.8 apps/docs: dependencies: @@ -2240,64 +2240,64 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /turbo-darwin-64@2.0.3: - resolution: {integrity: sha512-v7ztJ8sxdHw3SLfO2MhGFeeU4LQhFii1hIGs9uBiXns/0YTGOvxLeifnfGqhfSrAIIhrCoByXO7nR9wlm10n3Q==} + /turbo-darwin-64@2.0.8: + resolution: {integrity: sha512-WxPAmpkJXTBfa2tmfLk1YI2eFc5vk8eOQS1gRA3bMfwDory1tKhdPGamDrVtMzMguCiWIvit5JU3x5SHJTLP9A==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@2.0.3: - resolution: {integrity: sha512-LUcqvkV9Bxtng6QHbevp8IK8zzwbIxM6HMjCE7FEW6yJBN1KwvTtRtsGBwwmTxaaLO0wD1Jgl3vgkXAmQ4fqUw==} + /turbo-darwin-arm64@2.0.8: + resolution: {integrity: sha512-sMPkU2GiW5OotJNPWmCWGuoltjRilmazXd6EfKK12eoq4rR1PGxUtvKY8LOLHIudDDcB4VUbxWSgHR/VBezhuw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@2.0.3: - resolution: {integrity: sha512-xpdY1suXoEbsQsu0kPep2zrB8ijv/S5aKKrntGuQ62hCiwDFoDcA/Z7FZ8IHQ2u+dpJARa7yfiByHmizFE0r5Q==} + /turbo-linux-64@2.0.8: + resolution: {integrity: sha512-5Uq3M36V1BBMbxdIoZHxzVdaSeJ2Uyp6lMj9L58iLX9wBPlrUY1f150Ys/PGOyTfyzL+wz2tqPqAsDSRSRhRIQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@2.0.3: - resolution: {integrity: sha512-MBACTcSR874L1FtLL7gkgbI4yYJWBUCqeBN/iE29D+8EFe0d3fAyviFlbQP4K/HaDYet1i26xkkOiWr0z7/V9A==} + /turbo-linux-arm64@2.0.8: + resolution: {integrity: sha512-b5EPHMNbR34z8aEosGQDb4m22o8VuWW3Nr5z3jbl+PMBJByBvGl/A5oYZIQfcJhRD5Ih/H1tqi7ftbrwouC3tQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@2.0.3: - resolution: {integrity: sha512-zi3YuKPkM9JxMTshZo3excPk37hUrj5WfnCqh4FjI26ux6j/LJK+Dh3SebMHd9mR7wP9CMam4GhmLCT+gDfM+w==} + /turbo-windows-64@2.0.8: + resolution: {integrity: sha512-2CKNENrm+/PaQEXcLqz0rd8KzppV6bO7Dju89bniKFo684Ip8zpq1YkOxGrhRPSgIFHKXph0ZmSoErqyfXoi5Q==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@2.0.3: - resolution: {integrity: sha512-wmed4kkenLvRbidi7gISB4PU77ujBuZfgVGDZ4DXTFslE/kYpINulwzkVwJIvNXsJtHqyOq0n6jL8Zwl3BrwDg==} + /turbo-windows-arm64@2.0.8: + resolution: {integrity: sha512-10FZPqk2hzRo6pT3ze5DdfMS5beMMc6vYw61FSwoqoXefFFhPm/2IIuVpLFnhfuqroWtmb5ilQtHeNSYEXSv5Q==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@2.0.3: - resolution: {integrity: sha512-jF1K0tTUyryEWmgqk1V0ALbSz3VdeZ8FXUo6B64WsPksCMCE48N5jUezGOH2MN0+epdaRMH8/WcPU0QQaVfeLA==} + /turbo@2.0.8: + resolution: {integrity: sha512-4BHTlXy/Sjtcy5skq3OBTQdTSkxbBbRhrQzEiRBcrc6OuEWe0iAefoYqJR0+c7dqD79AYqE/EJsDwE9kSq0YSA==} hasBin: true optionalDependencies: - turbo-darwin-64: 2.0.3 - turbo-darwin-arm64: 2.0.3 - turbo-linux-64: 2.0.3 - turbo-linux-arm64: 2.0.3 - turbo-windows-64: 2.0.3 - turbo-windows-arm64: 2.0.3 + turbo-darwin-64: 2.0.8 + turbo-darwin-arm64: 2.0.8 + turbo-linux-64: 2.0.8 + turbo-linux-arm64: 2.0.8 + turbo-windows-64: 2.0.8 + turbo-windows-arm64: 2.0.8 dev: true /type-check@0.4.0: From 2e3275677b4b9bc2359e2075ab8c5783abd7266d Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 22 Jul 2024 12:45:08 +0200 Subject: [PATCH 37/73] get rid of notify-debouncer in favor of our own debouncing (#8793) ### Description notify-debouncer has two bugs: * Sometimes Create events are discarded when there is a Modify event too. * After a delete-restore cycle, rename events of the same file are discarded. Since we don't need the combining feature of debouncer we can easily come up with our own debouncing solution within 3 lines of code. ### Testing Instructions --- Cargo.lock | 24 -- Cargo.toml | 2 - crates/turbo-tasks-fs/Cargo.toml | 1 - crates/turbo-tasks-fs/benches/mod.rs | 12 +- crates/turbo-tasks-fs/src/watcher.rs | 298 ++++++++---------- .../src/tracing_presets.rs | 2 +- 6 files changed, 133 insertions(+), 206 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a3684ae1a737a..a5581cd37e96f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2706,15 +2706,6 @@ dependencies = [ "log", ] -[[package]] -name = "file-id" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6584280525fb2059cba3db2c04abf947a1a29a45ddae89f3870f8281704fafc9" -dependencies = [ - "windows-sys 0.48.0", -] - [[package]] name = "filedescriptor" version = "0.8.2" @@ -4969,20 +4960,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "notify-debouncer-full" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f5dab59c348b9b50cf7f261960a20e389feb2713636399cd9082cd4b536154" -dependencies = [ - "crossbeam-channel", - "file-id", - "log", - "notify", - "parking_lot", - "walkdir", -] - [[package]] name = "ntapi" version = "0.4.1" @@ -10200,7 +10177,6 @@ dependencies = [ "jsonc-parser 0.21.0", "mime", "notify", - "notify-debouncer-full", "parking_lot", "rstest", "serde", diff --git a/Cargo.toml b/Cargo.toml index a58e59a6f3613..aa56bd46165e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -252,8 +252,6 @@ lightningcss = { version = "1.0.0-alpha.57", features = [ ] } mime = "0.3.16" notify = "6.1.1" -notify-debouncer-full = "0.3.1" -notify-debouncer-mini = { version = "0.3.0", default-features = false } once_cell = "1.17.1" owo-colors = "3.5.0" parcel_selectors = "0.26.0" diff --git a/crates/turbo-tasks-fs/Cargo.toml b/crates/turbo-tasks-fs/Cargo.toml index 27602ad932669..59c616c4bb054 100644 --- a/crates/turbo-tasks-fs/Cargo.toml +++ b/crates/turbo-tasks-fs/Cargo.toml @@ -38,7 +38,6 @@ indexmap = { workspace = true } jsonc-parser = { version = "0.21.0", features = ["serde"] } mime = { workspace = true } notify = { workspace = true } -notify-debouncer-full = { workspace = true } parking_lot = { workspace = true } serde = { workspace = true, features = ["rc"] } serde_json = { workspace = true } diff --git a/crates/turbo-tasks-fs/benches/mod.rs b/crates/turbo-tasks-fs/benches/mod.rs index abb374f460a97..ec5a14eba482e 100644 --- a/crates/turbo-tasks-fs/benches/mod.rs +++ b/crates/turbo-tasks-fs/benches/mod.rs @@ -10,10 +10,7 @@ use criterion::{ measurement::{Measurement, WallTime}, BenchmarkId, Criterion, }; -use notify_debouncer_full::{ - new_debouncer, - notify::{RecursiveMode, Watcher}, -}; +use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher}; use tokio::runtime::Runtime; use turbo_tasks::event::Event; use turbo_tasks_fs::rope::{Rope, RopeBuilder}; @@ -38,11 +35,8 @@ fn bench_file_watching(c: &mut Criterion) { let (tx, rx) = channel(); let event = Arc::new(Event::new(|| "test event".to_string())); - let mut watcher = new_debouncer(Duration::from_micros(1), None, tx).unwrap(); - watcher - .watcher() - .watch(temp_path, RecursiveMode::Recursive) - .unwrap(); + let mut watcher = RecommendedWatcher::new(tx, Config::default()).unwrap(); + watcher.watch(temp_path, RecursiveMode::Recursive).unwrap(); let t = thread::spawn({ let event = event.clone(); diff --git a/crates/turbo-tasks-fs/src/watcher.rs b/crates/turbo-tasks-fs/src/watcher.rs index d031af9b61768..c674a58807b07 100644 --- a/crates/turbo-tasks-fs/src/watcher.rs +++ b/crates/turbo-tasks-fs/src/watcher.rs @@ -3,7 +3,7 @@ use std::{ mem::take, path::{Path, PathBuf}, sync::{ - mpsc::{channel, Receiver, RecvError, TryRecvError}, + mpsc::{channel, Receiver, TryRecvError}, Arc, Mutex, }, time::Duration, @@ -12,9 +12,8 @@ use std::{ use anyhow::Result; use notify::{ event::{MetadataKind, ModifyKind, RenameMode}, - EventKind, RecommendedWatcher, RecursiveMode, Watcher, + Config, EventKind, RecommendedWatcher, RecursiveMode, Watcher, }; -use notify_debouncer_full::{DebounceEventResult, DebouncedEvent, Debouncer, FileIdMap}; use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; use tracing::instrument; @@ -30,7 +29,7 @@ use crate::{ #[derive(Default, Serialize, Deserialize)] pub(crate) struct DiskWatcher { #[serde(skip)] - watcher: Mutex>>, + watcher: Mutex>, /// Array of paths that should not notify invalidations. /// `notify` currently doesn't support unwatching subpaths from the root, @@ -77,7 +76,7 @@ impl DiskWatcher { #[cfg(not(any(target_os = "macos", target_os = "windows")))] fn start_watching_dir( &self, - watcher: &mut std::sync::MutexGuard>>, + watcher: &mut std::sync::MutexGuard>, dir_path: &Path, root_path: &Path, ) -> Result<()> { @@ -85,7 +84,7 @@ impl DiskWatcher { if let Some(watcher) = watcher.as_mut() { let mut path = dir_path; - while let Err(err) = watcher.watcher().watch(path, RecursiveMode::NonRecursive) { + while let Err(err) = watcher.watch(path, RecursiveMode::NonRecursive) { if path == root_path { return Err(err).context(format!( "Unable to watch {} (tried up to {})", @@ -138,29 +137,19 @@ impl DiskWatcher { // Create a channel to receive the events. let (tx, rx) = channel(); - // Linux watching is too fast, so we need to throttle it a bit to avoid reading - // wip files - #[cfg(target_os = "linux")] - let delay = Duration::from_millis(10); - #[cfg(not(target_os = "linux"))] - let delay = Duration::from_millis(1); // Create a watcher object, delivering debounced events. // The notification back-end is selected based on the platform. - let mut debounced_watcher = notify_debouncer_full::new_debouncer(delay, None, tx)?; + let mut watcher = RecommendedWatcher::new(tx, Config::default())?; // Add a path to be watched. All files and directories at that path and // below will be monitored for changes. #[cfg(any(target_os = "macos", target_os = "windows"))] { - debounced_watcher - .watcher() - .watch(&root_path, RecursiveMode::Recursive)?; + watcher.watch(&root_path, RecursiveMode::Recursive)?; } #[cfg(not(any(target_os = "macos", target_os = "windows")))] for dir_path in self.watching.iter() { - debounced_watcher - .watcher() - .watch(&dir_path, RecursiveMode::NonRecursive)?; + watcher.watch(&dir_path, RecursiveMode::NonRecursive)?; } // We need to invalidate all reads that happened before watching @@ -177,7 +166,7 @@ impl DiskWatcher { } } - watcher_guard.replace(debounced_watcher); + watcher_guard.replace(watcher); drop(watcher_guard); spawn_thread(move || { @@ -207,7 +196,7 @@ impl DiskWatcher { /// Should only be called once from `start_watching`. fn watch_thread( &self, - rx: Receiver, + rx: Receiver>, root_path: PathBuf, report_invalidation_reason: Option<(RcStr, PathBuf)>, invalidation_lock: Arc>, @@ -223,167 +212,126 @@ impl DiskWatcher { let mut batched_new_paths = HashSet::new(); 'outer: loop { - let mut event = rx.recv().map_err(|e| match e { - RecvError => TryRecvError::Disconnected, - }); + let mut event = rx.recv().or(Err(TryRecvError::Disconnected)); loop { match event { - Ok(Ok(events)) => { - events.iter().for_each( - |DebouncedEvent { - event: notify::Event { kind, paths, .. }, - .. - }| { - let paths: Vec = paths + Ok(Ok(notify::Event { kind, paths, .. })) => { + let paths: Vec = paths + .iter() + .filter(|p| { + !self + .ignored_subpaths .iter() - .filter(|p| { - !self - .ignored_subpaths - .iter() - .any(|ignored| p.starts_with(ignored)) - }) - .cloned() - .collect(); + .any(|ignored| p.starts_with(ignored)) + }) + .cloned() + .collect(); - if paths.is_empty() { - return; - } + if paths.is_empty() { + return; + } - // [NOTE] there is attrs in the `Event` struct, which contains few - // more metadata like process_id who triggered the event, - // or the source we may able to utilize later. - match kind { - // [NOTE] Observing `ModifyKind::Metadata(MetadataKind::Any)` is - // not a mistake, fix for PACK-2437. - // In here explicitly subscribes to the `ModifyKind::Data` which - // indicates file content changes - in case of fsevents backend, - // this is `kFSEventStreamEventFlagItemModified`. - // Also meanwhile we subscribe to ModifyKind::Metadata as well. - // This is due to in some cases fsevents does not emit explicit - // kFSEventStreamEventFlagItemModified kernel events, - // but only emits kFSEventStreamEventFlagItemInodeMetaMod. While - // this could cause redundant invalidation, - // it's the way to reliably detect file content changes. - // ref other implementation, i.e libuv does same thing to - // trigger UV_CHANEGS https://github.com/libuv/libuv/commit/73cf3600d75a5884b890a1a94048b8f3f9c66876#diff-e12fdb1f404f1c97bbdcc0956ac90d7db0d811d9fa9ca83a3deef90c937a486cR95-R99 - EventKind::Modify( - ModifyKind::Data(_) - | ModifyKind::Metadata(MetadataKind::Any), - ) => { - batched_invalidate_path.extend(paths.clone()); - #[cfg(target_os = "macos")] - { - // Sometimes file creation is reported as - // ModifyKind::Data on macOS. - paths.iter().for_each(|path| { - if let Some(parent) = path.parent() { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } - }); - } + // [NOTE] there is attrs in the `Event` struct, which contains few + // more metadata like process_id who triggered the event, + // or the source we may able to utilize later. + match kind { + // [NOTE] Observing `ModifyKind::Metadata(MetadataKind::Any)` is + // not a mistake, fix for PACK-2437. + // In here explicitly subscribes to the `ModifyKind::Data` which + // indicates file content changes - in case of fsevents backend, + // this is `kFSEventStreamEventFlagItemModified`. + // Also meanwhile we subscribe to ModifyKind::Metadata as well. + // This is due to in some cases fsevents does not emit explicit + // kFSEventStreamEventFlagItemModified kernel events, + // but only emits kFSEventStreamEventFlagItemInodeMetaMod. While + // this could cause redundant invalidation, + // it's the way to reliably detect file content changes. + // ref other implementation, i.e libuv does same thing to + // trigger UV_CHANEGS https://github.com/libuv/libuv/commit/73cf3600d75a5884b890a1a94048b8f3f9c66876#diff-e12fdb1f404f1c97bbdcc0956ac90d7db0d811d9fa9ca83a3deef90c937a486cR95-R99 + EventKind::Modify( + ModifyKind::Data(_) | ModifyKind::Metadata(MetadataKind::Any), + ) => { + batched_invalidate_path.extend(paths.clone()); + } + EventKind::Create(_) => { + batched_invalidate_path_and_children.extend(paths.clone()); + batched_invalidate_path_and_children_dir.extend(paths.clone()); + paths.iter().for_each(|path| { + if let Some(parent) = path.parent() { + batched_invalidate_path_dir.insert(PathBuf::from(parent)); } - EventKind::Create(_) => { - batched_invalidate_path_and_children.extend(paths.clone()); - batched_invalidate_path_and_children_dir - .extend(paths.clone()); - paths.iter().for_each(|path| { - if let Some(parent) = path.parent() { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } - }); + }); - #[cfg(not(any( - target_os = "macos", - target_os = "windows" - )))] - batched_new_paths.extend(paths.clone()); - } - EventKind::Remove(_) => { - batched_invalidate_path_and_children.extend(paths.clone()); - batched_invalidate_path_and_children_dir - .extend(paths.clone()); - paths.iter().for_each(|path| { - if let Some(parent) = path.parent() { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } - }); - } - // A single event emitted with both the `From` and `To` paths. - EventKind::Modify(ModifyKind::Name(RenameMode::Both)) => { - // For the rename::both, notify provides an array of paths - // in given order - if let [source, destination, ..] = &paths[..] { - batched_invalidate_path_and_children - .insert(source.clone()); - if let Some(parent) = source.parent() { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } - batched_invalidate_path_and_children - .insert(destination.clone()); - if let Some(parent) = destination.parent() { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } - #[cfg(not(any( - target_os = "macos", - target_os = "windows" - )))] - batched_new_paths.insert(destination.clone()); - } else { - // If we hit here, we expect this as a bug either in - // notify or system weirdness. - panic!( - "Rename event does not contain source and \ - destination paths {:#?}", - paths - ); - } + #[cfg(not(any(target_os = "macos", target_os = "windows")))] + batched_new_paths.extend(paths.clone()); + } + EventKind::Remove(_) => { + batched_invalidate_path_and_children.extend(paths.clone()); + batched_invalidate_path_and_children_dir.extend(paths.clone()); + paths.iter().for_each(|path| { + if let Some(parent) = path.parent() { + batched_invalidate_path_dir.insert(PathBuf::from(parent)); } - // We expect `RenameMode::Both` to cover most of the cases we - // need to invalidate, - // but we also check other RenameModes - // to cover cases where notify couldn't match the two rename - // events. - EventKind::Any - | EventKind::Modify(ModifyKind::Any | ModifyKind::Name(..)) => { - batched_invalidate_path.extend(paths.clone()); - batched_invalidate_path_and_children.extend(paths.clone()); - batched_invalidate_path_and_children_dir - .extend(paths.clone()); - for parent in paths.iter().filter_map(|path| path.parent()) - { - batched_invalidate_path_dir - .insert(PathBuf::from(parent)); - } + }); + } + // A single event emitted with both the `From` and `To` paths. + EventKind::Modify(ModifyKind::Name(RenameMode::Both)) => { + // For the rename::both, notify provides an array of paths + // in given order + if let [source, destination, ..] = &paths[..] { + batched_invalidate_path_and_children.insert(source.clone()); + if let Some(parent) = source.parent() { + batched_invalidate_path_dir.insert(PathBuf::from(parent)); } - EventKind::Modify( - ModifyKind::Metadata(..) | ModifyKind::Other, - ) - | EventKind::Access(_) - | EventKind::Other => { - // ignored + batched_invalidate_path_and_children + .insert(destination.clone()); + if let Some(parent) = destination.parent() { + batched_invalidate_path_dir.insert(PathBuf::from(parent)); } + #[cfg(not(any(target_os = "macos", target_os = "windows")))] + batched_new_paths.insert(destination.clone()); + } else { + // If we hit here, we expect this as a bug either in + // notify or system weirdness. + panic!( + "Rename event does not contain source and destination \ + paths {:#?}", + paths + ); } - }, - ); - } - // Error raised by notify watcher itself - Ok(Err(errors)) => { - errors.iter().for_each(|notify::Error { kind, paths }| { - println!("watch error ({:?}): {:?} ", paths, kind); - - if paths.is_empty() { - batched_invalidate_path_and_children.insert(root_path.clone()); - batched_invalidate_path_and_children_dir.insert(root_path.clone()); - } else { + } + // We expect `RenameMode::Both` to cover most of the cases we + // need to invalidate, + // but we also check other RenameModes + // to cover cases where notify couldn't match the two rename + // events. + EventKind::Any + | EventKind::Modify(ModifyKind::Any | ModifyKind::Name(..)) => { + batched_invalidate_path.extend(paths.clone()); batched_invalidate_path_and_children.extend(paths.clone()); batched_invalidate_path_and_children_dir.extend(paths.clone()); + for parent in paths.iter().filter_map(|path| path.parent()) { + batched_invalidate_path_dir.insert(PathBuf::from(parent)); + } } - }); + EventKind::Modify(ModifyKind::Metadata(..) | ModifyKind::Other) + | EventKind::Access(_) + | EventKind::Other => { + // ignored + } + } + } + // Error raised by notify watcher itself + Ok(Err(notify::Error { kind, paths })) => { + println!("watch error ({:?}): {:?} ", paths, kind); + + if paths.is_empty() { + batched_invalidate_path_and_children.insert(root_path.clone()); + batched_invalidate_path_and_children_dir.insert(root_path.clone()); + } else { + batched_invalidate_path_and_children.extend(paths.clone()); + batched_invalidate_path_and_children_dir.extend(paths.clone()); + } } Err(TryRecvError::Disconnected) => { // Sender has been disconnected @@ -392,7 +340,19 @@ impl DiskWatcher { break 'outer; } Err(TryRecvError::Empty) => { - break; + // Linux watching is too fast, so we need to throttle it a bit to avoid + // reading wip files + #[cfg(target_os = "linux")] + let delay = Duration::from_millis(10); + #[cfg(not(target_os = "linux"))] + let delay = Duration::from_millis(1); + match rx.recv_timeout(delay) { + Ok(result) => { + event = Ok(result); + continue; + } + Err(_) => break, + } } } event = rx.try_recv(); diff --git a/crates/turbopack-trace-utils/src/tracing_presets.rs b/crates/turbopack-trace-utils/src/tracing_presets.rs index d4d3b2ba2ca4b..eb8ea35900740 100644 --- a/crates/turbopack-trace-utils/src/tracing_presets.rs +++ b/crates/turbopack-trace-utils/src/tracing_presets.rs @@ -3,6 +3,7 @@ use once_cell::sync::Lazy; pub static TRACING_OVERVIEW_TARGETS: Lazy> = Lazy::new(|| { vec![ "turbo_tasks=info", + "turbo_tasks_fs=info", "turbopack=info", "turbopack_binding=info", "turbopack_nodejs=info", @@ -30,7 +31,6 @@ pub static TRACING_TURBOPACK_TARGETS: Lazy> = Lazy::new(|| { [ &TRACING_OVERVIEW_TARGETS[..], &[ - "turbo_tasks=info", "turbopack=trace", "turbopack_binding=trace", "turbopack_nodejs=trace", From 67c9781a8198350e48a5e07c90473e4c494987c6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:43:25 -0400 Subject: [PATCH 38/73] release(turborepo): 2.0.9 (#8797) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index 9d8f082163ec9..f1f5012d9a0f2 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.8", + "version": "2.0.9", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index 2298e99397972..7ce65d5746549 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.8", + "version": "2.0.9", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index d12a9f8694645..fdb3645c9e80c 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.8", + "version": "2.0.9", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index 3af8786e6f22b..359574fcf01a8 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.8", + "version": "2.0.9", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index b516256d4498e..735cb72c003ad 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.8", + "version": "2.0.9", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index f63028d20f515..89df8dbca0ef6 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.8", + "version": "2.0.9", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index 69ba8f19cda48..2b08d95664b84 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.8", + "version": "2.0.9", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index 8cee9fa010576..ad760b4c9fb99 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.8", + "version": "2.0.9", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index 4592cd732701c..b2216ae668aae 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.8", + "version": "2.0.9", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.8", - "turbo-darwin-arm64": "2.0.8", - "turbo-linux-64": "2.0.8", - "turbo-linux-arm64": "2.0.8", - "turbo-windows-64": "2.0.8", - "turbo-windows-arm64": "2.0.8" + "turbo-darwin-64": "2.0.9", + "turbo-darwin-arm64": "2.0.9", + "turbo-linux-64": "2.0.9", + "turbo-linux-arm64": "2.0.9", + "turbo-windows-64": "2.0.9", + "turbo-windows-arm64": "2.0.9" } } diff --git a/version.txt b/version.txt index 7cdb5b2721607..82183a4db51bc 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.8 +2.0.9 latest From 5d31f762ec4dc33691fb336d70adaabc3a3e7f2b Mon Sep 17 00:00:00 2001 From: Anthony Shew Date: Mon, 22 Jul 2024 08:40:34 -0600 Subject: [PATCH 39/73] Docs: Add sections for package manager check disabling. (#8739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Documenting #8738 to allow for skipping the `packageManager` field in `package.json`. ### Testing Instructions 👀 --- docs/repo-docs/reference/configuration.mdx | 24 +++++++++- docs/repo-docs/reference/run.mdx | 14 ++++++ .../system-environment-variables.mdx | 47 ++++++++++--------- 3 files changed, 61 insertions(+), 24 deletions(-) diff --git a/docs/repo-docs/reference/configuration.mdx b/docs/repo-docs/reference/configuration.mdx index a37985f1382f7..506a99595f825 100644 --- a/docs/repo-docs/reference/configuration.mdx +++ b/docs/repo-docs/reference/configuration.mdx @@ -81,7 +81,7 @@ Additionally, Turborepo has a built-in set of global passthrough variables for c include them in [`env`](#env) or [`globalEnv`](#globalenv). -### ui +### `ui` Default: `"stream"` @@ -95,6 +95,28 @@ Select a terminal UI for the repository. } ``` +### `dangerouslyDisablePackageManagerCheck` + +Default: `false` + +Turborepo uses your repository's lockfile to determine caching behavior, [Package Graphs](https://turbo.build/repo/docs/core-concepts/internal-packages), and more. Because of this, we use [the `packageManager` field](https://nodejs.org/api/packages.html#packagemanager) to help you stabilize your Turborepo. + +To help with incremental migration or in situations where you can't use the `packageManager` field, you may use `--dangerously-disable-package-manager-check` to opt out of this check and assume the risks of unstable lockfiles producing unpredictable behavior. When disabled, Turborepo will attempt a best-effort discovery of the intended package manager meant for the repository. + +```jsonc title="./turbo.json" +{ + "dangerouslyDisablePackageManagerCheck": true +} +``` + + + You may also opt out of this check via + [`flag`](/repo/docs/reference/run#dangerously-disable-package-manager-check) + or the + [`TURBO_DANGEROUSLY_DISABLE_PACKAGE_MANAGER_CHECK`](https://turbo.build/repo/docs/reference/system-environment-variables) + environment variable. + + ## Defining tasks ### `tasks` diff --git a/docs/repo-docs/reference/run.mdx b/docs/repo-docs/reference/run.mdx index 5f588d7e742b1..99f36a3543565 100644 --- a/docs/repo-docs/reference/run.mdx +++ b/docs/repo-docs/reference/run.mdx @@ -82,6 +82,20 @@ Set the working directory of the command. turbo run build --cwd=./somewhere/else/in/your/repo ``` +### `--dangerously-disable-package-manager-check` + +Turborepo uses your repository's lockfile to determine caching behavior, [Package Graphs](https://turbo.build/repo/docs/core-concepts/internal-packages), and more. Because of this, we use [the `packageManager` field](https://nodejs.org/api/packages.html#packagemanager) to help you stabilize your Turborepo. + +To help with incremental migration or in situations where you cannot use the `packageManager` field, you may use `--dangerously-disable-package-manager-check` to opt out of this check and assume the risks of unstable lockfiles producing unpredictable behavior. When disabled, Turborepo will attempt a best-effort discovery of the intended package manager meant for the repository. + + + You may also opt out of this check using [configuration in + `turbo.json`](/repo/docs/reference/configuration#dangerouslydisablepacakgemanagercheck) + or the + [`TURBO_DANGEROUSLY_DISABLE_PACKAGE_MANAGER_CHECK`](/repo/docs/reference/system-environment-variables) + environment variable for broader coverage. + + ### `--dry / --dry-run` Instead of executing tasks, display details about the packages and tasks that would be run. diff --git a/docs/repo-docs/reference/system-environment-variables.mdx b/docs/repo-docs/reference/system-environment-variables.mdx index 2a22e97edb461..d4d3b9717914b 100644 --- a/docs/repo-docs/reference/system-environment-variables.mdx +++ b/docs/repo-docs/reference/system-environment-variables.mdx @@ -9,29 +9,30 @@ By setting certain environment variables, you can change Turborepo's behavior. T System environment variables are always overridden by flag values provided directly to your `turbo` commands. -| Variable | Description | -| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TURBO_API` | Set the base URL for [Remote Cache](/repo/docs/core-concepts/remote-caching). | -| `TURBO_BINARY_PATH` | Manually set the path to the `turbo` binary. By default, `turbo` will automatically discover the binary so you should only use this in rare circumstances. | -| `TURBO_CACHE_DIR` | Sets the cache directory, similar to using [`--cache-dir`](/repo/docs/reference/run#--cache-dir-path) flag | -| `TURBO_CI_VENDOR_ENV_KEY` | Set a prefix for environment variables that you want **excluded** from [Framework Inference](/repo/docs/crafting-your-repository/using-environment-variables#framework-inference). | -| `TURBO_DOWNLOAD_LOCAL_ENABLED` | Enables global `turbo` to install the correct local version if one is not found. | -| `TURBO_FORCE` | Always force all tasks to run in full, opting out of all caching. | -| `TURBO_GLOBAL_WARNING_DISABLED` | Disable warning when global `turbo` cannot find a local version to use. | -| `TURBO_LOG_ORDER` | Set the [log order](/repo/docs/reference/run#--log-order-option). Allowed values are `grouped` and `default`. | -| `TURBO_LOGIN` | Set the URL used to log in to [Remote Cache](/repo/docs/core-concepts/remote-caching). | -| `TURBO_NO_UPDATE_NOTIFIER` | Remove the update notifier that appears when a new version of `turbo` is available. You can also use `NO_UPDATE_NOTIFIER` per ecosystem convention. | -| `TURBO_PREFLIGHT` | Enables sending a preflight request before every cache artifact and analytics request. The follow-up upload and download will follow redirects. Only applicable when [Remote Caching](/repo/docs/core-concepts/remote-caching) is configured. | -| `TURBO_REMOTE_CACHE_READ_ONLY` | Prevent writing to the [Remote Cache](/repo/docs/core-concepts/remote-caching) - but still allow reading. | -| `TURBO_REMOTE_CACHE_SIGNATURE_KEY` | Sign artifacts with a secret key. For more information, visit [the Artifact Integrity section](/repo/docs/core-concepts/remote-caching#artifact-integrity-and-authenticity-verification). | -| `TURBO_REMOTE_CACHE_TIMEOUT` | Set a timeout in seconds for `turbo` to get artifacts from [Remote Cache](/repo/docs/core-concepts/remote-caching). | -| `TURBO_REMOTE_ONLY` | Always ignore the local filesystem cache for all tasks. | -| `TURBO_RUN_SUMMARY` | Generate a [Run Summary](/repo/docs/reference/run#--summarize) when you run tasks. | -| `TURBO_TEAM` | The account name associated with your repository. When using [Vercel Remote Cache](https://vercel.com/docs/monorepos/remote-caching#vercel-remote-cache), this is your team's slug. | -| `TURBO_TEAMID` | The account identifier associated with your repository. When using [Vercel Remote Cache](https://vercel.com/docs/monorepos/remote-caching#vercel-remote-cache), this is your team's ID. | -| `TURBO_TELEMETRY_MESSAGE_DISABLED` | Disable the message notifying you that [Telemetry](/repo/docs/telemetry) is enabled. | -| `TURBO_TOKEN` | The Bearer token for authentication to access [Remote Cache](/repo/docs/core-concepts/remote-caching). | -| `TURBO_UI` | Enables TUI when passed true or 1, disables when passed false or 0. | +| Variable | Description | +| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TURBO_API` | Set the base URL for [Remote Cache](/repo/docs/core-concepts/remote-caching). | +| `TURBO_BINARY_PATH` | Manually set the path to the `turbo` binary. By default, `turbo` will automatically discover the binary so you should only use this in rare circumstances. | +| `TURBO_CACHE_DIR` | Sets the cache directory, similar to using [`--cache-dir`](/repo/docs/reference/run#--cache-dir-path) flag | +| `TURBO_CI_VENDOR_ENV_KEY` | Set a prefix for environment variables that you want **excluded** from [Framework Inference](/repo/docs/crafting-your-repository/using-environment-variables#framework-inference). | +| `TURBO_DANGEROUSLY_DISABLE_PACKAGE_MANAGER_CHECK` | Disable checking the `packageManager` field in `package.json`. You may run into [errors and unexpected caching behavior](/repo/docs/reference/configuration#dangerouslydisablepacakgemanagercheck) when disabling this check. Use `true` or `1` to disable. | +| `TURBO_DOWNLOAD_LOCAL_ENABLED` | Enables global `turbo` to install the correct local version if one is not found. | +| `TURBO_FORCE` | Always force all tasks to run in full, opting out of all caching. | +| `TURBO_GLOBAL_WARNING_DISABLED` | Disable warning when global `turbo` cannot find a local version to use. | +| `TURBO_LOG_ORDER` | Set the [log order](/repo/docs/reference/run#--log-order-option). Allowed values are `grouped` and `default`. | +| `TURBO_LOGIN` | Set the URL used to log in to [Remote Cache](/repo/docs/core-concepts/remote-caching). | +| `TURBO_NO_UPDATE_NOTIFIER` | Remove the update notifier that appears when a new version of `turbo` is available. You can also use `NO_UPDATE_NOTIFIER` per ecosystem convention. | +| `TURBO_PREFLIGHT` | Enables sending a preflight request before every cache artifact and analytics request. The follow-up upload and download will follow redirects. Only applicable when [Remote Caching](/repo/docs/core-concepts/remote-caching) is configured. | +| `TURBO_REMOTE_CACHE_READ_ONLY` | Prevent writing to the [Remote Cache](/repo/docs/core-concepts/remote-caching) - but still allow reading. | +| `TURBO_REMOTE_CACHE_SIGNATURE_KEY` | Sign artifacts with a secret key. For more information, visit [the Artifact Integrity section](/repo/docs/core-concepts/remote-caching#artifact-integrity-and-authenticity-verification). | +| `TURBO_REMOTE_CACHE_TIMEOUT` | Set a timeout in seconds for `turbo` to get artifacts from [Remote Cache](/repo/docs/core-concepts/remote-caching). | +| `TURBO_REMOTE_ONLY` | Always ignore the local filesystem cache for all tasks. | +| `TURBO_RUN_SUMMARY` | Generate a [Run Summary](/repo/docs/reference/run#--summarize) when you run tasks. | +| `TURBO_TEAM` | The account name associated with your repository. When using [Vercel Remote Cache](https://vercel.com/docs/monorepos/remote-caching#vercel-remote-cache), this is your team's slug. | +| `TURBO_TEAMID` | The account identifier associated with your repository. When using [Vercel Remote Cache](https://vercel.com/docs/monorepos/remote-caching#vercel-remote-cache), this is your team's ID. | +| `TURBO_TELEMETRY_MESSAGE_DISABLED` | Disable the message notifying you that [Telemetry](/repo/docs/telemetry) is enabled. | +| `TURBO_TOKEN` | The Bearer token for authentication to access [Remote Cache](/repo/docs/core-concepts/remote-caching). | +| `TURBO_UI` | Enables TUI when passed true or 1, disables when passed false or 0. | ## Environment variables in tasks From 59b2e905303e5a788cb2733bb5406887f7e42166 Mon Sep 17 00:00:00 2001 From: Cahil Foley <14274957+cahilfoley@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:55:04 +0800 Subject: [PATCH 40/73] feat(turbo): add TMP and TEMP variables to pass through (#8803) ### Description This is required so node scripts and other tools can detect the correct location to create temporary files and folders. In particular it's required for the Node.js [os.tmpdir()](https://nodejs.org/api/os.html#ostmpdir) function. ### Testing Instructions Create an app or package task that access either the `TMP` or `TEMP` environment variables and observe that they are passed through correctly. This should hopefully resolve this issue #8802 --- crates/turborepo-lib/src/task_hash.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/turborepo-lib/src/task_hash.rs b/crates/turborepo-lib/src/task_hash.rs index 72179cff3d596..7a291de98abe8 100644 --- a/crates/turborepo-lib/src/task_hash.rs +++ b/crates/turborepo-lib/src/task_hash.rs @@ -477,6 +477,8 @@ impl<'a> TaskHasher<'a> { "COLORTERM", "TERM", "TERM_PROGRAM", + "TMP", + "TEMP", // VSCode IDE - https://github.com/microsoft/vscode-js-debug/blob/5b0f41dbe845d693a541c1fae30cec04c878216f/src/targets/node/nodeLauncherBase.ts#L320 "VSCODE_*", "ELECTRON_RUN_AS_NODE", From 7677ac8f23775c5ff10bf23fa43b2097975a7f85 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 22 Jul 2024 18:52:05 +0200 Subject: [PATCH 41/73] impl Ord for Diagnostics and Issue so they are sorted correctly (#8805) ### Description impl Ord for Diagnostics and Issue so they are sorted correctly Collectibles are unordered by default and need to be ordered correctly to avoid over invalidation ### Testing Instructions --- crates/turbopack-core/src/diagnostics/mod.rs | 37 ++++++++++++++++++-- crates/turbopack-core/src/issue/mod.rs | 8 +++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/crates/turbopack-core/src/diagnostics/mod.rs b/crates/turbopack-core/src/diagnostics/mod.rs index 9a7aa25bb576a..171d6e260a508 100644 --- a/crates/turbopack-core/src/diagnostics/mod.rs +++ b/crates/turbopack-core/src/diagnostics/mod.rs @@ -1,7 +1,8 @@ -use std::collections::HashMap; +use std::cmp::Ordering; use anyhow::Result; use async_trait::async_trait; +use indexmap::IndexMap; use turbo_tasks::{emit, CollectiblesSource, RcStr, Upcast, Vc}; #[turbo_tasks::value(serialization = "none")] @@ -9,11 +10,41 @@ use turbo_tasks::{emit, CollectiblesSource, RcStr, Upcast, Vc}; pub struct PlainDiagnostic { pub category: RcStr, pub name: RcStr, - pub payload: HashMap, + pub payload: IndexMap, +} + +impl Ord for PlainDiagnostic { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.name + .cmp(&other.name) + .then_with(|| self.category.cmp(&other.category)) + .then_with(|| self.payload.len().cmp(&other.payload.len())) + .then_with(|| { + for ((a_key, a_value), (b_key, b_value)) in + self.payload.iter().zip(other.payload.iter()) + { + match a_key.cmp(b_key) { + Ordering::Equal => {} + other => return other, + } + match a_value.cmp(b_value) { + Ordering::Equal => {} + other => return other, + } + } + Ordering::Equal + }) + } +} + +impl PartialOrd for PlainDiagnostic { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } } #[turbo_tasks::value(transparent)] -pub struct DiagnosticPayload(pub HashMap); +pub struct DiagnosticPayload(pub IndexMap); /// An arbitrary payload can be used to analyze, diagnose /// Turbopack's behavior. diff --git a/crates/turbopack-core/src/issue/mod.rs b/crates/turbopack-core/src/issue/mod.rs index ae9644adfaf20..30e6123eac468 100644 --- a/crates/turbopack-core/src/issue/mod.rs +++ b/crates/turbopack-core/src/issue/mod.rs @@ -590,8 +590,12 @@ impl Ord for PlainIssue { cmp!(self.severity, other.severity); cmp!(self.stage, other.stage); - - self.title.cmp(&other.title) + cmp!(self.title, other.title); + cmp!(self.file_path, other.file_path); + cmp!(self.description, other.description); + cmp!(self.detail, other.detail); + cmp!(self.documentation_link, other.documentation_link); + Ordering::Equal } } From 08bd95dfa59abbcb896a4dc3e0be1ebc93345163 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 23 Jul 2024 07:43:31 -0500 Subject: [PATCH 42/73] chore: dedupe link component in kitchen sink (#8813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Fixes #8745 It seems copies of the files were added to a `Link` directory [here](https://github.com/vercel/turbo/pull/8590/files#diff-8a35c23ac711bfa04062cb92181badcb9b536b0a772e7779c4a5e277a247511d). This causes issues for case-insensitive filesystems. ### Testing Instructions 👀 --- .../packages/ui/src/Link/index.test.tsx | 11 -------- .../packages/ui/src/Link/index.tsx | 25 ------------------- 2 files changed, 36 deletions(-) delete mode 100644 examples/kitchen-sink/packages/ui/src/Link/index.test.tsx delete mode 100644 examples/kitchen-sink/packages/ui/src/Link/index.tsx diff --git a/examples/kitchen-sink/packages/ui/src/Link/index.test.tsx b/examples/kitchen-sink/packages/ui/src/Link/index.test.tsx deleted file mode 100644 index d1a954e8a79fd..0000000000000 --- a/examples/kitchen-sink/packages/ui/src/Link/index.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createRoot } from "react-dom/client"; -import { Link } from "."; - -describe("Link", () => { - it("renders without crashing", () => { - const div = document.createElement("div"); - const root = createRoot(div); - root.render(Turborepo Docs); - root.unmount(); - }); -}); diff --git a/examples/kitchen-sink/packages/ui/src/Link/index.tsx b/examples/kitchen-sink/packages/ui/src/Link/index.tsx deleted file mode 100644 index b3e07394b16b8..0000000000000 --- a/examples/kitchen-sink/packages/ui/src/Link/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import type { AnchorHTMLAttributes, ReactNode } from "react"; - -interface LinkProps extends AnchorHTMLAttributes { - children: ReactNode; - newTab?: boolean; - href: string; -} - -export function Link({ - children, - href, - newTab, - ...other -}: LinkProps): JSX.Element { - return ( - - {children} - - ); -} From e2614de185df9abcdd0b8c0d74eb4d2d268240df Mon Sep 17 00:00:00 2001 From: busybox <29630035+busybox11@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:46:10 +0200 Subject: [PATCH 43/73] Add missing require.resolve to @vercel/style-guide (#8799) @vercel/style-guide eslint rules are not working without resolve.require --- docs/repo-docs/guides/tools/eslint.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/repo-docs/guides/tools/eslint.mdx b/docs/repo-docs/guides/tools/eslint.mdx index 65980f9642932..c8de0815ce0f0 100644 --- a/docs/repo-docs/guides/tools/eslint.mdx +++ b/docs/repo-docs/guides/tools/eslint.mdx @@ -105,11 +105,11 @@ const project = resolve(process.cwd(), 'tsconfig.json'); module.exports = { extends: [ - '@vercel/style-guide/eslint/node', - '@vercel/style-guide/eslint/typescript', - '@vercel/style-guide/eslint/browser', - '@vercel/style-guide/eslint/react', - '@vercel/style-guide/eslint/next', + require.resolve('@vercel/style-guide/eslint/node'), + require.resolve('@vercel/style-guide/eslint/typescript'), + require.resolve('@vercel/style-guide/eslint/browser'), + require.resolve('@vercel/style-guide/eslint/react'), + require.resolve('@vercel/style-guide/eslint/next'), // Turborepo custom eslint configuration configures the following rules: // - https://github.com/vercel/turbo/blob/main/packages/eslint-plugin-turbo/docs/rules/no-undeclared-env-vars.md 'eslint-config-turbo', From 60b5bf0739bd9cafc3ffc9957362ff4d57b8ad61 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 23 Jul 2024 08:00:33 -0500 Subject: [PATCH 44/73] docs: fix example for filtering by directory and scm (#8814) ### Description Closes #8762 by updating docs to provide the correct filter for the description. Multiple filters are combined via union so `--filter=./apps/* --filter=[HEAD^1]` is really "all packages that are in `apps/` *or* have changed since `HEAD^1`". ### Testing Instructions Quick verify that my understanding is correct: ``` # Only web was changed in the last commit [0 olszewski@chriss-mbp] /tmp/foobar $ turbo build --filter='[HEAD^1]' --dry=json | jq '.tasks | map(.taskId)' [ "web#build" ] # All of these are run if we filter to all packages in apps/ [0 olszewski@chriss-mbp] /tmp/foobar $ turbo build --filter='./apps/*' --dry=json | jq '.tasks | map(.taskId)' [ "@repo/eslint-config#build", "@repo/typescript-config#build", "@repo/ui#build", "docs#build", "web#build" ] # Union is taken with multiple filters [0 olszewski@chriss-mbp] /tmp/foobar $ turbo build --filter='./apps/*' --filter='[HEAD^1]' --dry=json | jq '.tasks | map(.taskId)' [ "@repo/eslint-config#build", "@repo/typescript-config#build", "@repo/ui#build", "docs#build", "web#build" ] # Intersection is taken with this syntax [0 olszewski@chriss-mbp] /tmp/foobar $ turbo build --filter='{./apps/*}[HEAD^1]' --dry=json | jq '.tasks | map(.taskId)' [ "web#build" ] ``` --- docs/repo-docs/reference/run.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/repo-docs/reference/run.mdx b/docs/repo-docs/reference/run.mdx index 99f36a3543565..a07d4d6d42de5 100644 --- a/docs/repo-docs/reference/run.mdx +++ b/docs/repo-docs/reference/run.mdx @@ -190,7 +190,7 @@ You can combine multiple filters to further refine your targets. Multiple filter ```bash title="Terminal" # Any packages in `apps` subdirectories that have changed since the last commit -turbo run build --filter=.apps/* --filter=[HEAD^1] +turbo run build --filter={.apps/*}[HEAD^1] # Any packages in `apps` subdirectories except ./apps/admin turbo run build --filter=./apps/* --filter=!./apps/admin From 65cb125a8fb51d7137edcec01d2f2fbc7fd4be6f Mon Sep 17 00:00:00 2001 From: Samuel Burkhard <15785987+samydoesit@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:01:59 +0200 Subject: [PATCH 45/73] chore(turborepo): add Nitro's env var pattern (#8725) ### Description Nitro pattern uses `NITRO_*`. Reference: [nitro.unjs.io/config#runtimeconfig](https://nitro.unjs.io/config#runtimeconfig) fixes #8504 Co-authored-by: Anthony Shew --- crates/turborepo-lib/src/framework.rs | 12 ++++++++++-- .../using-environment-variables.mdx | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/turborepo-lib/src/framework.rs b/crates/turborepo-lib/src/framework.rs index 830abb5e6fa6e..85d6aefd4d0b2 100644 --- a/crates/turborepo-lib/src/framework.rs +++ b/crates/turborepo-lib/src/framework.rs @@ -31,7 +31,7 @@ impl Framework { } } -static FRAMEWORKS: OnceLock<[Framework; 12]> = OnceLock::new(); +static FRAMEWORKS: OnceLock<[Framework; 13]> = OnceLock::new(); fn get_frameworks() -> &'static [Framework] { FRAMEWORKS.get_or_init(|| { @@ -100,9 +100,17 @@ fn get_frameworks() -> &'static [Framework] { dependencies: vec!["react-scripts", "react-dev-utils"], }, }, + Framework { + slug: "nitro", + env_wildcards: vec!["NITRO_*"], + dependency_match: Matcher { + strategy: Strategy::Some, + dependencies: vec!["nitropack", "nitropack-nightly"], + }, + }, Framework { slug: "nuxtjs", - env_wildcards: vec!["NUXT_*"], + env_wildcards: vec!["NUXT_*", "NITRO_*"], dependency_match: Matcher { strategy: Strategy::Some, dependencies: vec!["nuxt", "nuxt-edge", "nuxt3", "nuxt3-edge"], diff --git a/docs/repo-docs/crafting-your-repository/using-environment-variables.mdx b/docs/repo-docs/crafting-your-repository/using-environment-variables.mdx index c85d1eec27ee7..b63163de0c476 100644 --- a/docs/repo-docs/crafting-your-repository/using-environment-variables.mdx +++ b/docs/repo-docs/crafting-your-repository/using-environment-variables.mdx @@ -63,7 +63,8 @@ Turborepo automatically adds prefix wildcards to your [`env`](/repo/docs/referen | Create React App | `REACT_APP_*` | | Gatsby | `GATSBY_*` | | Next.js | `NEXT_PUBLIC_*` | -| Nuxt.js | `NUXT_*` | +| Nitro | `NITRO_*` | +| Nuxt.js | `NUXT_*`, `NITRO_*`| | RedwoodJS | `REDWOOD_ENV_*` | | Sanity Studio | `SANITY_STUDIO_*` | | Solid | `VITE_*` | From 7f3162f1b05060a4e4db9f1f16b5a49c7ae74f82 Mon Sep 17 00:00:00 2001 From: Ivan Torres <40922354+torresgol10@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:35:54 +0200 Subject: [PATCH 46/73] Replace rimraf to native (#8729) We remove the dependency on `rimraf` and replace it with native, keeping the functionality in `packages/create-turbo` and `packages/turbo-test-utils` --------- Co-authored-by: Anthony Shew --- packages/create-turbo/package.json | 2 - packages/create-turbo/src/utils/git.ts | 4 +- packages/turbo-test-utils/package.json | 3 +- packages/turbo-test-utils/src/useFixtures.ts | 10 +- pnpm-lock.yaml | 98 ++------------------ 5 files changed, 16 insertions(+), 101 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index f1f5012d9a0f2..5736d72868e0c 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -28,7 +28,6 @@ "inquirer": "^8.0.0", "picocolors": "1.0.1", "proxy-agent": "^6.2.2", - "rimraf": "^3.0.2", "semver": "^7.3.8", "update-check": "^1.5.4" }, @@ -43,7 +42,6 @@ "@types/inquirer": "^7.3.1", "@types/jest": "^27.4.0", "@types/node": "^18.17.2", - "@types/rimraf": "^3.0.2", "@types/semver": "^7.3.9", "jest": "^27.4.3", "ts-jest": "^27.1.1", diff --git a/packages/create-turbo/src/utils/git.ts b/packages/create-turbo/src/utils/git.ts index 9f33c8d4c1692..98157a4d7bdfe 100644 --- a/packages/create-turbo/src/utils/git.ts +++ b/packages/create-turbo/src/utils/git.ts @@ -1,6 +1,6 @@ import { execSync } from "node:child_process"; import path from "node:path"; -import { sync as rmSync } from "rimraf"; +import { rmSync } from "node:fs"; export const DEFAULT_IGNORE = ` # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. @@ -71,7 +71,7 @@ export function tryGitInit(root: string, message: string): boolean { } catch (err) { if (didInit) { try { - rmSync(path.join(root, ".git")); + rmSync(path.join(root, ".git"), { recursive: true, force: true }); } catch (_) { // do nothing } diff --git a/packages/turbo-test-utils/package.json b/packages/turbo-test-utils/package.json index 00f38cdc35e9b..1f71e07b057b9 100644 --- a/packages/turbo-test-utils/package.json +++ b/packages/turbo-test-utils/package.json @@ -35,7 +35,6 @@ "dependencies": { "fs-extra": "^11.1.0", "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "rimraf": "^5.0.1" + "json5": "^2.2.3" } } diff --git a/packages/turbo-test-utils/src/useFixtures.ts b/packages/turbo-test-utils/src/useFixtures.ts index 4d18c3a0f1f4d..1c632efe19468 100644 --- a/packages/turbo-test-utils/src/useFixtures.ts +++ b/packages/turbo-test-utils/src/useFixtures.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { randomUUID } from "node:crypto"; -import { rimraf } from "rimraf"; +import { rm } from "node:fs/promises"; import { mkdirSync, existsSync, @@ -30,18 +30,22 @@ export function setupTestFixtures({ afterEach(async () => { await Promise.all( fixtures.map((fixture) => - rimraf(fixture, { + rm(fixture, { retryDelay: 50, maxRetries: 5, + recursive: true, + force: true, }) ) ); }); afterAll(async () => { - await rimraf(parentDirectory, { + await rm(parentDirectory, { retryDelay: 50, maxRetries: 5, + recursive: true, + force: true, }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2cde7cfbebb84..9bcb31868546a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,9 +177,6 @@ importers: proxy-agent: specifier: ^6.2.2 version: 6.2.2 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 semver: specifier: ^7.3.8 version: 7.5.0 @@ -217,9 +214,6 @@ importers: '@types/node': specifier: ^18.17.2 version: 18.17.4 - '@types/rimraf': - specifier: ^3.0.2 - version: 3.0.2 '@types/semver': specifier: ^7.3.9 version: 7.3.12 @@ -743,9 +737,6 @@ importers: json5: specifier: ^2.2.3 version: 2.2.3 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 devDependencies: '@turbo/eslint-config': specifier: workspace:* @@ -2452,18 +2443,6 @@ packages: dev: false optional: true - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.0.1 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false - /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3160,13 +3139,6 @@ packages: '@octokit/openapi-types': 12.11.0 dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false - optional: true - /@pkgr/utils@2.4.2: resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -4137,6 +4109,7 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -5554,6 +5527,7 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true /electron-to-chromium@1.4.328: resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==} @@ -5572,6 +5546,7 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6972,14 +6947,6 @@ packages: for-in: 1.0.2 dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: false - /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -7170,18 +7137,6 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.0 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - dev: false - /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: @@ -8193,15 +8148,6 @@ packages: reflect.getprototypeof: 1.0.3 dev: true - /jackspeak@2.3.0: - resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: false - /jest-changed-files@27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9283,11 +9229,6 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: false - /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -9459,6 +9400,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -9478,11 +9420,6 @@ packages: yallist: 4.0.0 dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false - /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -10291,14 +10228,6 @@ packages: path-root-regex: 0.1.2 dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.1 - minipass: 7.0.4 - dev: false - /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -10926,14 +10855,6 @@ packages: dependencies: glob: 7.2.3 - /rimraf@5.0.1: - resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 10.3.3 - dev: false - /robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false @@ -11197,6 +11118,7 @@ packages: /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + dev: true /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -11480,6 +11402,7 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 + dev: true /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} @@ -13103,15 +13026,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.0.1 - dev: false - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} From ddb801440ae813be6a715c1d9675b475f74f13b5 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 23 Jul 2024 12:25:10 -0500 Subject: [PATCH 47/73] chore: add trace level logging to process management (#8822) ### Description Add additional detailed logging to child process management to aid in finding issues causing https://github.com/vercel/turbo/issues/8281 ### Testing Instructions `rustc` --- crates/turborepo-lib/src/process/child.rs | 21 ++++++++++++++++++--- crates/turborepo-lib/src/process/mod.rs | 8 ++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/crates/turborepo-lib/src/process/child.rs b/crates/turborepo-lib/src/process/child.rs index ad244ed46e311..3c5f0fd37e673 100644 --- a/crates/turborepo-lib/src/process/child.rs +++ b/crates/turborepo-lib/src/process/child.rs @@ -31,7 +31,7 @@ use tokio::{ process::Command as TokioCommand, sync::{mpsc, watch, RwLock}, }; -use tracing::debug; +use tracing::{debug, trace}; use super::Command; @@ -480,8 +480,12 @@ impl Child { /// Wait for the `Child` to exit, returning the exit code. pub async fn wait(&mut self) -> Option { + trace!("watching exit channel of {}", self.label); // If sending end of exit channel closed, then return last value in the channel - self.exit_channel.changed().await.ok(); + match self.exit_channel.changed().await { + Ok(()) => trace!("exit channel was updated"), + Err(_) => trace!("exit channel sender was dropped"), + } *self.exit_channel.borrow() } @@ -654,7 +658,10 @@ impl Child { ) -> Option> { match stream { Some(stream) => match stream.read_until(b'\n', buffer).await { - Ok(0) => None, + Ok(0) => { + trace!("reached EOF"); + None + } Ok(_) => Some(Ok(())), Err(e) => Some(Err(e)), }, @@ -669,26 +676,31 @@ impl Child { loop { tokio::select! { Some(result) = next_line(&mut stdout_lines, &mut stdout_buffer) => { + trace!("processing stdout line"); result?; add_trailing_newline(&mut stdout_buffer); stdout_pipe.write_all(&stdout_buffer)?; stdout_buffer.clear(); } Some(result) = next_line(&mut stderr_lines, &mut stderr_buffer) => { + trace!("processing stderr line"); result?; add_trailing_newline(&mut stderr_buffer); stdout_pipe.write_all(&stderr_buffer)?; stderr_buffer.clear(); } status = self.wait(), if !is_exited => { + trace!("child process exited: {}", self.label()); is_exited = true; // We don't abort in the cases of a zero exit code as we could be // caching this task and should read all the logs it produces. if status != Some(ChildExit::Finished(Some(0))) { + debug!("child process failed, skipping reading stdout/stderr"); return Ok(status); } } else => { + trace!("flushing child stdout/stderr buffers"); // In the case that both futures read a complete line // the future not chosen in the select will return None if it's at EOF // as the number of bytes read will be 0. @@ -753,6 +765,7 @@ impl ChildStateManager { match state { ChildState::Exited(exit) => { // ignore the send error, failure means the channel is dropped + trace!("sending child exit"); self.exit_tx.send(Some(exit)).ok(); } ChildState::Running(_) => { @@ -783,6 +796,7 @@ impl ChildStateManager { } // ignore the send error, the channel is dropped anyways + trace!("sending child exit"); self.exit_tx.send(Some(child_exit)).ok(); } } @@ -832,6 +846,7 @@ mod test { #[test_case(false)] #[test_case(TEST_PTY)] + #[tracing_test::traced_test] #[tokio::test] async fn test_wait(use_pty: bool) { let script = find_script_dir().join_component("hello_world.js"); diff --git a/crates/turborepo-lib/src/process/mod.rs b/crates/turborepo-lib/src/process/mod.rs index 0fdbc3efff594..da7bd0a5bebdc 100644 --- a/crates/turborepo-lib/src/process/mod.rs +++ b/crates/turborepo-lib/src/process/mod.rs @@ -43,6 +43,7 @@ struct ProcessManagerInner { impl ProcessManager { pub fn new(use_pty: bool) -> Self { + debug!("spawning children with pty: {use_pty}"); Self { state: Arc::new(Mutex::new(ProcessManagerInner { is_closing: false, @@ -75,8 +76,14 @@ impl ProcessManager { command: Command, stop_timeout: Duration, ) -> Option> { + let label = tracing::enabled!(tracing::Level::TRACE) + .then(|| command.label()) + .unwrap_or_default(); + trace!("acquiring lock for spawning {label}"); let mut lock = self.state.lock().unwrap(); + trace!("acquired lock for spawning {label}"); if lock.is_closing { + debug!("process manager closing"); return None; } let child = child::Child::spawn( @@ -87,6 +94,7 @@ impl ProcessManager { if let Ok(child) = &child { lock.children.push(child.clone()); } + trace!("releasing lock for spawning {label}"); Some(child) } From 751d0e8db71a6a1043b1c12acb5c59fc09a5c68d Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Tue, 23 Jul 2024 11:06:11 -0700 Subject: [PATCH 48/73] Simplify some of the syntax used with VcRead (#8812) ### Description IMO, many of these types are hard to read: - Use a `VcReadTarget` type alias in `read_ref` to reduce the amount of syntax needed. - Replace a few uses of `<::Read as VcRead>` with `>` in places where `T` is already unambiguously `VcValueType`. - Remove an unnecessary turbofish for an inferred type. ### Testing Instructions ``` cargo check cargo nextest r -p turbo-tasks -p turbo-tasks-memory ``` --- crates/turbo-tasks/src/read_ref.rs | 41 ++++++++++++------------- crates/turbo-tasks/src/task/function.rs | 4 +-- crates/turbo-tasks/src/vc/cast.rs | 4 +-- crates/turbo-tasks/src/vc/cell_mode.rs | 2 +- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/crates/turbo-tasks/src/read_ref.rs b/crates/turbo-tasks/src/read_ref.rs index 29b6a3debd401..3c1255a07cd12 100644 --- a/crates/turbo-tasks/src/read_ref.rs +++ b/crates/turbo-tasks/src/read_ref.rs @@ -15,6 +15,8 @@ use crate::{ SharedReference, Vc, VcRead, VcValueType, }; +type VcReadTarget = <::Read as VcRead>::Target; + /// The read value of a value cell. The read value is immutable, while the cell /// itself might change over time. It's basically a snapshot of a value at a /// certain point in time. @@ -32,7 +34,7 @@ impl std::ops::Deref for ReadRef where T: VcValueType, { - type Target = >::Target; + type Target = VcReadTarget; fn deref(&self) -> &Self::Target { T::Read::value_to_target_ref(&self.0) @@ -42,7 +44,7 @@ where impl Display for ReadRef where T: VcValueType, - >::Target: Display, + VcReadTarget: Display, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { Display::fmt(&**self, f) @@ -52,7 +54,7 @@ where impl Debug for ReadRef where T: VcValueType, - >::Target: Debug, + VcReadTarget: Debug, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { Debug::fmt(&**self, f) @@ -62,7 +64,7 @@ where impl TraceRawVcs for ReadRef where T: VcValueType, - >::Target: TraceRawVcs, + VcReadTarget: TraceRawVcs, { fn trace_raw_vcs(&self, trace_context: &mut TraceRawVcsContext) { (**self).trace_raw_vcs(trace_context); @@ -72,7 +74,7 @@ where impl ValueDebugFormat for ReadRef where T: VcValueType, - >::Target: ValueDebugFormat + 'static, + VcReadTarget: ValueDebugFormat + 'static, { fn value_debug_format(&self, depth: usize) -> ValueDebugFormatString { let value = &**self; @@ -83,7 +85,7 @@ where impl PartialEq for ReadRef where T: VcValueType, - >::Target: PartialEq, + VcReadTarget: PartialEq, { fn eq(&self, other: &Self) -> bool { PartialEq::eq(&**self, &**other) @@ -93,14 +95,14 @@ where impl Eq for ReadRef where T: VcValueType, - >::Target: Eq, + VcReadTarget: Eq, { } impl PartialOrd for ReadRef where T: VcValueType, - >::Target: PartialOrd, + VcReadTarget: PartialOrd, { fn partial_cmp(&self, other: &Self) -> Option { PartialOrd::partial_cmp(&**self, &**other) @@ -110,7 +112,7 @@ where impl Ord for ReadRef where T: VcValueType, - >::Target: Ord, + VcReadTarget: Ord, { fn cmp(&self, other: &Self) -> std::cmp::Ordering { Ord::cmp(&**self, &**other) @@ -120,7 +122,7 @@ where impl Hash for ReadRef where T: VcValueType, - >::Target: Hash, + VcReadTarget: Hash, { fn hash(&self, state: &mut H) { Hash::hash(&**self, state) @@ -130,7 +132,7 @@ where impl DeterministicHash for ReadRef where T: VcValueType, - >::Target: DeterministicHash, + VcReadTarget: DeterministicHash, { fn deterministic_hash(&self, state: &mut H) { let p = &**self; @@ -141,7 +143,7 @@ where impl<'a, T, I, J: Iterator> IntoIterator for &'a ReadRef where T: VcValueType, - &'a >::Target: IntoIterator, + &'a VcReadTarget: IntoIterator, { type Item = I; @@ -155,7 +157,7 @@ where impl> IntoIterator for ReadRef where T: VcValueType, - &'static >::Target: IntoIterator, + &'static VcReadTarget: IntoIterator, { type Item = I; @@ -165,12 +167,7 @@ where let r = &*self; // # Safety // The reference will we valid as long as the ReadRef is valid. - let r = unsafe { - transmute_copy::< - &'_ >::Target, - &'static >::Target, - >(&r) - }; + let r = unsafe { transmute_copy::<&'_ VcReadTarget, &'static VcReadTarget>(&r) }; ReadRefIter { read_ref: self, iter: r.into_iter(), @@ -201,7 +198,7 @@ where impl Serialize for ReadRef where T: VcValueType, - >::Target: Serialize, + VcReadTarget: Serialize, { fn serialize(&self, serializer: S) -> Result where @@ -260,11 +257,11 @@ where impl ReadRef where T: VcValueType, - >::Target: Clone, + VcReadTarget: Clone, { /// This will clone the contained value instead of cloning the ReadRef. /// This clone is more expensive, but allows to get an mutable owned value. - pub fn clone_value(&self) -> >::Target { + pub fn clone_value(&self) -> VcReadTarget { (**self).clone() } } diff --git a/crates/turbo-tasks/src/task/function.rs b/crates/turbo-tasks/src/task/function.rs index 243404ca7490d..12e83ab98a0f2 100644 --- a/crates/turbo-tasks/src/task/function.rs +++ b/crates/turbo-tasks/src/task/function.rs @@ -244,7 +244,7 @@ macro_rules! task_fn_impl { Ok(Box::pin(async move { let recv = recv.await?; - let recv = <::Read as VcRead>::target_to_value_ref(&*recv); + let recv = >::target_to_value_ref(&*recv); Output::try_into_raw_vc((task_fn)(recv, $($arg,)*)) })) } @@ -306,7 +306,7 @@ macro_rules! task_fn_impl { Ok(Box::pin(async move { let recv = recv.await?; - let recv = <::Read as VcRead>::target_to_value_ref(&*recv); + let recv = >::target_to_value_ref(&*recv); >::Output::try_into_raw_vc((task_fn)(recv, $($arg,)*).await) })) } diff --git a/crates/turbo-tasks/src/vc/cast.rs b/crates/turbo-tasks/src/vc/cast.rs index b8a56d07f829a..b8f0edf2490a2 100644 --- a/crates/turbo-tasks/src/vc/cast.rs +++ b/crates/turbo-tasks/src/vc/cast.rs @@ -37,9 +37,7 @@ where std::mem::transmute_copy::< ManuallyDrop>::Repr>>, Self::Output, - >(&ManuallyDrop::new( - content.cast::<>::Repr>()?, - )) + >(&ManuallyDrop::new(content.cast()?)) }, ) } diff --git a/crates/turbo-tasks/src/vc/cell_mode.rs b/crates/turbo-tasks/src/vc/cell_mode.rs index 5e71be6f03a27..8c50017bfa263 100644 --- a/crates/turbo-tasks/src/vc/cell_mode.rs +++ b/crates/turbo-tasks/src/vc/cell_mode.rs @@ -41,7 +41,7 @@ pub struct VcCellSharedMode { impl VcCellMode for VcCellSharedMode where T: VcValueType, - <::Read as VcRead>::Repr: PartialEq, + >::Repr: PartialEq, { fn cell(inner: >::Target) -> Vc { let cell = find_cell_by_type(T::get_value_type_id()); From b32a1dd7820ff529e6c3bed208cc1d4a09a81343 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:18:06 -0500 Subject: [PATCH 49/73] release(turborepo): 2.0.10-canary.0 (#8824) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index 5736d72868e0c..a784a70c2579b 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index 7ce65d5746549..c88fcc5bf3ff2 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index fdb3645c9e80c..a0c843da09f36 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index 359574fcf01a8..25837051718e3 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index 735cb72c003ad..f16cceb8d67ee 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index 89df8dbca0ef6..a12a3dc6587ba 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index 2b08d95664b84..471f98d85d601 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index ad760b4c9fb99..eb12fcb98dc07 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index b2216ae668aae..40c76562afeb7 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.9", + "version": "2.0.10-canary.0", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.9", - "turbo-darwin-arm64": "2.0.9", - "turbo-linux-64": "2.0.9", - "turbo-linux-arm64": "2.0.9", - "turbo-windows-64": "2.0.9", - "turbo-windows-arm64": "2.0.9" + "turbo-darwin-64": "2.0.10-canary.0", + "turbo-darwin-arm64": "2.0.10-canary.0", + "turbo-linux-64": "2.0.10-canary.0", + "turbo-linux-arm64": "2.0.10-canary.0", + "turbo-windows-64": "2.0.10-canary.0", + "turbo-windows-arm64": "2.0.10-canary.0" } } diff --git a/version.txt b/version.txt index 82183a4db51bc..553a517e940ac 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.9 -latest +2.0.10-canary.0 +canary From 00039b94406789b2eb9c9bad92f8d6a22d6996ee Mon Sep 17 00:00:00 2001 From: hrmny <8845940+ForsakenHarmony@users.noreply.github.com> Date: Wed, 24 Jul 2024 16:20:44 +0200 Subject: [PATCH 50/73] feat(turbopack): support analysing string concatenation (#8823) ### Description Adds support for `String.prototype.concat` which `dayjs` uses in an `import()` pattern. ### Testing Instructions Closes PACK-3118 Fixes https://github.com/vercel/next.js/issues/66826 --- .../src/analyzer/builtin.rs | 15 ++++++++ .../dynamic-requests/basic/input/index.js | 36 +++++++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/crates/turbopack-ecmascript/src/analyzer/builtin.rs b/crates/turbopack-ecmascript/src/analyzer/builtin.rs index 9c39c0486c81a..781aaf79fd433 100644 --- a/crates/turbopack-ecmascript/src/analyzer/builtin.rs +++ b/crates/turbopack-ecmascript/src/analyzer/builtin.rs @@ -412,6 +412,21 @@ pub fn replace_builtin(value: &mut JsValue) -> bool { } _ => {} } + + // matching calls on strings like `"dayjs/locale/".concat(userLocale, ".js")` + if obj.is_string() == Some(true) { + if let Some(str) = prop.as_str() { + // The String.prototype.concat method + if str == "concat" { + let mut values = vec![take(obj)]; + values.extend(take(args)); + + *value = JsValue::concat(values); + return true; + } + } + } + // without special handling, we convert it into a normal call like // `(obj.prop)(arg1, arg2, ...)` *value = JsValue::call( diff --git a/crates/turbopack-tests/tests/execution/turbopack/dynamic-requests/basic/input/index.js b/crates/turbopack-tests/tests/execution/turbopack/dynamic-requests/basic/input/index.js index ddb11fcf2fabd..9d272d883f96b 100644 --- a/crates/turbopack-tests/tests/execution/turbopack/dynamic-requests/basic/input/index.js +++ b/crates/turbopack-tests/tests/execution/turbopack/dynamic-requests/basic/input/index.js @@ -2,11 +2,14 @@ import * as a from "./dir/a.js"; import * as b from "./dir/b.ts"; const requireTemplate = (key) => require(`./dir/${key}`); -const requireConcat = (key) => require("./dir/" + key); +const requireAdd = (key) => require("./dir/" + key); +const requireConcat = (key) => require("./dir/".concat(key)); const importTemplate = (key) => import(`./dir/${key}`); const importTemplateSuffix = (key) => import(`./dir/${key}.js`); -const importConcat = (key) => import("./dir/" + key); -const importConcatSuffix = (key) => import("./dir/" + key + ".js"); +const importAdd = (key) => import("./dir/" + key); +const importAddSuffix = (key) => import("./dir/" + key + ".js"); +const importConcat = (key) => import("./dir/".concat(key)); +const importConcatSuffix = (key) => import("./dir/".concat(key, ".js")); it("should support dynamic requests in require with template literals", () => { expect(requireTemplate("a.js")).toBe(a); @@ -15,6 +18,13 @@ it("should support dynamic requests in require with template literals", () => { expect(requireTemplate("d.js")).toBe("d"); }); +it("should support dynamic requests in require with addition", () => { + expect(requireAdd("a.js")).toBe(a); + expect(requireAdd("b.ts")).toBe(b); + expect(requireAdd("c.module.css")).toHaveProperty("class"); + expect(requireAdd("d.js")).toBe("d"); +}); + it("should support dynamic requests in require with concatenation", () => { expect(requireConcat("a.js")).toBe(a); expect(requireConcat("b.ts")).toBe(b); @@ -37,6 +47,13 @@ it("should support dynamic requests in import with template literals and suffix" ); }); +it("should support dynamic requests in import with addition", async () => { + await expect(importAdd("a.js")).resolves.toBe(a); + await expect(importAdd("b.ts")).resolves.toBe(b); + await expect(importAdd("c.module.css")).resolves.toHaveProperty("class"); + await expect(importAdd("d.js")).resolves.toHaveProperty("default", "d"); +}); + it("should support dynamic requests in import with concatenation", async () => { await expect(importConcat("a.js")).resolves.toBe(a); await expect(importConcat("b.ts")).resolves.toBe(b); @@ -44,6 +61,11 @@ it("should support dynamic requests in import with concatenation", async () => { await expect(importConcat("d.js")).resolves.toHaveProperty("default", "d"); }); +it("should support dynamic requests in import with addition and suffix", async () => { + await expect(importAddSuffix("a")).resolves.toBe(a); + await expect(importAddSuffix("d")).resolves.toHaveProperty("default", "d"); +}); + it("should support dynamic requests in import with concatenation and suffix", async () => { await expect(importConcatSuffix("a")).resolves.toBe(a); await expect(importConcatSuffix("d")).resolves.toHaveProperty("default", "d"); @@ -51,18 +73,24 @@ it("should support dynamic requests in import with concatenation and suffix", as it("should throw an error when requesting a non-existent file", async () => { expect(() => requireTemplate("e.js")).toThrowError(); + expect(() => requireAdd("e.js")).toThrowError(); expect(() => requireConcat("e.js")).toThrowError(); await expect(importTemplate("e.js")).rejects.toThrowError(); + await expect(importAdd("e.js")).rejects.toThrowError(); await expect(importConcat("e.js")).rejects.toThrowError(); }); it("should support dynamic requests without the extension", async () => { expect(requireTemplate("a")).toBe(a); + expect(requireAdd("a")).toBe(a); expect(requireConcat("a")).toBe(a); expect(requireTemplate("d")).toBe("d"); + expect(requireAdd("d")).toBe("d"); expect(requireConcat("d")).toBe("d"); await expect(importTemplate("a")).resolves.toBe(a); await expect(importTemplate("d")).resolves.toHaveProperty("default", "d"); + await expect(importAdd("a")).resolves.toBe(a); + await expect(importAdd("d")).resolves.toHaveProperty("default", "d"); await expect(importConcat("a")).resolves.toBe(a); await expect(importConcat("d")).resolves.toHaveProperty("default", "d"); }); @@ -70,6 +98,8 @@ it("should support dynamic requests without the extension", async () => { it("should not support dynamic requests with double extension", async () => { await expect(importTemplateSuffix("a.js")).rejects.toThrowError(); await expect(importTemplateSuffix("d.js")).rejects.toThrowError(); + await expect(importAddSuffix("a.js")).rejects.toThrowError(); + await expect(importAddSuffix("d.js")).rejects.toThrowError(); await expect(importConcatSuffix("a.js")).rejects.toThrowError(); await expect(importConcatSuffix("d.js")).rejects.toThrowError(); }); From 962fdb00cc253e473123fae143756a9fa6c24be5 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 24 Jul 2024 17:36:19 +0200 Subject: [PATCH 51/73] change from failsafe_analyse to failsafe_parse (#8828) ### Description change from failsafe_analyse to failsafe_parse as ParseResult is flat and can be snapshot easily failsafe_analyze didn't work correctly as it stores nested Vcs in State which breaks GC and dropping of excessive cells since these Vcs point to stale cells that no longer exist ### Testing Instructions --- crates/turbopack-ecmascript/src/lib.rs | 111 ++++-------------- crates/turbopack-ecmascript/src/parse.rs | 1 + .../src/references/mod.rs | 6 +- .../side_effect_optimization/facade/module.rs | 4 +- .../side_effect_optimization/locals/module.rs | 2 +- .../src/tree_shake/asset.rs | 2 +- crates/turbopack-mdx/src/lib.rs | 6 +- 7 files changed, 36 insertions(+), 96 deletions(-) diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index d198702e7020e..b963ae5a7f903 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -74,7 +74,7 @@ use turbopack_core::{ FindContextFileResult, ModulePart, }, source::Source, - source_map::{GenerateSourceMap, OptionSourceMap, SourceMap}, + source_map::{GenerateSourceMap, OptionSourceMap}, }; // TODO remove this pub use turbopack_resolve::ecmascript as resolve; @@ -181,18 +181,6 @@ fn modifier() -> Vc { Vc::cell("ecmascript".into()) } -#[derive(PartialEq, Eq, Clone, TraceRawVcs)] -struct MemoizedSuccessfulAnalysis { - operation: Vc, - references: ReadRef, - local_references: ReadRef, - reexport_references: ReadRef, - evaluation_references: ReadRef, - exports: ReadRef, - async_module: ReadRef, - source_map: Option>, -} - #[derive(Clone)] pub struct EcmascriptModuleAssetBuilder { source: Vc>, @@ -256,7 +244,7 @@ pub struct EcmascriptModuleAsset { pub inner_assets: Option>, #[turbo_tasks(debug_ignore)] #[serde(skip)] - last_successful_analysis: turbo_tasks::State>, + last_successful_parse: turbo_tasks::State>>, } /// An optional [EcmascriptModuleAsset] @@ -335,7 +323,7 @@ impl EcmascriptModuleAsset { options, compile_time_info, inner_assets: None, - last_successful_analysis: Default::default(), + last_successful_parse: Default::default(), }) } @@ -357,7 +345,7 @@ impl EcmascriptModuleAsset { options, compile_time_info, inner_assets: Some(inner_assets), - last_successful_analysis: Default::default(), + last_successful_parse: Default::default(), }) } @@ -377,69 +365,24 @@ impl EcmascriptModuleAsset { } #[turbo_tasks::function] - pub async fn failsafe_analyze(self: Vc) -> Result> { - let this = self.await?; - - let result = self.analyze(); - let result_value = result.await?; - - let successful = result_value.successful; - let current_memo = MemoizedSuccessfulAnalysis { - operation: result, - // We need to store the ReadRefs since we want to keep a snapshot. - references: result_value.references.await?, - local_references: result_value.local_references.await?, - reexport_references: result_value.reexport_references.await?, - evaluation_references: result_value.evaluation_references.await?, - exports: result_value.exports.await?, - async_module: result_value.async_module.await?, - source_map: if let Some(map) = *result_value.source_map.await? { - Some(map.await?) - } else { - None - }, - }; - let state_ref; - let best_value = if successful { - ¤t_memo - } else { - state_ref = this.last_successful_analysis.get(); - state_ref.as_ref().unwrap_or(¤t_memo) - }; - let MemoizedSuccessfulAnalysis { - operation, - references, - local_references, - reexport_references, - evaluation_references, - exports, - async_module, - source_map, - } = best_value; - // It's important to connect to the last operation here to keep it active, so - // it's potentially recomputed when garbage collected - Vc::connect(*operation); - let result = AnalyzeEcmascriptModuleResult { - references: ReadRef::cell(references.clone()), - local_references: ReadRef::cell(local_references.clone()), - reexport_references: ReadRef::cell(reexport_references.clone()), - evaluation_references: ReadRef::cell(evaluation_references.clone()), - exports: ReadRef::cell(exports.clone()), - code_generation: result_value.code_generation, - async_module: ReadRef::cell(async_module.clone()), - source_map: Vc::cell(source_map.clone().map(ReadRef::cell)), - successful, - } - .cell(); - if successful { - this.last_successful_analysis.set(Some(current_memo)); - } - Ok(result) + pub fn parse(&self) -> Vc { + parse(self.source, Value::new(self.ty), self.transforms) } #[turbo_tasks::function] - pub fn parse(&self) -> Vc { - parse(self.source, Value::new(self.ty), self.transforms) + pub async fn failsafe_parse(self: Vc) -> Result> { + let real_result = self.parse(); + let real_result_value = real_result.await?; + let this = self.await?; + let result_value = if matches!(*real_result_value, ParseResult::Ok { .. }) { + this.last_successful_parse + .set(Some(real_result_value.clone())); + real_result_value + } else { + let state_ref = this.last_successful_parse.get(); + state_ref.as_ref().unwrap_or(&real_result_value).clone() + }; + Ok(ReadRef::cell(result_value)) } #[turbo_tasks::function] @@ -498,7 +441,7 @@ impl EcmascriptModuleAsset { ) -> Result> { let this = self.await?; - let parsed = parse(this.source, Value::new(this.ty), this.transforms); + let parsed = self.parse(); Ok(EcmascriptModuleContent::new_without_analysis( parsed, @@ -513,11 +456,7 @@ impl EcmascriptModuleAsset { chunking_context: Vc>, async_module_info: Option>, ) -> Result> { - let this = self.await?; - - let parsed = parse(this.source, Value::new(this.ty), this.transforms) - .resolve() - .await?; + let parsed = self.parse().resolve().await?; let analyze = self.analyze().await?; @@ -561,7 +500,7 @@ impl Module for EcmascriptModuleAsset { #[turbo_tasks::function] async fn references(self: Vc) -> Result> { - let analyze = self.failsafe_analyze().await?; + let analyze = self.analyze().await?; let references = analyze.references.await?.iter().copied().collect(); Ok(Vc::cell(references)) } @@ -593,12 +532,12 @@ impl ChunkableModule for EcmascriptModuleAsset { impl EcmascriptChunkPlaceable for EcmascriptModuleAsset { #[turbo_tasks::function] async fn get_exports(self: Vc) -> Result> { - Ok(self.failsafe_analyze().await?.exports) + Ok(self.analyze().await?.exports) } #[turbo_tasks::function] async fn get_async_module(self: Vc) -> Result> { - Ok(self.failsafe_analyze().await?.async_module) + Ok(self.analyze().await?.async_module) } } @@ -669,7 +608,7 @@ impl ChunkItem for ModuleChunkItem { #[turbo_tasks::function] async fn is_self_async(&self) -> Result> { if let Some(async_module) = *self.module.get_async_module().await? { - Ok(async_module.is_self_async(self.module.failsafe_analyze().await?.references)) + Ok(async_module.is_self_async(self.module.analyze().await?.references)) } else { Ok(Vc::cell(false)) } diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index 7fae1353e5cbd..9a7580e628a66 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -45,6 +45,7 @@ use crate::{ #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] #[allow(clippy::large_enum_variant)] pub enum ParseResult { + // Note: Ok must not contain any Vc as it's snapshot by failsafe_parse Ok { #[turbo_tasks(debug_ignore, trace_ignore)] program: Program, diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index e284992e9ad58..5a4eaab2a4e67 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -102,7 +102,7 @@ use super::{ WellKnownObjectKind, }, errors, - parse::{parse, ParseResult}, + parse::ParseResult, special_cases::special_cases, utils::js_value_to_pattern, webpack::{ @@ -427,11 +427,11 @@ pub(crate) async fn analyse_ecmascript_module_internal( }; let parsed = if let Some(part) = part { - let parsed = parse(source, ty, transforms); + let parsed = module.failsafe_parse(); let split_data = split(source.ident(), source, parsed); part_of_module(split_data, part) } else { - parse(source, ty, transforms) + module.failsafe_parse() }; let ModuleTypeResult { diff --git a/crates/turbopack-ecmascript/src/side_effect_optimization/facade/module.rs b/crates/turbopack-ecmascript/src/side_effect_optimization/facade/module.rs index c2092447a8127..ba03e3357eafe 100644 --- a/crates/turbopack-ecmascript/src/side_effect_optimization/facade/module.rs +++ b/crates/turbopack-ecmascript/src/side_effect_optimization/facade/module.rs @@ -79,7 +79,7 @@ impl Module for EcmascriptModuleFacadeModule { ModulePart::Evaluation" ); }; - let result = module.failsafe_analyze().await?; + let result = module.analyze().await?; let references = result.evaluation_references; let mut references = references.await?.clone_value(); references.push(Vc::upcast(EcmascriptModulePartReference::new_part( @@ -97,7 +97,7 @@ impl Module for EcmascriptModuleFacadeModule { ModulePart::Evaluation" ); }; - let result = module.failsafe_analyze().await?; + let result = module.analyze().await?; let references = result.reexport_references; let mut references = references.await?.clone_value(); references.push(Vc::upcast(EcmascriptModulePartReference::new_part( diff --git a/crates/turbopack-ecmascript/src/side_effect_optimization/locals/module.rs b/crates/turbopack-ecmascript/src/side_effect_optimization/locals/module.rs index 39b98678c3f40..0cc104ef0b999 100644 --- a/crates/turbopack-ecmascript/src/side_effect_optimization/locals/module.rs +++ b/crates/turbopack-ecmascript/src/side_effect_optimization/locals/module.rs @@ -49,7 +49,7 @@ impl Module for EcmascriptModuleLocalsModule { #[turbo_tasks::function] async fn references(&self) -> Result> { - let result = self.module.failsafe_analyze().await?; + let result = self.module.analyze().await?; Ok(result.local_references) } } diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index c7b4b7c2d7168..63a43ea340ee7 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -50,7 +50,7 @@ impl EcmascriptModulePartAsset { #[turbo_tasks::function] pub async fn is_async_module(self: Vc) -> Result> { let this = self.await?; - let result = this.full_module.failsafe_analyze(); + let result = this.full_module.analyze(); if let Some(async_module) = *result.await?.async_module.await? { Ok(async_module.is_self_async(self.references())) diff --git a/crates/turbopack-mdx/src/lib.rs b/crates/turbopack-mdx/src/lib.rs index a02b29837926c..9468495d4a9bc 100644 --- a/crates/turbopack-mdx/src/lib.rs +++ b/crates/turbopack-mdx/src/lib.rs @@ -191,11 +191,11 @@ impl MdxModuleAsset { } #[turbo_tasks::function] - async fn failsafe_analyze(self: Vc) -> Result> { + async fn analyze(self: Vc) -> Result> { let asset = into_ecmascript_module_asset(&self).await; if let Ok(asset) = asset { - Ok(asset.failsafe_analyze()) + Ok(asset.analyze()) } else { let mut result = AnalyzeEcmascriptModuleResultBuilder::new(); result.set_successful(false); @@ -216,7 +216,7 @@ impl Module for MdxModuleAsset { #[turbo_tasks::function] async fn references(self: Vc) -> Result> { - let analyze = self.failsafe_analyze().await?; + let analyze = self.analyze().await?; Ok(analyze.references) } } From d18741fe01df8a9cde4c7a7a6499093c17a48fc7 Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Wed, 24 Jul 2024 19:32:47 +0100 Subject: [PATCH 52/73] make sure that all the taiki-e/install-action calls use our env (#8831) ### Description In some cases we can time out in CI because the cargo install action will fetch binaries from github. ### Testing Instructions Run CI 100 times and see our rust setup step hang less :P --- .github/actions/setup-rust/action.yml | 2 ++ .github/workflows/bench-turbotrace-against-node-nft.yml | 2 ++ .github/workflows/test-turbopack-rust-bench-test.yml | 2 ++ .github/workflows/turbopack-test.yml | 4 ++++ 4 files changed, 10 insertions(+) diff --git a/.github/actions/setup-rust/action.yml b/.github/actions/setup-rust/action.yml index af7e3705d2926..e31772416a302 100644 --- a/.github/actions/setup-rust/action.yml +++ b/.github/actions/setup-rust/action.yml @@ -66,6 +66,8 @@ runs: - name: "Install cargo-sweep" uses: taiki-e/install-action@v2 + env: + GITHUB_TOKEN: ${{ inputs.github-token }} with: tool: cargo-sweep@0.6.2,cargo-groups@0.1.9 diff --git a/.github/workflows/bench-turbotrace-against-node-nft.yml b/.github/workflows/bench-turbotrace-against-node-nft.yml index 0308b16d0eeec..532cf2e518398 100644 --- a/.github/workflows/bench-turbotrace-against-node-nft.yml +++ b/.github/workflows/bench-turbotrace-against-node-nft.yml @@ -42,6 +42,8 @@ jobs: - name: Install nextest uses: taiki-e/install-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tool: cargo-nextest@0.9.61 diff --git a/.github/workflows/test-turbopack-rust-bench-test.yml b/.github/workflows/test-turbopack-rust-bench-test.yml index 779dd363fff89..b0b3a1cb77d52 100644 --- a/.github/workflows/test-turbopack-rust-bench-test.yml +++ b/.github/workflows/test-turbopack-rust-bench-test.yml @@ -30,6 +30,8 @@ jobs: - name: Setup Rust uses: ./.github/actions/setup-rust + env: + GITHUB_TOKEN: ${{ github.token }} with: save-cache: true github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/turbopack-test.yml b/.github/workflows/turbopack-test.yml index b5313e8d62acc..5011e1994b21c 100644 --- a/.github/workflows/turbopack-test.yml +++ b/.github/workflows/turbopack-test.yml @@ -339,6 +339,8 @@ jobs: - name: Install nextest uses: taiki-e/install-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tool: cargo-nextest@0.9.61 @@ -414,6 +416,8 @@ jobs: - name: Install nextest uses: taiki-e/install-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tool: cargo-nextest@0.9.61 From 64e670ffe625b83b4e1c2a24cc2e659845d921a6 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 24 Jul 2024 20:50:59 +0200 Subject: [PATCH 53/73] Refactor cell reading to handle removed cells (#8819) ### Description Refactor cell reading to handle removed cells handle recomputation of cells on read use start event instead of done event when waiting for task reading That's how the Cell state changes: ![image](https://github.com/user-attachments/assets/7e9ff129-1169-433f-a0be-dae90af014e2) ### Testing Instructions --- crates/turbo-tasks-memory/src/cell.rs | 270 +++++++----------- .../turbo-tasks-memory/src/memory_backend.rs | 52 ++-- crates/turbo-tasks-memory/src/task.rs | 200 ++++++++++--- .../turbo-tasks-memory/tests/emptied_cells.rs | 65 +++++ 4 files changed, 355 insertions(+), 232 deletions(-) create mode 100644 crates/turbo-tasks-memory/tests/emptied_cells.rs diff --git a/crates/turbo-tasks-memory/src/cell.rs b/crates/turbo-tasks-memory/src/cell.rs index 11b756f84217c..b25d054dbe152 100644 --- a/crates/turbo-tasks-memory/src/cell.rs +++ b/crates/turbo-tasks-memory/src/cell.rs @@ -1,9 +1,5 @@ -use std::{ - fmt::Debug, - mem::{replace, take}, -}; +use std::{fmt::Debug, mem::replace}; -use auto_hash_map::AutoSet; use turbo_tasks::{ backend::CellContent, event::{Event, EventListener}, @@ -13,71 +9,66 @@ use turbo_tasks::{ use crate::MemoryBackend; #[derive(Default, Debug)] -pub(crate) enum Cell { - /// No content has been set yet, or it was removed for memory pressure - /// reasons. +pub(crate) struct Cell { + dependent_tasks: TaskIdSet, + state: CellState, +} + +#[derive(Default, Debug)] +pub(crate) enum CellState { + /// No content has been set yet, or + /// it was removed for memory pressure reasons, or + /// cell is no longer used (It was assigned once and then no longer used + /// after recomputation). + /// /// Assigning a value will transition to the Value state. - /// Reading this cell will transition to the Recomputing state. + /// Reading this cell will, + /// - transition to the Computing state if the task is is progress + /// - return an error if the task is already done. #[default] Empty, /// The content has been removed for memory pressure reasons, but the /// tracking is still active. Any update will invalidate dependent tasks. /// Assigning a value will transition to the Value state. - /// Reading this cell will transition to the Recomputing state. - TrackedValueless { dependent_tasks: TaskIdSet }, + /// Reading this cell will transition to the Computing state. + TrackedValueless, /// Someone wanted to read the content and it was not available. The content - /// is now being recomputed. + /// is now being computed. /// Assigning a value will transition to the Value state. - Recomputing { - dependent_tasks: TaskIdSet, + /// When the task ends this transitions to the Empty state if not assigned. + Computing { + /// The event that will be triggered when transitioning to another + /// state. event: Event, }, /// The content was set only once and is tracked. /// GC operation will transition to the TrackedValueless state. - Value { - dependent_tasks: TaskIdSet, - content: CellContent, - }, + Value { content: CellContent }, } -#[derive(Debug)] -pub struct RecomputingCell { - pub listener: EventListener, - pub schedule: bool, +pub enum ReadContentError { + Computing { + listener: EventListener, + schedule: bool, + }, + Unused, } impl Cell { /// Removes a task from the list of dependent tasks. pub fn remove_dependent_task(&mut self, task: TaskId) { - match self { - Cell::Empty => {} - Cell::Value { - dependent_tasks, .. - } - | Cell::TrackedValueless { - dependent_tasks, .. - } - | Cell::Recomputing { - dependent_tasks, .. - } => { - dependent_tasks.remove(&task); - } - } + self.dependent_tasks.remove(&task); } /// Switch the cell to recomputing state. - fn recompute( + fn compute( &mut self, - dependent_tasks: TaskIdSet, description: impl Fn() -> String + Sync + Send + 'static, note: impl Fn() -> String + Sync + Send + 'static, ) -> EventListener { - let event = Event::new(move || (description)() + " -> Cell::Recomputing::event"); + let event = Event::new(move || (description)() + " -> CellState::Computing::event"); let listener = event.listen_with_note(note); - *self = Cell::Recomputing { - event, - dependent_tasks, - }; + self.state = CellState::Computing { event }; listener } @@ -87,20 +78,24 @@ impl Cell { pub fn read_content( &mut self, reader: TaskId, + task_done: bool, description: impl Fn() -> String + Sync + Send + 'static, note: impl Fn() -> String + Sync + Send + 'static, - ) -> Result { - if let Cell::Value { - content, - dependent_tasks, - .. - } = self - { - dependent_tasks.insert(reader); - return Ok(content.clone()); + ) -> Result { + match &self.state { + CellState::Value { content } => { + self.dependent_tasks.insert(reader); + Ok(content.clone()) + } + CellState::Empty if task_done => { + self.dependent_tasks.insert(reader); + Err(ReadContentError::Unused) + } + _ => { + // Same behavior for all other states, so we reuse the same code. + self.read_content_untracked(task_done, description, note) + } } - // Same behavior for all other states, so we reuse the same code. - self.read_content_untracked(description, note) } /// Read the content of the cell when avaiable. Does not register the reader @@ -111,35 +106,37 @@ impl Cell { /// track dependencies, so using it could break cache invalidation. pub fn read_content_untracked( &mut self, + task_done: bool, description: impl Fn() -> String + Sync + Send + 'static, note: impl Fn() -> String + Sync + Send + 'static, - ) -> Result { - match self { - Cell::Empty => { - let listener = self.recompute(AutoSet::default(), description, note); - Err(RecomputingCell { - listener, - schedule: true, - }) + ) -> Result { + match &self.state { + CellState::Value { content } => Ok(content.clone()), + CellState::Empty => { + if task_done { + Err(ReadContentError::Unused) + } else { + let listener = self.compute(description, note); + Err(ReadContentError::Computing { + listener, + schedule: true, + }) + } } - Cell::Recomputing { event, .. } => { + CellState::Computing { event } => { let listener = event.listen_with_note(note); - Err(RecomputingCell { + Err(ReadContentError::Computing { listener, schedule: false, }) } - &mut Cell::TrackedValueless { - ref mut dependent_tasks, - } => { - let dependent_tasks = take(dependent_tasks); - let listener = self.recompute(dependent_tasks, description, note); - Err(RecomputingCell { + CellState::TrackedValueless => { + let listener = self.compute(description, note); + Err(ReadContentError::Computing { listener, schedule: true, }) } - Cell::Value { content, .. } => Ok(content.clone()), } } @@ -150,11 +147,11 @@ impl Cell { /// INVALIDATION: Be careful with this, it will not track /// dependencies, so using it could break cache invalidation. pub fn read_own_content_untracked(&self) -> CellContent { - match self { - Cell::Empty | Cell::Recomputing { .. } | Cell::TrackedValueless { .. } => { + match &self.state { + CellState::Empty | CellState::Computing { .. } | CellState::TrackedValueless => { CellContent(None) } - Cell::Value { content, .. } => content.clone(), + CellState::Value { content } => content.clone(), } } @@ -168,104 +165,56 @@ impl Cell { clean: bool, turbo_tasks: &dyn TurboTasksBackendApi, ) { - match self { - Cell::Empty => { - *self = Cell::Value { - content, - dependent_tasks: AutoSet::default(), - }; - } - &mut Cell::Recomputing { - ref mut event, - ref mut dependent_tasks, - } => { + match &self.state { + CellState::Empty => {} + CellState::Computing { event } => { event.notify(usize::MAX); if clean { // We can assume that the task is deterministic and produces the same content // again. No need to notify dependent tasks. - *self = Cell::Value { - content, - dependent_tasks: take(dependent_tasks), - }; - } else { - // Assigning to a cell will invalidate all dependent tasks as the content might - // have changed. - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(dependent_tasks); - } - *self = Cell::Value { - content, - dependent_tasks: AutoSet::default(), - }; + self.state = CellState::Value { content }; + return; } } - &mut Cell::TrackedValueless { - ref mut dependent_tasks, - } => { + CellState::TrackedValueless => { if clean { // We can assume that the task is deterministic and produces the same content // again. No need to notify dependent tasks. - *self = Cell::Value { - content, - dependent_tasks: take(dependent_tasks), - }; - } else { - // Assigning to a cell will invalidate all dependent tasks as the content might - // have changed. - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(dependent_tasks); - } - *self = Cell::Value { - content, - dependent_tasks: AutoSet::default(), - }; + self.state = CellState::Value { content }; + return; } } - Cell::Value { - content: ref mut cell_content, - dependent_tasks, + CellState::Value { + content: cell_content, } => { - if content != *cell_content { - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(dependent_tasks); - dependent_tasks.clear(); - } - *cell_content = content; + if content == *cell_content { + return; } } } + self.state = CellState::Value { content }; + // Assigning to a cell will invalidate all dependent tasks as the content might + // have changed. + if !self.dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(&self.dependent_tasks); + self.dependent_tasks.clear(); + } } /// Reduces memory needs to the minimum. pub fn shrink_to_fit(&mut self) { - match self { - Cell::Empty => {} - Cell::TrackedValueless { - dependent_tasks, .. - } - | Cell::Recomputing { - dependent_tasks, .. - } - | Cell::Value { - dependent_tasks, .. - } => { - dependent_tasks.shrink_to_fit(); - } - } + self.dependent_tasks.shrink_to_fit(); } /// Takes the content out of the cell. Make sure to drop the content outside /// of the task state lock. #[must_use] pub fn gc_content(&mut self) -> Option { - match self { - Cell::Empty | Cell::Recomputing { .. } | Cell::TrackedValueless { .. } => None, - Cell::Value { - dependent_tasks, .. - } => { - let dependent_tasks = take(dependent_tasks); - let Cell::Value { content, .. } = - replace(self, Cell::TrackedValueless { dependent_tasks }) + match self.state { + CellState::Empty | CellState::Computing { .. } | CellState::TrackedValueless => None, + CellState::Value { .. } => { + let CellState::Value { content, .. } = + replace(&mut self.state, CellState::TrackedValueless) else { unreachable!() }; @@ -276,28 +225,11 @@ impl Cell { /// Drops the cell after GC. Will notify all dependent tasks and events. pub fn gc_drop(self, turbo_tasks: &dyn TurboTasksBackendApi) { - match self { - Cell::Empty => {} - Cell::Recomputing { - event, - dependent_tasks, - .. - } => { - event.notify(usize::MAX); - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(&dependent_tasks); - } - } - Cell::TrackedValueless { - dependent_tasks, .. - } - | Cell::Value { - dependent_tasks, .. - } => { - if !dependent_tasks.is_empty() { - turbo_tasks.schedule_notify_tasks_set(&dependent_tasks); - } - } + if !self.dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(&self.dependent_tasks); + } + if let CellState::Computing { event } = self.state { + event.notify(usize::MAX); } } } diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 10073a89ef5af..05e0f5d6488f7 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -12,7 +12,7 @@ use std::{ time::Duration, }; -use anyhow::{bail, Result}; +use anyhow::{anyhow, bail, Result}; use dashmap::{mapref::entry::Entry, DashMap}; use rustc_hash::FxHasher; use tokio::task::futures::TaskLocalFuture; @@ -29,11 +29,10 @@ use turbo_tasks::{ }; use crate::{ - cell::RecomputingCell, edges_set::{TaskEdge, TaskEdgesSet}, gc::{GcQueue, PERCENTAGE_IDLE_TARGET_MEMORY, PERCENTAGE_TARGET_MEMORY}, output::Output, - task::{Task, DEPENDENCIES_TO_TRACK}, + task::{ReadCellError, Task, DEPENDENCIES_TO_TRACK}, task_statistics::TaskStatisticsApi, }; @@ -410,20 +409,17 @@ impl Backend for MemoryBackend { } else { Task::add_dependency_to_current(TaskEdge::Cell(task_id, index)); self.with_task(task_id, |task| { - match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, _| { - cell.read_content( - reader, - move || format!("{task_id} {index}"), - move || format!("reading {} {} from {}", task_id, index, reader), - ) - }) { + match task.read_cell( + index, + self.gc_queue.as_ref(), + move || format!("reading {} {} from {}", task_id, index, reader), + Some(reader), + self, + turbo_tasks, + ) { Ok(content) => Ok(Ok(content)), - Err(RecomputingCell { listener, schedule }) => { - if schedule { - task.recompute(self, turbo_tasks); - } - Ok(Err(listener)) - } + Err(ReadCellError::Recomputing(listener)) => Ok(Err(listener)), + Err(ReadCellError::CellRemoved) => Err(anyhow!("Cell doesn't exist")), } }) } @@ -447,19 +443,17 @@ impl Backend for MemoryBackend { turbo_tasks: &dyn TurboTasksBackendApi, ) -> Result> { self.with_task(task_id, |task| { - match task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, _| { - cell.read_content_untracked( - move || format!("{task_id}"), - move || format!("reading {} {} untracked", task_id, index), - ) - }) { + match task.read_cell( + index, + self.gc_queue.as_ref(), + move || format!("reading {} {} untracked", task_id, index), + None, + self, + turbo_tasks, + ) { Ok(content) => Ok(Ok(content)), - Err(RecomputingCell { listener, schedule }) => { - if schedule { - task.recompute(self, turbo_tasks); - } - Ok(Err(listener)) - } + Err(ReadCellError::Recomputing(listener)) => Ok(Err(listener)), + Err(ReadCellError::CellRemoved) => Err(anyhow!("Cell doesn't exist")), } }) } @@ -508,7 +502,7 @@ impl Backend for MemoryBackend { turbo_tasks: &dyn TurboTasksBackendApi, ) { self.with_task(task, |task| { - task.with_cell_mut(index, self.gc_queue.as_ref(), |cell, clean| { + task.access_cell_for_write(index, |cell, clean| { cell.assign(content, clean, turbo_tasks) }) }) diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index f9ee262ba58f3..2e582dcecf1d3 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -21,7 +21,7 @@ use tokio::task_local; use tracing::Span; use turbo_prehash::PreHashed; use turbo_tasks::{ - backend::{PersistentTaskType, TaskCollectiblesMap, TaskExecutionSpec}, + backend::{CellContent, PersistentTaskType, TaskCollectiblesMap, TaskExecutionSpec}, event::{Event, EventListener}, get_invalidator, registry, CellId, Invalidator, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, ValueTypeId, @@ -32,7 +32,7 @@ use crate::{ aggregation_data, handle_new_edge, prepare_aggregation_data, query_root_info, AggregationDataGuard, PreparedOperation, }, - cell::Cell, + cell::{Cell, ReadContentError}, edges_set::{TaskEdge, TaskEdgesList, TaskEdgesSet}, gc::{GcQueue, GcTaskState}, output::{Output, OutputContent}, @@ -76,6 +76,7 @@ enum TaskType { }, } +#[derive(Clone)] enum TaskTypeForDescription { Root, Once, @@ -182,11 +183,17 @@ impl TaskState { } } - fn new_scheduled(description: impl Fn() -> String + Send + Sync + 'static) -> Self { + fn new_scheduled(description: impl Fn() -> String + Send + Sync + Clone + 'static) -> Self { + let description2 = description.clone(); Self { aggregation_node: TaskAggregationNode::new(), state_type: Scheduled { - event: Event::new(move || format!("TaskState({})::event", description())), + start_event: Event::new(move || { + format!("TaskState({})::start_event", description()) + }), + done_event: Event::new(move || { + format!("TaskState({})::done_event", description2()) + }), outdated_edges: Default::default(), clean: true, }, @@ -311,7 +318,7 @@ impl MaybeCollectibles { struct InProgressState { /// Event is fired when the task is Done. - event: Event, + done_event: Event, /// true, when the task was marked as finished. count_as_finished: bool, /// true, when the task wasn't changed since the last execution @@ -356,7 +363,10 @@ enum TaskStateType { /// /// on start this will move to InProgress or Dirty depending on active flag Scheduled { - event: Event, + /// Event is fired when the task is IsProgress. + start_event: Event, + /// Event is fired when the task is Done. + done_event: Event, outdated_edges: Box, /// true, when the task wasn't changed since the last execution clean: bool, @@ -443,6 +453,11 @@ pub enum GcResult { Unloaded, } +pub enum ReadCellError { + CellRemoved, + Recomputing(EventListener), +} + impl Task { pub(crate) fn new_persistent( id: TaskId, @@ -617,12 +632,12 @@ impl Task { fn get_event_description_static( id: TaskId, ty: &TaskType, - ) -> impl Fn() -> String + Send + Sync { + ) -> impl Fn() -> String + Send + Sync + Clone { let ty = TaskTypeForDescription::from(ty); move || Self::format_description(&ty, id) } - fn get_event_description(&self) -> impl Fn() -> String + Send + Sync { + fn get_event_description(&self) -> impl Fn() -> String + Send + Sync + Clone { Self::get_event_description_static(self.id, &self.ty) } @@ -635,14 +650,14 @@ impl Task { match dep { TaskEdge::Output(task) => { backend.with_task(task, |task| { - task.with_output_mut_if_available(|output| { + task.access_output_for_removing_dependents(|output| { output.dependent_tasks.remove(&reader); }); }); } TaskEdge::Cell(task, index) => { backend.with_task(task, |task| { - task.with_cell_mut_if_available(index, |cell| { + task.access_cell_for_removing_dependents(index, |cell| { cell.remove_dependent_task(reader); }); }); @@ -704,15 +719,17 @@ impl Task { return None; } Scheduled { - ref mut event, + ref mut done_event, + ref mut start_event, ref mut outdated_edges, clean, } => { - let event = event.take(); + start_event.notify(usize::MAX); + let done_event = done_event.take(); let outdated_edges = *take(outdated_edges); let outdated_collectibles = take(&mut state.collectibles); state.state_type = InProgress(Box::new(InProgressState { - event, + done_event, count_as_finished: false, clean, stale: false, @@ -939,8 +956,9 @@ impl Task { state .gc .execution_completed(duration, memory_usage, generation); + let InProgress(box InProgressState { - ref mut event, + ref mut done_event, count_as_finished, ref mut outdated_edges, ref mut outdated_collectibles, @@ -954,7 +972,7 @@ impl Task { Task::state_string(&state) ) }; - let event = event.take(); + let done_event = done_event.take(); let outdated_collectibles = outdated_collectibles.take_collectibles(); let mut outdated_edges = take(outdated_edges); let mut new_edges = dependencies; @@ -976,8 +994,12 @@ impl Task { .aggregation_node .apply_change(&aggregation_context, change); } + let description = self.get_event_description(); + let start_event = + Event::new(move || format!("TaskState({})::start_event", description())); state.state_type = Scheduled { - event, + start_event, + done_event, outdated_edges: Box::new(outdated_edges), clean: false, }; @@ -1033,7 +1055,7 @@ impl Task { outdated_children, ); } - event.notify(usize::MAX); + done_event.notify(usize::MAX); drop(state); self.clear_dependencies(outdated_edges, backend, turbo_tasks); } @@ -1079,7 +1101,6 @@ impl Task { Done { ref mut edges, .. } => { let outdated_edges = take(edges).into_set(); // add to dirty lists and potentially schedule - let description = self.get_event_description(); if should_schedule { let change_job = state.aggregation_node.apply_change( &aggregation_context, @@ -1090,9 +1111,14 @@ impl Task { ..Default::default() }, ); + let description = self.get_event_description(); + let description2 = description.clone(); state.state_type = Scheduled { - event: Event::new(move || { - format!("TaskState({})::event", description()) + done_event: Event::new(move || { + format!("TaskState({})::done_event", description()) + }), + start_event: Event::new(move || { + format!("TaskState({})::start_event", description2()) }), outdated_edges: Box::new(outdated_edges), clean: false, @@ -1183,8 +1209,14 @@ impl Task { ref mut outdated_edges, } => { let description = self.get_event_description(); + let description2 = description.clone(); state.state_type = Scheduled { - event: Event::new(move || format!("TaskState({})::event", description())), + start_event: Event::new(move || { + format!("TaskState({})::start_event", description()) + }), + done_event: Event::new(move || { + format!("TaskState({})::done_event", description2()) + }), outdated_edges: take(outdated_edges), clean: false, }; @@ -1202,7 +1234,6 @@ impl Task { Done { ref mut edges, .. } => { let outdated_edges = take(edges).into_set(); // add to dirty lists and potentially schedule - let description = self.get_event_description(); let change_job = state.aggregation_node.apply_change( &aggregation_context, TaskChange { @@ -1212,8 +1243,15 @@ impl Task { ..Default::default() }, ); + let description = self.get_event_description(); + let description2 = description.clone(); state.state_type = Scheduled { - event: Event::new(move || format!("TaskState({})::event", description())), + start_event: Event::new(move || { + format!("TaskState({})::start_event", description()) + }), + done_event: Event::new(move || { + format!("TaskState({})::done_event", description2()) + }), outdated_edges: Box::new(outdated_edges), clean: true, }; @@ -1238,8 +1276,14 @@ impl Task { { let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); let description = self.get_event_description(); + let description2 = description.clone(); state.state_type = Scheduled { - event: Event::new(move || format!("TaskState({})::event", description())), + start_event: Event::new(move || { + format!("TaskState({})::start_event", description()) + }), + done_event: Event::new(move || { + format!("TaskState({})::done_event", description2()) + }), outdated_edges: take(outdated_edges), clean: false, }; @@ -1281,7 +1325,7 @@ impl Task { } /// Access to the output cell. - pub(crate) fn with_output_mut_if_available( + pub(crate) fn access_output_for_removing_dependents( &self, func: impl FnOnce(&mut Output) -> T, ) -> Option { @@ -1292,13 +1336,17 @@ impl Task { } } - /// Access to a cell. - pub(crate) fn with_cell_mut( + /// Read a cell. + pub(crate) fn read_cell( &self, index: CellId, gc_queue: Option<&GcQueue>, - func: impl FnOnce(&mut Cell, bool) -> T, - ) -> T { + note: impl Fn() -> String + Sync + Send + 'static, + reader: Option, + backend: &MemoryBackend, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> Result { + let task_id = self.id; let mut state = self.full_state_mut(); if let Some(gc_queue) = gc_queue { let generation = gc_queue.generation(); @@ -1306,6 +1354,78 @@ impl Task { let _ = gc_queue.task_accessed(self.id); } } + match state.state_type { + Done { .. } | InProgress(..) => { + let is_done = matches!(state.state_type, Done { .. }); + let list = state.cells.entry(index.type_id).or_default(); + let i = index.index as usize; + if list.len() <= i { + list.resize_with(i + 1, Default::default); + } + let cell = &mut list[i]; + let description = move || format!("{task_id} {index}"); + let read_result = if let Some(reader) = reader { + cell.read_content(reader, is_done, description, note) + } else { + cell.read_content_untracked(is_done, description, note) + }; + drop(state); + match read_result { + Ok(content) => Ok(content), + Err(ReadContentError::Computing { listener, schedule }) => { + if schedule { + self.recompute(backend, turbo_tasks); + } + Err(ReadCellError::Recomputing(listener)) + } + Err(ReadContentError::Unused) => Err(ReadCellError::CellRemoved), + } + } + Dirty { + ref mut outdated_edges, + } => { + let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); + let description = self.get_event_description(); + let description2 = description.clone(); + let start_event = + Event::new(move || format!("TaskState({})::start_event", description())); + let listener = start_event.listen_with_note(note); + state.state_type = Scheduled { + start_event, + done_event: Event::new(move || { + format!("TaskState({})::done_event", description2()) + }), + outdated_edges: take(outdated_edges), + clean: false, + }; + let change_job = state.aggregation_node.apply_change( + &aggregation_context, + TaskChange { + dirty_tasks_update: vec![(self.id, -1)], + ..Default::default() + }, + ); + drop(state); + turbo_tasks.schedule(self.id); + change_job.apply(&aggregation_context); + aggregation_context.apply_queued_updates(); + Err(ReadCellError::Recomputing(listener)) + } + Scheduled { + ref start_event, .. + } => Err(ReadCellError::Recomputing( + start_event.listen_with_note(note), + )), + } + } + + /// Access to a cell. + pub(crate) fn access_cell_for_write( + &self, + index: CellId, + func: impl FnOnce(&mut Cell, bool) -> T, + ) -> T { + let mut state = self.full_state_mut(); let clean = match state.state_type { InProgress(box InProgressState { clean, .. }) => clean, _ => false, @@ -1319,7 +1439,7 @@ impl Task { } /// Access to a cell. - pub(crate) fn with_cell_mut_if_available( + pub(crate) fn access_cell_for_removing_dependents( &self, index: CellId, func: impl FnOnce(&mut Cell) -> T, @@ -1506,10 +1626,15 @@ impl Task { } => { turbo_tasks.schedule(self.id); let description = self.get_event_description(); - let event = Event::new(move || format!("TaskState({})::event", description())); - let listener = event.listen_with_note(note); + let description2 = description.clone(); + let done_event = + Event::new(move || format!("TaskState({})::done_event", description())); + let listener = done_event.listen_with_note(note); state.state_type = Scheduled { - event, + start_event: Event::new(move || { + format!("TaskState({})::start_event", description2()) + }), + done_event, outdated_edges: take(outdated_edges), clean: false, }; @@ -1524,7 +1649,14 @@ impl Task { change_job.apply(&aggregation_context); Ok(Err(listener)) } - Scheduled { ref event, .. } | InProgress(box InProgressState { ref event, .. }) => { + Scheduled { + done_event: ref event, + .. + } + | InProgress(box InProgressState { + done_event: ref event, + .. + }) => { let listener = event.listen_with_note(note); drop(state); Ok(Err(listener)) diff --git a/crates/turbo-tasks-memory/tests/emptied_cells.rs b/crates/turbo-tasks-memory/tests/emptied_cells.rs new file mode 100644 index 0000000000000..7066be6d57520 --- /dev/null +++ b/crates/turbo-tasks-memory/tests/emptied_cells.rs @@ -0,0 +1,65 @@ +#![feature(arbitrary_self_types)] + +use anyhow::Result; +use turbo_tasks::{State, Vc}; +use turbo_tasks_testing::{register, run}; + +register!(); + +#[tokio::test] +async fn recompute() { + run! { + let input = ChangingInput { + state: State::new(1), + }.cell(); + let output = compute(input); + assert_eq!(*output.await?, 1); + + println!("changing input"); + input.await?.state.set(10); + assert_eq!(*output.strongly_consistent().await?, 10); + + println!("changing input"); + input.await?.state.set(5); + assert_eq!(*output.strongly_consistent().await?, 5); + + println!("changing input"); + input.await?.state.set(20); + assert_eq!(*output.strongly_consistent().await?, 20); + + println!("changing input"); + input.await?.state.set(15); + assert_eq!(*output.strongly_consistent().await?, 15); + + println!("changing input"); + input.await?.state.set(1); + assert_eq!(*output.strongly_consistent().await?, 1); + } +} + +#[turbo_tasks::value] +struct ChangingInput { + state: State, +} + +#[turbo_tasks::function] +async fn compute(input: Vc) -> Result> { + let value = *inner_compute(input).await?; + Ok(Vc::cell(value)) +} + +#[turbo_tasks::function] +async fn inner_compute(input: Vc) -> Result> { + let state_value = *input.await?.state.get(); + let mut last = None; + for i in 0..=state_value { + last = Some(compute2(Vc::cell(i))); + } + Ok(last.unwrap()) +} + +#[turbo_tasks::function] +async fn compute2(input: Vc) -> Result> { + let value = *input.await?; + Ok(Vc::cell(value)) +} From cdfee4e4fdbac3b3d46da25e8c7187d548dc7cb2 Mon Sep 17 00:00:00 2001 From: Gautier Darchen Date: Wed, 24 Jul 2024 20:52:21 +0200 Subject: [PATCH 54/73] docs(link): wrong mention of the `logout` command in the `link` flags (#8830) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description In Turborepo's [reference page](https://turbo.build/repo/docs/reference/link) for the `link` command, the `logout` command flags are listed. I just moved those flags to the right page. ![image](https://github.com/user-attachments/assets/419ad97e-0464-4c4d-9964-70950317991d) ### Testing Instructions * Check the updated docs --- docs/repo-docs/reference/link.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/repo-docs/reference/link.mdx b/docs/repo-docs/reference/link.mdx index 7b72bd28c2869..c9a2712182f15 100644 --- a/docs/repo-docs/reference/link.mdx +++ b/docs/repo-docs/reference/link.mdx @@ -11,8 +11,8 @@ The selected owner (either a user or an organization) will be able to share [cac ### `--api ` -Specifies the URL to logout of your Remote Cache provider. +Specifies the URL of your Remote Cache provider. ```bash title="Terminal" -turbo logout --api https://acme.com -``` +turbo link --api https://acme.com +``` \ No newline at end of file From f00d9dc6c66e56ec2328c0d97a114587a0131727 Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Wed, 24 Jul 2024 20:11:25 +0100 Subject: [PATCH 55/73] add tags to turbo tasks (#8038) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description ### Testing Instructions Closes TURBO-2878 --- crates/turbo-tasks-fetch/src/lib.rs | 2 +- crates/turbo-tasks-fs/src/attach.rs | 12 ++++++------ crates/turbo-tasks-fs/src/lib.rs | 14 +++++++------- crates/turbo-tasks-fs/src/read_glob.rs | 4 ++-- .../turbo-tasks-macros/src/function_macro.rs | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/crates/turbo-tasks-fetch/src/lib.rs b/crates/turbo-tasks-fetch/src/lib.rs index 7cb59d1039b37..c4f3e12e0f164 100644 --- a/crates/turbo-tasks-fetch/src/lib.rs +++ b/crates/turbo-tasks-fetch/src/lib.rs @@ -46,7 +46,7 @@ pub enum ProxyConfig { #[turbo_tasks::value(transparent)] pub struct OptionProxyConfig(Option); -#[turbo_tasks::function] +#[turbo_tasks::function(network)] pub async fn fetch( url: Vc, user_agent: Vc>, diff --git a/crates/turbo-tasks-fs/src/attach.rs b/crates/turbo-tasks-fs/src/attach.rs index f9b70352f660d..7705aad035361 100644 --- a/crates/turbo-tasks-fs/src/attach.rs +++ b/crates/turbo-tasks-fs/src/attach.rs @@ -121,17 +121,17 @@ impl AttachedFileSystem { #[turbo_tasks::value_impl] impl FileSystem for AttachedFileSystem { - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] fn read(self: Vc, path: Vc) -> Vc { self.get_inner_fs_path(path).read() } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] fn read_link(self: Vc, path: Vc) -> Vc { self.get_inner_fs_path(path).read_link() } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn read_dir(self: Vc, path: Vc) -> Result> { let dir_content = self.get_inner_fs_path(path).read_dir().await?; let entries = match &*dir_content { @@ -157,17 +157,17 @@ impl FileSystem for AttachedFileSystem { Ok(DirectoryContent::new(converted_entries)) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] fn track(self: Vc, path: Vc) -> Vc { self.get_inner_fs_path(path).track() } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] fn write(self: Vc, path: Vc, content: Vc) -> Vc { self.get_inner_fs_path(path).write(content) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] fn write_link( self: Vc, path: Vc, diff --git a/crates/turbo-tasks-fs/src/lib.rs b/crates/turbo-tasks-fs/src/lib.rs index 75409f6ee39d5..ce8bac1752816 100644 --- a/crates/turbo-tasks-fs/src/lib.rs +++ b/crates/turbo-tasks-fs/src/lib.rs @@ -317,7 +317,7 @@ impl Debug for DiskFileSystem { #[turbo_tasks::value_impl] impl FileSystem for DiskFileSystem { - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn read(&self, fs_path: Vc) -> Result> { let full_path = self.to_sys_path(fs_path).await?; self.register_invalidator(&full_path)?; @@ -341,7 +341,7 @@ impl FileSystem for DiskFileSystem { Ok(content.cell()) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn read_dir(&self, fs_path: Vc) -> Result> { let full_path = self.to_sys_path(fs_path).await?; self.register_dir_invalidator(&full_path)?; @@ -400,7 +400,7 @@ impl FileSystem for DiskFileSystem { Ok(DirectoryContent::new(entries)) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn read_link(&self, fs_path: Vc) -> Result> { let full_path = self.to_sys_path(fs_path).await?; self.register_invalidator(&full_path)?; @@ -484,14 +484,14 @@ impl FileSystem for DiskFileSystem { .cell()) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn track(&self, fs_path: Vc) -> Result> { let full_path = self.to_sys_path(fs_path).await?; self.register_invalidator(&full_path)?; Ok(Completion::new()) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn write( &self, fs_path: Vc, @@ -605,7 +605,7 @@ impl FileSystem for DiskFileSystem { Ok(Completion::new()) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn write_link( &self, fs_path: Vc, @@ -692,7 +692,7 @@ impl FileSystem for DiskFileSystem { Ok(Completion::new()) } - #[turbo_tasks::function] + #[turbo_tasks::function(fs)] async fn metadata(&self, fs_path: Vc) -> Result> { let full_path = self.to_sys_path(fs_path).await?; self.register_invalidator(&full_path)?; diff --git a/crates/turbo-tasks-fs/src/read_glob.rs b/crates/turbo-tasks-fs/src/read_glob.rs index f026d23bca269..829ae206bf6b5 100644 --- a/crates/turbo-tasks-fs/src/read_glob.rs +++ b/crates/turbo-tasks-fs/src/read_glob.rs @@ -16,7 +16,7 @@ pub struct ReadGlobResult { /// /// DETERMINISM: Result is in random order. Either sort result or do not depend /// on the order. -#[turbo_tasks::function] +#[turbo_tasks::function(fs)] pub async fn read_glob( directory: Vc, glob: Vc, @@ -25,7 +25,7 @@ pub async fn read_glob( read_glob_internal("", directory, glob, include_dot_files).await } -#[turbo_tasks::function] +#[turbo_tasks::function(fs)] async fn read_glob_inner( prefix: RcStr, directory: Vc, diff --git a/crates/turbo-tasks-macros/src/function_macro.rs b/crates/turbo-tasks-macros/src/function_macro.rs index 4c047d0e067a5..519abdb8f4ebe 100644 --- a/crates/turbo-tasks-macros/src/function_macro.rs +++ b/crates/turbo-tasks-macros/src/function_macro.rs @@ -6,6 +6,25 @@ use turbo_tasks_macros_shared::{get_native_function_id_ident, get_native_functio use crate::func::{DefinitionContext, NativeFn, TurboFn}; +/// This macro generates the virtual function that powers turbo tasks. +/// An annotated task is replaced with a stub function that returns a +/// lazy completion (Vc), and stamps out the concrete implementation +/// of the task alongside that the Vc uses to resolve itself. +/// +/// Functions support being tagged for informational purposes. This +/// is currently only used in turbo-static for doing static analysis +/// of tasks. +/// +/// # Examples +/// +/// ```rust +/// use turbo_tasks::{Vc}; +/// +/// #[turbo_tasks::function(fs)] +/// async fn my_task() -> Vc { +/// // access filesystem +/// } +/// ``` pub fn function(_args: TokenStream, input: TokenStream) -> TokenStream { let item = parse_macro_input!(input as ItemFn); From 1e3ddb978599173720db0b7e4ab52ec3cf82508a Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 24 Jul 2024 21:16:44 +0200 Subject: [PATCH 56/73] box Scheduled task state to save memory (#8807) ### Description This makes the enum smaller for the Done state, which is the common one ### Testing Instructions --- crates/turbo-tasks-memory/src/task.rs | 84 +++++++++++++-------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 2e582dcecf1d3..43509482abc07 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -187,7 +187,7 @@ impl TaskState { let description2 = description.clone(); Self { aggregation_node: TaskAggregationNode::new(), - state_type: Scheduled { + state_type: Scheduled(Box::new(ScheduledState { start_event: Event::new(move || { format!("TaskState({})::start_event", description()) }), @@ -196,7 +196,7 @@ impl TaskState { }), outdated_edges: Default::default(), clean: true, - }, + })), collectibles: Default::default(), output: Default::default(), cells: Default::default(), @@ -326,8 +326,8 @@ struct InProgressState { /// true, when the task was invalidated while executing. It will be /// scheduled again. stale: bool, - /// Dependencies and children that need to be disconnected once leaving - /// this state. + /// Dependencies and children that need to be disconnected once entering + /// Done. outdated_edges: TaskEdgesSet, /// Children that are connected during execution. These children are already /// removed from `outdated_edges`. @@ -336,6 +336,18 @@ struct InProgressState { outdated_collectibles: MaybeCollectibles, } +struct ScheduledState { + /// Event is fired when the task is IsProgress. + start_event: Event, + /// Event is fired when the task is Done. + done_event: Event, + /// Dependencies and children that need to be disconnected once entering + /// Done. + outdated_edges: Box, + /// true, when the task wasn't changed since the last execution + clean: bool, +} + enum TaskStateType { /// Ready /// @@ -362,15 +374,7 @@ enum TaskStateType { /// Execution is invalid and scheduled /// /// on start this will move to InProgress or Dirty depending on active flag - Scheduled { - /// Event is fired when the task is IsProgress. - start_event: Event, - /// Event is fired when the task is Done. - done_event: Event, - outdated_edges: Box, - /// true, when the task wasn't changed since the last execution - clean: bool, - }, + Scheduled(Box), /// Execution is happening /// @@ -396,7 +400,7 @@ impl TaskStateType { TaskStateType::Dirty { outdated_edges, .. } => { Either::Right(Either::Right(outdated_edges.children())) } - TaskStateType::Scheduled { outdated_edges, .. } => { + TaskStateType::Scheduled(box ScheduledState { outdated_edges, .. }) => { Either::Right(Either::Right(outdated_edges.children())) } } @@ -420,7 +424,7 @@ impl TaskStateType { (edges, children) } TaskStateType::Dirty { outdated_edges, .. } - | TaskStateType::Scheduled { outdated_edges, .. } => { + | TaskStateType::Scheduled(box ScheduledState { outdated_edges, .. }) => { let mut edges = *outdated_edges; let children = edges.drain_children(); (edges, children) @@ -718,12 +722,12 @@ impl Task { // should not start in this state return None; } - Scheduled { + Scheduled(box ScheduledState { ref mut done_event, ref mut start_event, ref mut outdated_edges, clean, - } => { + }) => { start_event.notify(usize::MAX); let done_event = done_event.take(); let outdated_edges = *take(outdated_edges); @@ -997,12 +1001,12 @@ impl Task { let description = self.get_event_description(); let start_event = Event::new(move || format!("TaskState({})::start_event", description())); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event, done_event, outdated_edges: Box::new(outdated_edges), clean: false, - }; + })); drop(state); schedule_task = true; } else { @@ -1088,7 +1092,7 @@ impl Task { if let TaskMetaStateWriteGuard::Full(mut state) = self.state_mut() { match state.state_type { - Scheduled { ref mut clean, .. } => { + Scheduled(box ScheduledState { ref mut clean, .. }) => { *clean = false; // already scheduled @@ -1113,7 +1117,7 @@ impl Task { ); let description = self.get_event_description(); let description2 = description.clone(); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { done_event: Event::new(move || { format!("TaskState({})::done_event", description()) }), @@ -1122,7 +1126,7 @@ impl Task { }), outdated_edges: Box::new(outdated_edges), clean: false, - }; + })); drop(state); change_job.apply(&aggregation_context); @@ -1210,7 +1214,7 @@ impl Task { } => { let description = self.get_event_description(); let description2 = description.clone(); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event: Event::new(move || { format!("TaskState({})::start_event", description()) }), @@ -1219,7 +1223,7 @@ impl Task { }), outdated_edges: take(outdated_edges), clean: false, - }; + })); let change_job = state.aggregation_node.apply_change( &aggregation_context, TaskChange { @@ -1245,7 +1249,7 @@ impl Task { ); let description = self.get_event_description(); let description2 = description.clone(); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event: Event::new(move || { format!("TaskState({})::start_event", description()) }), @@ -1254,7 +1258,7 @@ impl Task { }), outdated_edges: Box::new(outdated_edges), clean: true, - }; + })); drop(state); change_job.apply(&aggregation_context); @@ -1277,7 +1281,7 @@ impl Task { let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend); let description = self.get_event_description(); let description2 = description.clone(); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event: Event::new(move || { format!("TaskState({})::start_event", description()) }), @@ -1286,7 +1290,7 @@ impl Task { }), outdated_edges: take(outdated_edges), clean: false, - }; + })); let job = state.aggregation_node.apply_change( &aggregation_context, TaskChange { @@ -1390,14 +1394,14 @@ impl Task { let start_event = Event::new(move || format!("TaskState({})::start_event", description())); let listener = start_event.listen_with_note(note); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event, done_event: Event::new(move || { format!("TaskState({})::done_event", description2()) }), outdated_edges: take(outdated_edges), clean: false, - }; + })); let change_job = state.aggregation_node.apply_change( &aggregation_context, TaskChange { @@ -1411,9 +1415,9 @@ impl Task { aggregation_context.apply_queued_updates(); Err(ReadCellError::Recomputing(listener)) } - Scheduled { + Scheduled(box ScheduledState { ref start_event, .. - } => Err(ReadCellError::Recomputing( + }) => Err(ReadCellError::Recomputing( start_event.listen_with_note(note), )), } @@ -1630,14 +1634,14 @@ impl Task { let done_event = Event::new(move || format!("TaskState({})::done_event", description())); let listener = done_event.listen_with_note(note); - state.state_type = Scheduled { + state.state_type = Scheduled(Box::new(ScheduledState { start_event: Event::new(move || { format!("TaskState({})::start_event", description2()) }), done_event, outdated_edges: take(outdated_edges), clean: false, - }; + })); let change_job = state.aggregation_node.apply_change( &aggregation_context, TaskChange { @@ -1649,15 +1653,9 @@ impl Task { change_job.apply(&aggregation_context); Ok(Err(listener)) } - Scheduled { - done_event: ref event, - .. - } - | InProgress(box InProgressState { - done_event: ref event, - .. - }) => { - let listener = event.listen_with_note(note); + Scheduled(box ScheduledState { ref done_event, .. }) + | InProgress(box InProgressState { ref done_event, .. }) => { + let listener = done_event.listen_with_note(note); drop(state); Ok(Err(listener)) } From 4fad8e99fef2a81ccb382d4ccdeca7bb7c96a0f3 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 24 Jul 2024 21:40:34 +0200 Subject: [PATCH 57/73] Drop excessive cells after task reexecution (#8170) ### Description When cells become unused after recomputation of a task, drop them. ### Testing Instructions --- crates/turbo-tasks-memory/src/cell.rs | 33 +++++++++++++++++++ .../turbo-tasks-memory/src/memory_backend.rs | 5 ++- crates/turbo-tasks-memory/src/task.rs | 31 +++++++++++++++-- crates/turbo-tasks/src/backend.rs | 1 + crates/turbo-tasks/src/manager.rs | 3 ++ 5 files changed, 70 insertions(+), 3 deletions(-) diff --git a/crates/turbo-tasks-memory/src/cell.rs b/crates/turbo-tasks-memory/src/cell.rs index b25d054dbe152..7373991086f98 100644 --- a/crates/turbo-tasks-memory/src/cell.rs +++ b/crates/turbo-tasks-memory/src/cell.rs @@ -201,11 +201,44 @@ impl Cell { } } + pub fn empty( + &mut self, + clean: bool, + turbo_tasks: &dyn TurboTasksBackendApi, + ) -> Option { + let content = match replace(&mut self.state, CellState::Empty) { + CellState::TrackedValueless | CellState::Empty => None, + CellState::Computing { event } => { + event.notify(usize::MAX); + if clean { + // We can assume that the task is deterministic and produces the same content + // again. No need to notify dependent tasks. + return None; + } + None + } + CellState::Value { content } => Some(content), + }; + // Assigning to a cell will invalidate all dependent tasks as the content might + // have changed. + if !self.dependent_tasks.is_empty() { + turbo_tasks.schedule_notify_tasks_set(&self.dependent_tasks); + self.dependent_tasks.clear(); + } + content + } + /// Reduces memory needs to the minimum. pub fn shrink_to_fit(&mut self) { self.dependent_tasks.shrink_to_fit(); } + /// Returns true if the cell is current not used and could be dropped from + /// the array. + pub fn is_unused(&self) -> bool { + self.dependent_tasks.is_empty() && matches!(self.state, CellState::Empty) + } + /// Takes the content out of the cell. Make sure to drop the content outside /// of the task state lock. #[must_use] diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 05e0f5d6488f7..d4ef3ec10a02e 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -13,6 +13,7 @@ use std::{ }; use anyhow::{anyhow, bail, Result}; +use auto_hash_map::AutoMap; use dashmap::{mapref::entry::Entry, DashMap}; use rustc_hash::FxHasher; use tokio::task::futures::TaskLocalFuture; @@ -25,7 +26,7 @@ use turbo_tasks::{ }, event::EventListener, util::{IdFactoryWithReuse, NoMoveVec}, - CellId, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, Unused, + CellId, RawVc, TaskId, TaskIdSet, TraitTypeId, TurboTasksBackendApi, Unused, ValueTypeId, }; use crate::{ @@ -324,6 +325,7 @@ impl Backend for MemoryBackend { task_id: TaskId, duration: Duration, memory_usage: usize, + cell_counters: AutoMap, 8>, stateful: bool, turbo_tasks: &dyn TurboTasksBackendApi, ) -> bool { @@ -339,6 +341,7 @@ impl Backend for MemoryBackend { duration, memory_usage, generation, + cell_counters, stateful, self, turbo_tasks, diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 43509482abc07..1ce0059807706 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -944,6 +944,7 @@ impl Task { duration: Duration, memory_usage: usize, generation: NonZeroU32, + cell_counters: AutoMap, 8>, stateful: bool, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, @@ -953,6 +954,7 @@ impl Task { { let mut change_job = None; let mut remove_job = None; + let mut drained_cells = SmallVec::<[Cell; 8]>::new(); let dependencies = DEPENDENCIES_TO_TRACK.with(|deps| deps.take()); { let mut state = self.full_state_mut(); @@ -961,21 +963,43 @@ impl Task { .gc .execution_completed(duration, memory_usage, generation); + let TaskState { + ref mut cells, + ref mut state_type, + .. + } = *state; + let InProgress(box InProgressState { ref mut done_event, count_as_finished, ref mut outdated_edges, ref mut outdated_collectibles, ref mut new_children, - clean: _, + clean, stale, - }) = state.state_type + }) = *state_type else { panic!( "Task execution completed in unexpected state {}", Task::state_string(&state) ) }; + for (value_type, cells) in cells.iter_mut() { + let counter = + cell_counters.get(value_type).copied().unwrap_or_default() as usize; + let mut is_unused = true; + while counter < cells.len() { + let last = cells.last_mut().unwrap(); + last.empty(clean, turbo_tasks); + if is_unused { + if last.is_unused() { + drained_cells.push(cells.pop().unwrap()); + } else { + is_unused = false; + } + } + } + } let done_event = done_event.take(); let outdated_collectibles = outdated_collectibles.take_collectibles(); let mut outdated_edges = take(outdated_edges); @@ -1064,6 +1088,9 @@ impl Task { self.clear_dependencies(outdated_edges, backend, turbo_tasks); } } + for cell in drained_cells { + cell.gc_drop(turbo_tasks); + } change_job.apply(&aggregation_context); remove_job.apply(&aggregation_context); } diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index 6e8194ed2204a..5a683c6b90f4a 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -429,6 +429,7 @@ pub trait Backend: Sync + Send { task: TaskId, duration: Duration, memory_usage: usize, + cell_counters: AutoMap, 8>, stateful: bool, turbo_tasks: &dyn TurboTasksBackendApi, ) -> bool; diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index eef0d22893ee1..0b5b5bfbb2b11 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -518,10 +518,13 @@ impl TurboTasks { }); this.backend.task_execution_result(task_id, result, &*this); let stateful = this.finish_current_task_state(); + let cell_counters = + CELL_COUNTERS.with(|cc| take(&mut *cc.borrow_mut())); let schedule_again = this.backend.task_execution_completed( task_id, duration, memory_usage, + cell_counters, stateful, &*this, ); From f32ebe9618ff7f3b45c7d086918185412cb4668b Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Wed, 24 Jul 2024 15:57:43 -0500 Subject: [PATCH 58/73] chore(infer): add test for current behavior (#8825) ### Description Add unit test for broken behavior described in #8599 This does not fix the issue, but will start failing if our behavior changes. ### Testing Instructions Unit test passes --- crates/turborepo-repository/src/inference.rs | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/crates/turborepo-repository/src/inference.rs b/crates/turborepo-repository/src/inference.rs index cb47fe2ee2e02..f050d7e68455a 100644 --- a/crates/turborepo-repository/src/inference.rs +++ b/crates/turborepo-repository/src/inference.rs @@ -347,4 +347,28 @@ mod test { PackageManager::Npm ); } + + fn test_gh_8599() { + // TODO: this test documents existing broken behavior, when we have time we + // should fix this and update the assertions + let (_tmp, tmp_dir) = tmp_dir(); + let monorepo_root = tmp_dir.join_component("monorepo_root"); + let monorepo_pkg_json = monorepo_root.join_component("package.json"); + monorepo_pkg_json.ensure_dir().unwrap(); + monorepo_pkg_json.create_with_contents(r#"{"name": "mono", "packageManager": "npm@10.2.4", "workspaces": ["./packages/*"]}"#.as_bytes()).unwrap(); + let package_foo = monorepo_root.join_components(&["packages", "foo"]); + let foo_package_json = package_foo.join_component("package.json"); + foo_package_json.ensure_dir().unwrap(); + foo_package_json + .create_with_contents(r#"{"name": "foo"}"#.as_bytes()) + .unwrap(); + + let repo_state = RepoState::infer(&package_foo).unwrap(); + // These assertions are the buggy behavior + assert_eq!(repo_state.root, package_foo); + assert_eq!(repo_state.mode, RepoMode::SinglePackage); + // TODO: the following assertions are the correct behavior + // assert_eq!(repo_state.root, monorepo_root); + // assert_eq!(repo_state.mode, RepoMode::MultiPackage); + } } From b953c892daad45979910488109f35bdec2594a1a Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Thu, 25 Jul 2024 06:57:00 +0100 Subject: [PATCH 59/73] reduce memory and consolidate shared vs transient cells (#8263) ### Description This change reworks the structure to drop an option such that data which is colocated with its type information doesn't need to store it twice. ### Testing Instructions Existing tests should suffice. --------- Co-authored-by: Tobias Koppers --- crates/turbo-tasks-memory/src/cell.rs | 6 +- .../turbo-tasks-memory/src/memory_backend.rs | 24 +++-- crates/turbo-tasks-testing/src/lib.rs | 31 +++--- crates/turbo-tasks/src/backend.rs | 60 ++++++----- crates/turbo-tasks/src/manager.rs | 34 +++--- crates/turbo-tasks/src/persisted_graph.rs | 61 ++++++++++- crates/turbo-tasks/src/raw_vc.rs | 35 +++--- crates/turbo-tasks/src/read_ref.rs | 5 +- .../turbo-tasks/src/task/shared_reference.rs | 101 +++++++++++------- crates/turbo-tasks/src/task/task_input.rs | 3 +- crates/turbo-tasks/src/trait_ref.rs | 14 +-- crates/turbo-tasks/src/value.rs | 11 +- crates/turbo-tasks/src/vc/cast.rs | 8 +- 13 files changed, 231 insertions(+), 162 deletions(-) diff --git a/crates/turbo-tasks-memory/src/cell.rs b/crates/turbo-tasks-memory/src/cell.rs index 7373991086f98..1f82d32dc3661 100644 --- a/crates/turbo-tasks-memory/src/cell.rs +++ b/crates/turbo-tasks-memory/src/cell.rs @@ -151,7 +151,7 @@ impl Cell { CellState::Empty | CellState::Computing { .. } | CellState::TrackedValueless => { CellContent(None) } - CellState::Value { content } => content.clone(), + CellState::Value { content } => content.to_owned(), } } @@ -159,6 +159,10 @@ impl Cell { /// content has changed. /// If clean = true, the task inputs weren't changes since the last /// execution and can be assumed to produce the same content again. + /// + /// Safety: This funtion does not check if the type of the content is the + /// same as the type of the cell. It is the caller's responsibility to + /// ensure that the content is of the correct type. pub fn assign( &mut self, content: CellContent, diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index d4ef3ec10a02e..09086a41b9ec4 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -22,7 +22,7 @@ use turbo_prehash::{BuildHasherExt, PassThroughHash, PreHashed}; use turbo_tasks::{ backend::{ Backend, BackendJobId, CellContent, PersistentTaskType, TaskCollectiblesMap, - TaskExecutionSpec, TransientTaskType, + TaskExecutionSpec, TransientTaskType, TypedCellContent, }, event::EventListener, util::{IdFactoryWithReuse, NoMoveVec}, @@ -404,11 +404,13 @@ impl Backend for MemoryBackend { index: CellId, reader: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result> { + ) -> Result> { if task_id == reader { - Ok(Ok(self.with_task(task_id, |task| { - task.with_cell(index, |cell| cell.read_own_content_untracked()) - }))) + Ok(Ok(self + .with_task(task_id, |task| { + task.with_cell(index, |cell| cell.read_own_content_untracked()) + }) + .into_typed(index.type_id))) } else { Task::add_dependency_to_current(TaskEdge::Cell(task_id, index)); self.with_task(task_id, |task| { @@ -420,7 +422,7 @@ impl Backend for MemoryBackend { self, turbo_tasks, ) { - Ok(content) => Ok(Ok(content)), + Ok(content) => Ok(Ok(content.into_typed(index.type_id))), Err(ReadCellError::Recomputing(listener)) => Ok(Err(listener)), Err(ReadCellError::CellRemoved) => Err(anyhow!("Cell doesn't exist")), } @@ -433,9 +435,10 @@ impl Backend for MemoryBackend { current_task: TaskId, index: CellId, _turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result { + ) -> Result { Ok(self.with_task(current_task, |task| { task.with_cell(index, |cell| cell.read_own_content_untracked()) + .into_typed(index.type_id) })) } @@ -444,7 +447,7 @@ impl Backend for MemoryBackend { task_id: TaskId, index: CellId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result> { + ) -> Result> { self.with_task(task_id, |task| { match task.read_cell( index, @@ -454,7 +457,7 @@ impl Backend for MemoryBackend { self, turbo_tasks, ) { - Ok(content) => Ok(Ok(content)), + Ok(content) => Ok(Ok(content.into_typed(index.type_id))), Err(ReadCellError::Recomputing(listener)) => Ok(Err(listener)), Err(ReadCellError::CellRemoved) => Err(anyhow!("Cell doesn't exist")), } @@ -497,6 +500,9 @@ impl Backend for MemoryBackend { }); } + /// SAFETY: This function does not validate that the data in `content` is of + /// the same type as in `index`. It is the caller's responsibility to ensure + /// that the content is of the correct type. fn update_task_cell( &self, task: TaskId, diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index 353d0a1b3c7be..f61c04d673ab7 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -15,7 +15,7 @@ use std::{ use anyhow::{anyhow, Result}; use futures::FutureExt; use turbo_tasks::{ - backend::{CellContent, TaskCollectiblesMap}, + backend::{CellContent, TaskCollectiblesMap, TypedCellContent}, event::{Event, EventListener}, registry, test_helpers::with_turbo_tasks_for_testing, @@ -189,33 +189,35 @@ impl TurboTasksApi for VcStorage { &self, task: TaskId, index: CellId, - ) -> Result> { + ) -> Result> { let map = self.cells.lock().unwrap(); - if let Some(cell) = map.get(&(task, index)) { - Ok(Ok(cell.clone())) + Ok(Ok(if let Some(cell) = map.get(&(task, index)) { + cell.clone() } else { - Ok(Ok(CellContent::default())) + Default::default() } + .into_typed(index.type_id))) } fn try_read_task_cell_untracked( &self, task: TaskId, index: CellId, - ) -> Result> { + ) -> Result> { let map = self.cells.lock().unwrap(); - if let Some(cell) = map.get(&(task, index)) { - Ok(Ok(cell.clone())) + Ok(Ok(if let Some(cell) = map.get(&(task, index)) { + cell.to_owned() } else { - Ok(Ok(CellContent::default())) + Default::default() } + .into_typed(index.type_id))) } fn try_read_own_task_cell_untracked( &self, current_task: TaskId, index: CellId, - ) -> Result { + ) -> Result { self.read_own_task_cell(current_task, index) } @@ -244,13 +246,14 @@ impl TurboTasksApi for VcStorage { unimplemented!() } - fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result { + fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result { let map = self.cells.lock().unwrap(); - if let Some(cell) = map.get(&(task, index)) { - Ok(cell.clone()) + Ok(if let Some(cell) = map.get(&(task, index)) { + cell.to_owned() } else { - Ok(CellContent::default()) + Default::default() } + .into_typed(index.type_id)) } fn update_own_task_cell(&self, task: TaskId, index: CellId, content: CellContent) { diff --git a/crates/turbo-tasks/src/backend.rs b/crates/turbo-tasks/src/backend.rs index 5a683c6b90f4a..bb1572bc3a1de 100644 --- a/crates/turbo-tasks/src/backend.rs +++ b/crates/turbo-tasks/src/backend.rs @@ -9,10 +9,9 @@ use std::{ time::Duration, }; -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, Result}; use auto_hash_map::AutoMap; use rustc_hash::FxHasher; -use serde::{Deserialize, Serialize}; use tracing::Span; pub use crate::id::{BackendJobId, ExecutionId}; @@ -333,10 +332,10 @@ pub struct TaskExecutionSpec<'a> { pub span: Span, } -// TODO technically CellContent is already indexed by the ValueTypeId, so we -// don't need to store it here -#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)] pub struct CellContent(pub Option); +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct TypedCellContent(pub ValueTypeId, pub CellContent); impl Display for CellContent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -347,9 +346,9 @@ impl Display for CellContent { } } -impl CellContent { +impl TypedCellContent { pub fn cast(self) -> Result> { - let data = self.0.ok_or_else(|| anyhow!("Cell is empty"))?; + let data = self.1 .0.ok_or_else(|| anyhow!("Cell is empty"))?; let data = data .downcast() .map_err(|_err| anyhow!("Unexpected type in cell"))?; @@ -358,24 +357,35 @@ impl CellContent { /// # Safety /// - /// The caller must ensure that the CellContent contains a vc that - /// implements T. + /// The caller must ensure that the TypedCellContent contains a vc + /// that implements T. pub fn cast_trait(self) -> Result> where T: VcValueTrait + ?Sized, { - let shared_reference = self.0.ok_or_else(|| anyhow!("Cell is empty"))?; - if shared_reference.0.is_none() { - bail!("Cell content is untyped"); - } + let shared_reference = self + .1 + .0 + .ok_or_else(|| anyhow!("Cell is empty"))? + .typed(self.0); Ok( - // Safety: We just checked that the content is typed. + // Safety: It is a TypedSharedReference TraitRef::new(shared_reference), ) } pub fn try_cast(self) -> Option> { - Some(ReadRef::new_arc(self.0?.downcast().ok()?)) + Some(ReadRef::new_arc(self.1 .0?.downcast().ok()?)) + } + + pub fn into_untyped(self) -> CellContent { + self.1 + } +} + +impl CellContent { + pub fn into_typed(self, type_id: ValueTypeId) -> TypedCellContent { + TypedCellContent(type_id, self) } } @@ -463,7 +473,7 @@ pub trait Backend: Sync + Send { index: CellId, reader: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result>; + ) -> Result>; /// INVALIDATION: Be careful with this, it will not track dependencies, so /// using it could break cache invalidation. @@ -472,7 +482,7 @@ pub trait Backend: Sync + Send { task: TaskId, index: CellId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result>; + ) -> Result>; /// INVALIDATION: Be careful with this, it will not track dependencies, so /// using it could break cache invalidation. @@ -481,10 +491,10 @@ pub trait Backend: Sync + Send { current_task: TaskId, index: CellId, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Result { + ) -> Result { match self.try_read_task_cell_untracked(current_task, index, turbo_tasks)? { Ok(content) => Ok(content), - Err(_) => Ok(CellContent(None)), + Err(_) => Ok(TypedCellContent(index.type_id, CellContent(None))), } } @@ -575,10 +585,7 @@ impl PersistentTaskType { name: Cow<'static, str>, this: RawVc, ) -> Result { - let CellContent(Some(SharedReference(Some(value_type), _))) = this.into_read().await? - else { - bail!("Cell is empty or untyped"); - }; + let TypedCellContent(value_type, _) = this.into_read().await?; Self::resolve_trait_method_from_value(trait_type, value_type, name) } @@ -590,12 +597,7 @@ impl PersistentTaskType { turbo_tasks: Arc>, ) -> Result { let this = this.resolve().await?; - let CellContent(Some(SharedReference(this_ty, _))) = this.into_read().await? else { - bail!("Cell is empty"); - }; - let Some(this_ty) = this_ty else { - bail!("Cell is untyped"); - }; + let TypedCellContent(this_ty, _) = this.into_read().await?; let native_fn = Self::resolve_trait_method_from_value(trait_type, this_ty, name)?; let arg = registry::get_function(native_fn) diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 0b5b5bfbb2b11..5c0c2f3a5c35c 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -26,7 +26,7 @@ use turbo_tasks_malloc::TurboMalloc; use crate::{ backend::{ Backend, CellContent, PersistentTaskType, TaskCollectiblesMap, TaskExecutionSpec, - TransientTaskType, + TransientTaskType, TypedCellContent, }, capture_future::{self, CaptureFuture}, event::{Event, EventListener}, @@ -99,7 +99,7 @@ pub trait TurboTasksApi: TurboTasksCallApi + Sync + Send { &self, task: TaskId, index: CellId, - ) -> Result>; + ) -> Result>; /// INVALIDATION: Be careful with this, it will not track dependencies, so /// using it could break cache invalidation. @@ -107,7 +107,7 @@ pub trait TurboTasksApi: TurboTasksCallApi + Sync + Send { &self, task: TaskId, index: CellId, - ) -> Result>; + ) -> Result>; fn read_task_collectibles(&self, task: TaskId, trait_id: TraitTypeId) -> TaskCollectiblesMap; @@ -121,9 +121,9 @@ pub trait TurboTasksApi: TurboTasksCallApi + Sync + Send { &self, current_task: TaskId, index: CellId, - ) -> Result; + ) -> Result; - fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result; + fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result; fn update_own_task_cell(&self, task: TaskId, index: CellId, content: CellContent); fn mark_own_task_as_finished(&self, task: TaskId); @@ -981,7 +981,7 @@ impl TurboTasksApi for TurboTasks { &self, task: TaskId, index: CellId, - ) -> Result> { + ) -> Result> { self.backend .try_read_task_cell(task, index, current_task("reading Vcs"), self) } @@ -990,7 +990,7 @@ impl TurboTasksApi for TurboTasks { &self, task: TaskId, index: CellId, - ) -> Result> { + ) -> Result> { self.backend.try_read_task_cell_untracked(task, index, self) } @@ -998,7 +998,7 @@ impl TurboTasksApi for TurboTasks { &self, current_task: TaskId, index: CellId, - ) -> Result { + ) -> Result { self.backend .try_read_own_task_cell_untracked(current_task, index, self) } @@ -1045,7 +1045,7 @@ impl TurboTasksApi for TurboTasks { } } - fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result { + fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result { // INVALIDATION: don't need to track a dependency to itself self.try_read_own_task_cell_untracked(task, index) } @@ -1507,7 +1507,7 @@ pub(crate) async fn read_task_cell( this: &dyn TurboTasksApi, id: TaskId, index: CellId, -) -> Result { +) -> Result { loop { match this.try_read_task_cell(id, index)? { Ok(result) => return Ok(result), @@ -1543,10 +1543,7 @@ impl CurrentCellRef { tt.update_own_task_cell( self.current_task, self.index, - CellContent(Some(SharedReference::new( - Some(self.index.type_id), - triomphe::Arc::new(update), - ))), + CellContent(Some(SharedReference::new(triomphe::Arc::new(update)))), ) } } @@ -1567,18 +1564,15 @@ impl CurrentCellRef { tt.update_own_task_cell( self.current_task, self.index, - CellContent(Some(SharedReference::new( - Some(self.index.type_id), - triomphe::Arc::new(new_content), - ))), + CellContent(Some(SharedReference::new(triomphe::Arc::new(new_content)))), ) } pub fn update_shared_reference(&self, shared_ref: SharedReference) { let tt = turbo_tasks(); let content = tt.read_own_task_cell(self.current_task, self.index).ok(); - let update = if let Some(CellContent(Some(content))) = content { - content != shared_ref + let update = if let Some(TypedCellContent(_, CellContent(shared_ref_exp))) = content { + shared_ref_exp.as_ref().ne(&Some(&shared_ref)) } else { true }; diff --git a/crates/turbo-tasks/src/persisted_graph.rs b/crates/turbo-tasks/src/persisted_graph.rs index dffb1086c79e3..e317dc903714b 100644 --- a/crates/turbo-tasks/src/persisted_graph.rs +++ b/crates/turbo-tasks/src/persisted_graph.rs @@ -1,12 +1,13 @@ use anyhow::Result; -use serde::{Deserialize, Serialize}; +use serde::{ser::SerializeSeq, Deserialize, Serialize}; use crate::{ backend::{CellContent, PersistentTaskType}, + task::shared_reference::TypedSharedReference, CellId, RawVc, TaskId, }; -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub enum TaskCell { Content(CellContent), NeedComputation, @@ -22,9 +23,63 @@ impl Default for TaskCell { pub struct TaskData { pub children: Vec, pub dependencies: Vec, - pub cells: Vec<(CellId, TaskCell)>, + pub cells: TaskCells, pub output: RawVc, } + +/// A newtype struct that intercepts serde. This is required +/// because for safety reasons, TaskCell<()> is not allowed to +/// be deserialized. We augment it with type data then write +/// it. This is inefficient on disk but could be alleviated later. +#[derive(Debug)] +pub struct TaskCells(pub Vec<(CellId, TaskCell)>); + +// the on-disk representation of a task cell. it is local to this impl +// to prevent users accidentally ser/de the untyped data +#[derive(Serialize, Deserialize)] +struct SerializableTaskCell(Option>); +impl From for TaskCell { + fn from(val: SerializableTaskCell) -> Self { + match val.0 { + Some(d) => TaskCell::Content(CellContent(d.map(|d| d.untyped().1))), + None => TaskCell::NeedComputation, + } + } +} + +impl Serialize for TaskCells { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut seq = serializer.serialize_seq(Some(self.0.len()))?; + for (cell_id, cell) in &self.0 { + let task_cell = SerializableTaskCell(match cell { + TaskCell::Content(CellContent(opt)) => { + Some(opt.as_ref().map(|d| d.typed(cell_id.type_id))) + } + TaskCell::NeedComputation => None, + }); + seq.serialize_element(&(cell_id, task_cell))?; + } + seq.end() + } +} + +impl<'de> Deserialize<'de> for TaskCells { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let data: Vec<(CellId, SerializableTaskCell)> = Vec::deserialize(deserializer)?; + Ok(TaskCells( + data.into_iter() + .map(|(id, cell)| (id, cell.into())) + .collect(), + )) + } +} + pub struct ReadTaskState { pub clean: bool, pub keeps_external_active: bool, diff --git a/crates/turbo-tasks/src/raw_vc.rs b/crates/turbo-tasks/src/raw_vc.rs index 582dec5396dcf..ec6fa115fc1ad 100644 --- a/crates/turbo-tasks/src/raw_vc.rs +++ b/crates/turbo-tasks/src/raw_vc.rs @@ -13,14 +13,11 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use crate::{ - backend::CellContent, + backend::{CellContent, TypedCellContent}, event::EventListener, manager::{read_task_cell, read_task_output, TurboTasksApi}, - registry::{ - get_value_type, {self}, - }, - turbo_tasks, CollectiblesSource, SharedReference, TaskId, TraitTypeId, ValueTypeId, Vc, - VcValueTrait, + registry::{self, get_value_type}, + turbo_tasks, CollectiblesSource, TaskId, TraitTypeId, ValueTypeId, Vc, VcValueTrait, }; #[derive(Error, Debug)] @@ -113,15 +110,11 @@ impl RawVc { let content = read_task_cell(&*tt, task, index) .await .map_err(|source| ResolveTypeError::ReadError { source })?; - if let CellContent(Some(shared_reference)) = content { - if let SharedReference(Some(value_type), _) = shared_reference { - if get_value_type(value_type).has_trait(&trait_type) { - return Ok(Some(RawVc::TaskCell(task, index))); - } else { - return Ok(None); - } + if let TypedCellContent(value_type, CellContent(Some(_))) = content { + if get_value_type(value_type).has_trait(&trait_type) { + return Ok(Some(RawVc::TaskCell(task, index))); } else { - return Err(ResolveTypeError::UntypedContent); + return Ok(None); } } else { return Err(ResolveTypeError::NoContent); @@ -149,15 +142,11 @@ impl RawVc { let content = read_task_cell(&*tt, task, index) .await .map_err(|source| ResolveTypeError::ReadError { source })?; - if let CellContent(Some(shared_reference)) = content { - if let SharedReference(Some(cell_value_type), _) = shared_reference { - if cell_value_type == value_type { - return Ok(Some(RawVc::TaskCell(task, index))); - } else { - return Ok(None); - } + if let TypedCellContent(cell_value_type, CellContent(Some(_))) = content { + if cell_value_type == value_type { + return Ok(Some(RawVc::TaskCell(task, index))); } else { - return Err(ResolveTypeError::UntypedContent); + return Ok(None); } } else { return Err(ResolveTypeError::NoContent); @@ -317,7 +306,7 @@ impl ReadRawVcFuture { } impl Future for ReadRawVcFuture { - type Output = Result; + type Output = Result; fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { self.turbo_tasks.notify_scheduled_tasks(); diff --git a/crates/turbo-tasks/src/read_ref.rs b/crates/turbo-tasks/src/read_ref.rs index 3c1255a07cd12..df4b6e4f3df2c 100644 --- a/crates/turbo-tasks/src/read_ref.rs +++ b/crates/turbo-tasks/src/read_ref.rs @@ -243,10 +243,7 @@ where /// reference. pub fn cell(read_ref: ReadRef) -> Vc { let local_cell = find_cell_by_type(T::get_value_type_id()); - local_cell.update_shared_reference(SharedReference::new( - Some(T::get_value_type_id()), - read_ref.0, - )); + local_cell.update_shared_reference(SharedReference::new(read_ref.0)); Vc { node: local_cell.into(), _t: PhantomData, diff --git a/crates/turbo-tasks/src/task/shared_reference.rs b/crates/turbo-tasks/src/task/shared_reference.rs index 747f2477c98ca..0194bfdfc597d 100644 --- a/crates/turbo-tasks/src/task/shared_reference.rs +++ b/crates/turbo-tasks/src/task/shared_reference.rs @@ -14,29 +14,42 @@ use crate::{ ValueTypeId, }; -/// A type-erased wrapper for [`triomphe::Arc`]. +/// A reference to a piece of data #[derive(Clone)] -pub struct SharedReference( - pub Option, - pub triomphe::Arc, -); +pub struct SharedReference(pub triomphe::Arc); impl SharedReference { - pub fn new(type_id: Option, data: triomphe::Arc) -> Self { - Self(type_id, data.unsize(coerce_to_any_send_sync())) + pub fn new(data: triomphe::Arc) -> Self { + Self(data.unsize(coerce_to_any_send_sync())) } +} + +/// A reference to a piece of data with type information +#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct TypedSharedReference(pub ValueTypeId, pub SharedReference); +impl SharedReference { pub fn downcast(self) -> Result, Self> { - match downcast_triomphe_arc(self.1) { + match downcast_triomphe_arc(self.0) { Ok(data) => Ok(data), - Err(data) => Err(Self(self.0, data)), + Err(data) => Err(Self(data)), } } + + pub(crate) fn typed(&self, type_id: ValueTypeId) -> TypedSharedReference { + TypedSharedReference(type_id, self.clone()) + } +} + +impl TypedSharedReference { + pub(crate) fn untyped(&self) -> (ValueTypeId, SharedReference) { + (self.0, self.1.clone()) + } } impl Hash for SharedReference { fn hash(&self, state: &mut H) { - Hash::hash(&(&*self.1 as *const (dyn Any + Send + Sync)), state) + Hash::hash(&(&*self.0 as *const (dyn Any + Send + Sync)), state) } } impl PartialEq for SharedReference { @@ -44,57 +57,63 @@ impl PartialEq for SharedReference { // only compares their addresses. #[allow(ambiguous_wide_pointer_comparisons)] fn eq(&self, other: &Self) -> bool { - triomphe::Arc::ptr_eq(&self.1, &other.1) + triomphe::Arc::ptr_eq(&self.0, &other.0) } } impl Eq for SharedReference {} - +impl PartialOrd for SharedReference { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +impl Ord for SharedReference { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + Ord::cmp( + &(&*self.0 as *const (dyn Any + Send + Sync)).cast::<()>(), + &(&*other.0 as *const (dyn Any + Send + Sync)).cast::<()>(), + ) + } +} impl Debug for SharedReference { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_tuple("SharedReference") - .field(&self.0) - .field(&self.1) - .finish() + f.debug_tuple("SharedReference").field(&self.0).finish() } } -impl Serialize for SharedReference { +impl Serialize for TypedSharedReference { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { - if let SharedReference(Some(ty), arc) = self { - let value_type = registry::get_value_type(*ty); - if let Some(serializable) = value_type.any_as_serializable(arc) { - let mut t = serializer.serialize_tuple(2)?; - t.serialize_element(registry::get_value_type_global_name(*ty))?; - t.serialize_element(serializable)?; - t.end() - } else { - Err(serde::ser::Error::custom(format!( - "{:?} is not serializable", - arc - ))) - } + let TypedSharedReference(ty, SharedReference(arc)) = self; + let value_type = registry::get_value_type(*ty); + if let Some(serializable) = value_type.any_as_serializable(arc) { + let mut t = serializer.serialize_tuple(2)?; + t.serialize_element(registry::get_value_type_global_name(*ty))?; + t.serialize_element(serializable)?; + t.end() } else { - Err(serde::ser::Error::custom( - "untyped values are not serializable", - )) + Err(serde::ser::Error::custom(format!( + "{:?} is not serializable", + arc + ))) } } } impl Display for SharedReference { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(ty) = self.0 { - write!(f, "value of type {}", registry::get_value_type(ty).name) - } else { - write!(f, "untyped value") - } + write!(f, "untyped value") + } +} + +impl Display for TypedSharedReference { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "value of type {}", registry::get_value_type(self.0).name) } } -impl<'de> Deserialize<'de> for SharedReference { +impl<'de> Deserialize<'de> for TypedSharedReference { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, @@ -102,7 +121,7 @@ impl<'de> Deserialize<'de> for SharedReference { struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = SharedReference; + type Value = TypedSharedReference; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a serializable shared reference") @@ -117,7 +136,7 @@ impl<'de> Deserialize<'de> for SharedReference { if let Some(seed) = registry::get_value_type(ty).get_any_deserialize_seed() { if let Some(value) = seq.next_element_seed(seed)? { - Ok(SharedReference::new(Some(ty), value.into())) + Ok(TypedSharedReference(ty, SharedReference::new(value.into()))) } else { Err(serde::de::Error::invalid_length( 1, diff --git a/crates/turbo-tasks/src/task/task_input.rs b/crates/turbo-tasks/src/task/task_input.rs index ef7cd47b5fe3c..b9f9ebb9d8b9c 100644 --- a/crates/turbo-tasks/src/task/task_input.rs +++ b/crates/turbo-tasks/src/task/task_input.rs @@ -5,8 +5,7 @@ use async_trait::async_trait; use serde::{Deserialize, Serialize}; use crate::{ - magic_any::MagicAny, vc::ResolvedVc, RcStr, TaskId, TransientInstance, TransientValue, Value, - ValueTypeId, Vc, + MagicAny, RcStr, ResolvedVc, TaskId, TransientInstance, TransientValue, Value, ValueTypeId, Vc, }; /// Trait to implement in order for a type to be accepted as a diff --git a/crates/turbo-tasks/src/trait_ref.rs b/crates/turbo-tasks/src/trait_ref.rs index d5eb54ecd8376..43efa4af50296 100644 --- a/crates/turbo-tasks/src/trait_ref.rs +++ b/crates/turbo-tasks/src/trait_ref.rs @@ -5,8 +5,9 @@ use serde::{Deserialize, Serialize}; use crate::{ manager::find_cell_by_type, + task::shared_reference::TypedSharedReference, vc::{cast::VcCast, ReadVcFuture, VcValueTraitCast}, - RawVc, SharedReference, Vc, VcValueTrait, + RawVc, Vc, VcValueTrait, }; /// Similar to a [`ReadRef`][crate::ReadRef], but contains a value trait @@ -19,7 +20,7 @@ pub struct TraitRef where T: ?Sized, { - shared_reference: SharedReference, + shared_reference: TypedSharedReference, _t: PhantomData, } @@ -63,7 +64,7 @@ impl Serialize for TraitRef { impl<'de, T> Deserialize<'de> for TraitRef { fn deserialize>(deserializer: D) -> Result { Ok(Self { - shared_reference: SharedReference::deserialize(deserializer)?, + shared_reference: TypedSharedReference::deserialize(deserializer)?, _t: PhantomData, }) } @@ -83,7 +84,7 @@ impl TraitRef where T: ?Sized, { - pub(crate) fn new(shared_reference: SharedReference) -> Self { + pub(crate) fn new(shared_reference: TypedSharedReference) -> Self { Self { shared_reference, _t: PhantomData, @@ -99,10 +100,9 @@ where /// trait `T`. pub fn cell(trait_ref: TraitRef) -> Vc { // See Safety clause above. - let SharedReference(ty, _) = trait_ref.shared_reference; - let ty = ty.unwrap(); + let TypedSharedReference(ty, shared_ref) = trait_ref.shared_reference; let local_cell = find_cell_by_type(ty); - local_cell.update_shared_reference(trait_ref.shared_reference); + local_cell.update_shared_reference(shared_ref); let raw_vc: RawVc = local_cell.into(); raw_vc.into() } diff --git a/crates/turbo-tasks/src/value.rs b/crates/turbo-tasks/src/value.rs index b3b36db17840f..05ff7098a2b23 100644 --- a/crates/turbo-tasks/src/value.rs +++ b/crates/turbo-tasks/src/value.rs @@ -70,7 +70,8 @@ impl Deref for TransientValue { /// Equality and hash is implemented as pointer comparison. /// /// Doesn't require serialization, and won't be stored in the persistent cache -/// in the future. +/// in the future, so we don't include the `ValueTypeId` in the +/// `SharedReference`. pub struct TransientInstance { inner: SharedReference, phantom: PhantomData, @@ -121,7 +122,7 @@ impl From> for SharedReference { impl From> for TransientInstance { fn from(arc: triomphe::Arc) -> Self { Self { - inner: SharedReference::new(None, arc), + inner: SharedReference::new(arc), phantom: PhantomData, } } @@ -131,7 +132,7 @@ impl TryFrom for TransientInstance type Error = (); fn try_from(inner: SharedReference) -> Result { - if inner.1.downcast_ref::().is_some() { + if inner.0.downcast_ref::().is_some() { Ok(Self { inner, phantom: PhantomData, @@ -145,7 +146,7 @@ impl TryFrom for TransientInstance impl TransientInstance { pub fn new(value: T) -> Self { Self { - inner: SharedReference::new(None, triomphe::Arc::new(value)), + inner: SharedReference::new(triomphe::Arc::new(value)), phantom: PhantomData, } } @@ -155,6 +156,6 @@ impl Deref for TransientInstance { type Target = T; fn deref(&self) -> &Self::Target { - self.inner.1.downcast_ref().unwrap() + self.inner.0.downcast_ref().unwrap() } } diff --git a/crates/turbo-tasks/src/vc/cast.rs b/crates/turbo-tasks/src/vc/cast.rs index b8f0edf2490a2..38325d377c74e 100644 --- a/crates/turbo-tasks/src/vc/cast.rs +++ b/crates/turbo-tasks/src/vc/cast.rs @@ -2,7 +2,7 @@ use std::{marker::PhantomData, mem::ManuallyDrop}; use anyhow::Result; -use crate::{backend::CellContent, ReadRef, TraitRef, VcRead, VcValueTrait, VcValueType}; +use crate::{backend::TypedCellContent, ReadRef, TraitRef, VcRead, VcValueTrait, VcValueType}; /// Trait defined to share behavior between values and traits within /// [`ReadRawVcFuture`][crate::ReadRawVcFuture]. See [`VcValueTypeCast`] and @@ -12,7 +12,7 @@ use crate::{backend::CellContent, ReadRef, TraitRef, VcRead, VcValueTrait, VcVal pub trait VcCast: private::Sealed { type Output; - fn cast(content: CellContent) -> Result; + fn cast(content: TypedCellContent) -> Result; } /// Casts an arbitrary cell content into a [`ReadRef`]. @@ -26,7 +26,7 @@ where { type Output = ReadRef; - fn cast(content: CellContent) -> Result { + fn cast(content: TypedCellContent) -> Result { Ok( // Safety: the `VcValueType` implementor must guarantee that both `T` and // `Repr` are #[repr(transparent)]. @@ -57,7 +57,7 @@ where { type Output = TraitRef; - fn cast(content: CellContent) -> Result { + fn cast(content: TypedCellContent) -> Result { // Safety: Constructor ensures the cell content points to a value that // implements T content.cast_trait::() From cce3d88324edd5c48b172b3769ff5a37cf5b9c18 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 25 Jul 2024 08:21:38 +0200 Subject: [PATCH 60/73] avoid implementing Eq on Completion (#8818) ### Description It's probably not want to want. You want ptr_eq instead. ### Testing Instructions --- crates/turbo-tasks/src/completion.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/turbo-tasks/src/completion.rs b/crates/turbo-tasks/src/completion.rs index 36554d668ff54..865074b012192 100644 --- a/crates/turbo-tasks/src/completion.rs +++ b/crates/turbo-tasks/src/completion.rs @@ -4,7 +4,9 @@ use crate::{self as turbo_tasks, RawVc, TryJoinIterExt, Vc}; /// to have a concrete reference that can be awaited. /// It will invalidate the awaiting task everytime the referenced /// task has been executed. -#[turbo_tasks::value(cell = "new")] +/// Note: PartialEq is not implement since it doesn't make sense to compare +/// Completion this way. You probably want to use [`ReadRef::ptr_eq`] instead. +#[turbo_tasks::value(cell = "new", eq = "manual")] pub struct Completion; #[turbo_tasks::value_impl] From 681bfabd8b8b5954d6d991c335f217989bece3ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Thu, 25 Jul 2024 15:50:14 +0900 Subject: [PATCH 61/73] feat: Improve tree shaking (#8781) ### Description I'm still struggling to make next.js CI work well with tree shaking. - https://github.com/vercel/next.js/pull/66689 --- .gitattributes | 1 + .../turbopack-ecmascript/benches/analyzer.rs | 2 +- .../src/analyzer/graph.rs | 3 +- .../src/analyzer/imports.rs | 20 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 3 +- crates/turbopack-ecmascript/src/lib.rs | 8 + crates/turbopack-ecmascript/src/minify.rs | 7 +- crates/turbopack-ecmascript/src/parse.rs | 1 - .../src/references/esm/base.rs | 3 + .../src/references/mod.rs | 13 +- .../src/tree_shake/asset.rs | 2 +- .../src/tree_shake/cjs_finder.rs | 11 - .../src/tree_shake/graph.rs | 462 +-- .../src/tree_shake/mod.rs | 131 +- .../src/tree_shake/tests.rs | 2 +- .../src/tree_shake/util.rs | 326 +- .../tests/tree-shaker/analyzer/1/output.md | 644 ++- .../tests/tree-shaker/analyzer/2/output.md | 678 +++- .../tests/tree-shaker/analyzer/3/output.md | 487 ++- .../analyzer/amphtml-document/input.js | 34 + .../analyzer/amphtml-document/output.md | 800 ++++ .../tree-shaker/analyzer/app-route/output.md | 627 ++- .../analyzer/assign-before-decl-fn/input.js | 7 + .../analyzer/assign-before-decl-fn/output.md | 220 + .../analyzer/assign-before-decl-var/input.js | 6 + .../analyzer/assign-before-decl-var/output.md | 209 + .../analyzer/combined-export/output.md | 112 +- .../tree-shaker/analyzer/complex/output.md | 642 ++- .../analyzer/export-named/output.md | 86 +- .../tree-shaker/analyzer/failed-1/output.md | 320 +- .../tree-shaker/analyzer/failed-2/output.md | 1206 ++++-- .../tree-shaker/analyzer/failed-3/output.md | 3583 ++++++++++++++--- .../tree-shaker/analyzer/grouping/output.md | 452 ++- .../analyzer/ipc-evaluate/output.md | 216 +- .../tree-shaker/analyzer/ipc-index/output.md | 3583 ++++++++++++++--- .../tree-shaker/analyzer/let-bug-1/input.js | 44 + .../tree-shaker/analyzer/let-bug-1/output.md | 545 +++ .../tree-shaker/analyzer/logger/input.js | 44 + .../tree-shaker/analyzer/logger/output.md | 545 +++ .../tree-shaker/analyzer/mui-sys/input.js | 85 + .../tree-shaker/analyzer/mui-sys/output.md | 3335 +++++++++++++++ .../analyzer/multi-export/output.md | 116 +- .../tree-shaker/analyzer/nanoid/input.js | 44 + .../tree-shaker/analyzer/nanoid/output.md | 1131 ++++++ .../analyzer/next-response/input.js | 122 + .../analyzer/next-response/output.md | 1349 +++++++ .../analyzer/nextjs-tracer/input.js | 214 + .../analyzer/nextjs-tracer/output.md | 1814 +++++++++ .../tree-shaker/analyzer/node-fetch/input.js | 9 + .../tree-shaker/analyzer/node-fetch/output.md | 353 ++ .../analyzer/node-globals/output.md | 44 +- .../tree-shaker/analyzer/otel-core/input.js | 27 + .../tree-shaker/analyzer/otel-core/output.md | 515 +++ .../analyzer/route-handler/input.js | 9 + .../analyzer/route-handler/output.md | 338 ++ .../tree-shaker/analyzer/route-kind/output.md | 120 +- .../tree-shaker/analyzer/shared-2/output.md | 398 +- .../shared-and-side-effects/output.md | 501 ++- .../analyzer/shared-regression/output.md | 398 +- .../analyzer/simple-vars-1/output.md | 112 +- .../tree-shaker/analyzer/simple/output.md | 192 +- .../analyzer/template-pages/output.md | 1637 +++++--- .../analyzer/test-config-1/output.md | 711 ++-- .../tree-shaker/analyzer/tla-1/output.md | 156 +- .../tree-shaker/analyzer/typeof-1/input.js | 10 + .../tree-shaker/analyzer/typeof-1/output.md | 467 +++ .../analyzer/write-order/output.md | 367 +- ...e-shake_dynamic-import_input_lib_029950.js | 2 +- ...-shake_dynamic-import_input_lib_f28c6f.js} | 193 +- ...ke_dynamic-import_input_lib_f28c6f.js.map} | 60 +- ...tree-shake_export-named_input_35ea42._.js} | 141 +- ...-shake_export-named_input_35ea42._.js.map} | 56 +- ...ake_export-namespace_input_b4b68a._.js.map | 37 - ...-shake_export-namespace_input_c0eca6._.js} | 251 +- ...ake_export-namespace_input_c0eca6._.js.map | 61 + ...ake_import-named-all_input_18bec5._.js.map | 23 - ...-shake_import-named-all_input_71b07f._.js} | 114 +- ...ke_import-named-all_input_71b07f._.js.map} | 56 +- ...tree-shake_import-named_input_ed0d99._.js} | 114 +- ...-shake_import-named_input_ed0d99._.js.map} | 44 +- ...-shake_import-namespace_input_351ad1._.js} | 232 +- ...ake_import-namespace_input_351ad1._.js.map | 53 + ...hake_import-side-effect_input_cdc49f._.js} | 84 +- ..._import-side-effect_input_cdc49f._.js.map} | 32 +- ...ake_require-side-effect_input_6b5862._.js} | 193 +- ...require-side-effect_input_6b5862._.js.map} | 64 +- ...e_tree-shake-test-1_input_index_87c735.js} | 193 +- ...ee-shake-test-1_input_index_87c735.js.map} | 60 +- crates/turbopack-wasm/src/module_asset.rs | 36 +- crates/turbopack/src/module_options/mod.rs | 3 + .../module_options/module_options_context.rs | 1 + 91 files changed, 27876 insertions(+), 4886 deletions(-) delete mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js} (57%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js.map} (50%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/{crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js => crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js} (52%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/{crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js.map => crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js.map} (50%) delete mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js} (54%) create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js.map delete mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js.map rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js} (52%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/{import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map => import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js.map} (59%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/{crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js => crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js} (51%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/{crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js.map => crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js.map} (52%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js} (55%) create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js.map rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js} (55%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/{79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js.map => 79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js.map} (53%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/{a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js => a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js} (58%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/{a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map => a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js.map} (51%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/{a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js => a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js} (57%) rename crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/{a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map => a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js.map} (50%) diff --git a/.gitattributes b/.gitattributes index 650dc002a59d5..860411fb2b3c6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ .config/ast-grep/rule-tests/__snapshots__/** linguist-generated=true crates/turbo-tasks-macros-tests/tests/**/*.stderr linguist-generated=true +crates/turbopack-ecmascript/tests/tree-shaker/analyzer/**/output.md linguist-generated=true crates/turbopack-tests/tests/snapshot/**/output/** linguist-generated=true crates/turborepo-lockfiles/fixtures/*.lock text eol=lf diff --git a/crates/turbopack-ecmascript/benches/analyzer.rs b/crates/turbopack-ecmascript/benches/analyzer.rs index 4b70575de1e98..0a94684f5ed9b 100644 --- a/crates/turbopack-ecmascript/benches/analyzer.rs +++ b/crates/turbopack-ecmascript/benches/analyzer.rs @@ -56,7 +56,7 @@ pub fn benchmark(c: &mut Criterion) { program.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); let eval_context = - EvalContext::new(&program, unresolved_mark, top_level_mark, false, None); + EvalContext::new(&program, unresolved_mark, top_level_mark, None); let var_graph = create_graph(&program, &eval_context); let input = BenchInput { diff --git a/crates/turbopack-ecmascript/src/analyzer/graph.rs b/crates/turbopack-ecmascript/src/analyzer/graph.rs index 05dd2f59e6646..8105ae870289f 100644 --- a/crates/turbopack-ecmascript/src/analyzer/graph.rs +++ b/crates/turbopack-ecmascript/src/analyzer/graph.rs @@ -270,13 +270,12 @@ impl EvalContext { module: &Program, unresolved_mark: Mark, top_level_mark: Mark, - skip_namespace: bool, source: Option>>, ) -> Self { Self { unresolved_mark, top_level_mark, - imports: ImportMap::analyze(module, skip_namespace, source), + imports: ImportMap::analyze(module, source), } } diff --git a/crates/turbopack-ecmascript/src/analyzer/imports.rs b/crates/turbopack-ecmascript/src/analyzer/imports.rs index b224d3ea74f51..e9d797cc62349 100644 --- a/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -139,8 +139,6 @@ pub(crate) struct ImportMap { pub(crate) enum ImportedSymbol { ModuleEvaluation, Symbol(JsWord), - /// User requested the whole module - Namespace, Exports, Part(u32), } @@ -202,16 +200,11 @@ impl ImportMap { } /// Analyze ES import - pub(super) fn analyze( - m: &Program, - skip_namespace: bool, - source: Option>>, - ) -> Self { + pub(super) fn analyze(m: &Program, source: Option>>) -> Self { let mut data = ImportMap::default(); m.visit_with(&mut Analyzer { data: &mut data, - skip_namespace, source, }); @@ -221,7 +214,6 @@ impl ImportMap { struct Analyzer<'a> { data: &'a mut ImportMap, - skip_namespace: bool, source: Option>>, } @@ -233,10 +225,6 @@ impl<'a> Analyzer<'a> { imported_symbol: ImportedSymbol, annotations: ImportAnnotations, ) -> Option { - if self.skip_namespace && matches!(imported_symbol, ImportedSymbol::Namespace) { - return None; - } - let issue_source = self .source .map(|s| IssueSource::from_swc_offsets(s, span.lo.to_usize(), span.hi.to_usize())); @@ -339,7 +327,7 @@ impl Visit for Analyzer<'_> { let i = self.ensure_reference( export.span, export.src.value.clone(), - symbol.unwrap_or(ImportedSymbol::Namespace), + symbol.unwrap_or(ImportedSymbol::Exports), annotations, ); if let Some(i) = i { @@ -455,7 +443,7 @@ fn get_import_symbol_from_import(specifier: &ImportSpecifier) -> ImportedSymbol _ => local.sym.clone(), }), ImportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ImportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ImportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } @@ -465,6 +453,6 @@ fn get_import_symbol_from_export(specifier: &ExportSpecifier) -> ImportedSymbol ImportedSymbol::Symbol(orig_name(orig)) } ExportSpecifier::Default(..) => ImportedSymbol::Symbol(js_word!("default")), - ExportSpecifier::Namespace(..) => ImportedSymbol::Namespace, + ExportSpecifier::Namespace(..) => ImportedSymbol::Exports, } } diff --git a/crates/turbopack-ecmascript/src/analyzer/mod.rs b/crates/turbopack-ecmascript/src/analyzer/mod.rs index 54f229549a26b..d397d1873a2c3 100644 --- a/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -3588,8 +3588,7 @@ mod tests { let top_level_mark = Mark::new(); m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, false)); - let eval_context = - EvalContext::new(&m, unresolved_mark, top_level_mark, false, None); + let eval_context = EvalContext::new(&m, unresolved_mark, top_level_mark, None); let mut var_graph = create_graph(&m, &eval_context); diff --git a/crates/turbopack-ecmascript/src/lib.rs b/crates/turbopack-ecmascript/src/lib.rs index b963ae5a7f903..ea2d6e7ed3536 100644 --- a/crates/turbopack-ecmascript/src/lib.rs +++ b/crates/turbopack-ecmascript/src/lib.rs @@ -120,6 +120,9 @@ pub enum TreeShakingMode { ReexportsOnly, } +#[turbo_tasks::value(transparent)] +pub struct OptionTreeShaking(pub Option); + #[turbo_tasks::value(shared, serialization = "auto_for_input")] #[derive(Hash, Debug, Default, Copy, Clone)] pub struct EcmascriptOptions { @@ -139,6 +142,11 @@ pub struct EcmascriptOptions { /// If false, they will reference the whole directory. If true, they won't /// reference anything and lead to an runtime error instead. pub ignore_dynamic_requests: bool, + + /// The list of export names that should make tree shaking bail off. This is + /// required because tree shaking can split imports like `export const + /// runtime = 'edge'` as a separate module. + pub special_exports: Vc>, } #[turbo_tasks::value(serialization = "auto_for_input")] diff --git a/crates/turbopack-ecmascript/src/minify.rs b/crates/turbopack-ecmascript/src/minify.rs index f02a3517a30b0..f94859d23d8c3 100644 --- a/crates/turbopack-ecmascript/src/minify.rs +++ b/crates/turbopack-ecmascript/src/minify.rs @@ -54,9 +54,12 @@ pub async fn minify(path: Vc, code: Vc) -> Result GLOBALS.set(&Default::default(), || { let program = match parser.parse_program() { Ok(program) => program, - Err(_error) => { + Err(err) => { // TODO should emit an issue - bail!("failed to parse source code") + bail!( + "failed to parse source code\n{err:?}\n{}", + code.source_code().to_str()? + ) } }; let comments = SingleThreadedComments::default(); diff --git a/crates/turbopack-ecmascript/src/parse.rs b/crates/turbopack-ecmascript/src/parse.rs index 9a7580e628a66..0f2b065c00962 100644 --- a/crates/turbopack-ecmascript/src/parse.rs +++ b/crates/turbopack-ecmascript/src/parse.rs @@ -433,7 +433,6 @@ async fn parse_content( &parsed_program, unresolved_mark, top_level_mark, - false, Some(source), ); diff --git a/crates/turbopack-ecmascript/src/references/esm/base.rs b/crates/turbopack-ecmascript/src/references/esm/base.rs index 5286850437a42..8852d61a52442 100644 --- a/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -96,6 +96,7 @@ pub struct EsmAssetReference { pub issue_source: Option>, pub export_name: Option>, pub import_externals: bool, + pub special_exports: Vc>, } /// A list of [EsmAssetReference]s @@ -121,6 +122,7 @@ impl EsmAssetReference { issue_source: Option>, annotations: Value, export_name: Option>, + special_exports: Vc>, import_externals: bool, ) -> Vc { Self::cell(EsmAssetReference { @@ -130,6 +132,7 @@ impl EsmAssetReference { annotations: annotations.into_value(), export_name, import_externals, + special_exports, }) } diff --git a/crates/turbopack-ecmascript/src/references/mod.rs b/crates/turbopack-ecmascript/src/references/mod.rs index 5a4eaab2a4e67..3047f918ab90a 100644 --- a/crates/turbopack-ecmascript/src/references/mod.rs +++ b/crates/turbopack-ecmascript/src/references/mod.rs @@ -123,7 +123,7 @@ use crate::{ }, chunk::EcmascriptExports, code_gen::{CodeGen, CodeGenerateable, CodeGenerateableWithAsyncModuleInfo, CodeGenerateables}, - magic_identifier, + magic_identifier, parse, references::{ async_module::{AsyncModule, OptionAsyncModule}, cjs::{CjsRequireAssetReference, CjsRequireCacheAccess, CjsRequireResolveAssetReference}, @@ -353,6 +353,7 @@ struct AnalysisState<'a> { // the object allocation. first_import_meta: bool, tree_shaking_mode: Option, + special_exports: Vc>, import_externals: bool, ignore_dynamic_requests: bool, } @@ -412,6 +413,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( let options = raw_module.options; let compile_time_info = raw_module.compile_time_info; let options = options.await?; + let special_exports = options.special_exports; let import_externals = options.import_externals; let origin = Vc::upcast::>(module); @@ -427,8 +429,8 @@ pub(crate) async fn analyse_ecmascript_module_internal( }; let parsed = if let Some(part) = part { - let parsed = module.failsafe_parse(); - let split_data = split(source.ident(), source, parsed); + let parsed = parse(source, ty, transforms); + let split_data = split(source.ident(), source, parsed, special_exports); part_of_module(split_data, part) } else { module.failsafe_parse() @@ -576,7 +578,6 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => Some(ModulePart::exports()), - ImportedSymbol::Namespace => None, }, Some(TreeShakingMode::ReexportsOnly) => match &r.imported_symbol { ImportedSymbol::ModuleEvaluation => { @@ -586,10 +587,10 @@ pub(crate) async fn analyse_ecmascript_module_internal( ImportedSymbol::Symbol(name) => Some(ModulePart::export((&**name).into())), ImportedSymbol::Part(part_id) => Some(ModulePart::internal(*part_id)), ImportedSymbol::Exports => None, - ImportedSymbol::Namespace => None, }, None => None, }, + special_exports, import_externals, ); @@ -814,6 +815,7 @@ pub(crate) async fn analyse_ecmascript_module_internal( first_import_meta: true, tree_shaking_mode: options.tree_shaking_mode, import_externals: options.import_externals, + special_exports: options.special_exports, ignore_dynamic_requests: options.ignore_dynamic_requests, }; @@ -1972,6 +1974,7 @@ async fn handle_free_var_reference( .map(|export| ModulePart::export(export.clone())), None => None, }, + state.special_exports, state.import_externals, ) .resolve() diff --git a/crates/turbopack-ecmascript/src/tree_shake/asset.rs b/crates/turbopack-ecmascript/src/tree_shake/asset.rs index 63a43ea340ee7..a3dca90851ee6 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/asset.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/asset.rs @@ -23,7 +23,7 @@ use crate::{ /// This type is used for an advanced tree shkaing. #[turbo_tasks::value] pub struct EcmascriptModulePartAsset { - pub(crate) full_module: Vc, + pub full_module: Vc, pub(crate) part: Vc, pub(crate) import_externals: bool, } diff --git a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs b/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs deleted file mode 100644 index 9cf44e8983818..0000000000000 --- a/crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs +++ /dev/null @@ -1,11 +0,0 @@ -use swc_core::ecma::ast::*; - -pub fn contains_cjs(m: &Program) -> bool { - if let Program::Module(m) = m { - if m.body.iter().any(|s| s.is_module_decl()) { - return false; - } - } - - true -} diff --git a/crates/turbopack-ecmascript/src/tree_shake/graph.rs b/crates/turbopack-ecmascript/src/tree_shake/graph.rs index 9531033047db0..12d837a35a4f6 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/graph.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/graph.rs @@ -5,7 +5,8 @@ use std::{ use indexmap::IndexSet; use petgraph::{ - algo::{has_path_connecting, kosaraju_scc}, + algo::{condensation, has_path_connecting}, + graphmap::GraphMap, prelude::DiGraphMap, }; use rustc_hash::{FxHashMap, FxHashSet, FxHasher}; @@ -13,11 +14,11 @@ use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ - op, ClassDecl, Decl, DefaultDecl, ExportDecl, ExportNamedSpecifier, ExportSpecifier, - Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, ImportSpecifier, - ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, Stmt, VarDecl, - VarDeclKind, VarDeclarator, + op, ClassDecl, Decl, DefaultDecl, ExportAll, ExportDecl, ExportNamedSpecifier, + ExportSpecifier, Expr, ExprStmt, FnDecl, Id, Ident, ImportDecl, ImportNamedSpecifier, + ImportSpecifier, ImportStarAsSpecifier, KeyValueProp, Lit, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, ObjectLit, Prop, PropName, PropOrSpread, + Stmt, VarDecl, VarDeclKind, VarDeclarator, }, atoms::JsWord, utils::{find_pat_ids, private_ident, quote_ident}, @@ -26,7 +27,9 @@ use swc_core::{ use turbo_tasks::RcStr; use super::{ - util::{ids_captured_by, ids_used_by, ids_used_by_ignoring_nested}, + util::{ + collect_top_level_decls, ids_captured_by, ids_used_by, ids_used_by_ignoring_nested, Vars, + }, Key, TURBOPACK_PART_IMPORT_SOURCE, }; use crate::magic_identifier; @@ -71,11 +74,12 @@ impl fmt::Debug for ItemId { type FxBuildHasher = BuildHasherDefault; /// Data about a module item -#[derive(Debug)] pub(crate) struct ItemData { /// Is the module item hoisted? pub is_hoisted: bool, + /// TOOD(PACK-3166): We can use this field to optimize tree shaking + #[allow(unused)] pub pure: bool, /// Variables declared or bound by this module item @@ -111,6 +115,22 @@ pub(crate) struct ItemData { pub export: Option, } +impl fmt::Debug for ItemData { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ItemData") + .field("is_hoisted", &self.is_hoisted) + .field("pure", &self.pure) + .field("var_decls", &self.var_decls) + .field("read_vars", &self.read_vars) + .field("eventual_read_vars", &self.eventual_read_vars) + .field("write_vars", &self.write_vars) + .field("eventual_write_vars", &self.eventual_write_vars) + .field("side_effects", &self.side_effects) + .field("export", &self.export) + .finish() + } +} + impl Default for ItemData { fn default() -> Self { Self { @@ -191,6 +211,8 @@ pub(super) struct SplitModuleResult { /// Dependency between parts. pub part_deps: FxHashMap>, pub modules: Vec, + + pub star_reexports: Vec, } impl DepGraph { @@ -222,11 +244,17 @@ impl DepGraph { /// /// Note: ESM imports are immutable, but we do not handle it. pub(super) fn split_module(&self, data: &FxHashMap) -> SplitModuleResult { - let groups = self.finalize(data); + let groups = self.finalize(); let mut exports = FxHashMap::default(); let mut part_deps = FxHashMap::<_, Vec<_>>::default(); + let star_reexports: Vec<_> = data + .values() + .filter_map(|v| v.content.as_module_decl()?.as_export_all()) + .cloned() + .collect(); let mut modules = vec![]; + let mut exports_module = Module::dummy(); if groups.graph_ix.is_empty() { // If there's no dependency, all nodes are in the module evaluaiotn group. @@ -238,6 +266,18 @@ impl DepGraph { exports.insert(Key::ModuleEvaluation, 0); } + let mut declarator = FxHashMap::default(); + + for (ix, group) in groups.graph_ix.iter().enumerate() { + for id in group { + let item = data.get(id).unwrap(); + + for var in item.var_decls.iter() { + declarator.entry(var.clone()).or_insert_with(|| ix as u32); + } + } + } + for (ix, group) in groups.graph_ix.iter().enumerate() { let mut chunk = Module { span: DUMMY_SP, @@ -256,7 +296,13 @@ impl DepGraph { .chain(data.eventual_read_vars.iter()) .chain(data.eventual_write_vars.iter()) }) - .collect::>(); + .collect::>(); + + for item in group { + if let ItemId::Group(ItemIdGroupKind::Export(id, _)) = item { + required_vars.insert(id); + } + } for id in group { let data = data.get(id).unwrap(); @@ -268,11 +314,27 @@ impl DepGraph { for item in group { match item { - ItemId::Group(ItemIdGroupKind::Export(id, _)) => { - required_vars.insert(id); - + ItemId::Group(ItemIdGroupKind::Export(..)) => { if let Some(export) = &data[item].export { exports.insert(Key::Export(export.as_str().into()), ix as u32); + + let s = ExportSpecifier::Named(ExportNamedSpecifier { + span: DUMMY_SP, + orig: ModuleExportName::Ident(Ident::new(export.clone(), DUMMY_SP)), + exported: None, + is_type_only: false, + }); + exports_module.body.push(ModuleItem::ModuleDecl( + ModuleDecl::ExportNamed(NamedExport { + span: DUMMY_SP, + specifiers: vec![s], + src: Some(Box::new(TURBOPACK_PART_IMPORT_SOURCE.into())), + type_only: false, + with: Some(Box::new(create_turbopack_part_id_assert( + PartId::Export(export.to_string().into()), + ))), + }), + )); } } ItemId::Group(ItemIdGroupKind::ModuleEvaluation) => { @@ -283,29 +345,42 @@ impl DepGraph { } } + // Depend on direct dependencies so that they are executed before this module. for dep in groups .idx_graph .neighbors_directed(ix as u32, petgraph::Direction::Outgoing) { - let mut specifiers = vec![]; - - let dep_items = groups.graph_ix.get_index(dep as usize).unwrap(); + chunk + .body + .push(ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { + span: DUMMY_SP, + specifiers: vec![], + src: Box::new(TURBOPACK_PART_IMPORT_SOURCE.into()), + type_only: false, + with: Some(Box::new(create_turbopack_part_id_assert(PartId::Internal( + dep, + )))), + phase: Default::default(), + }))); + } - for dep_item in dep_items { - let data = data.get(dep_item).unwrap(); + // Import variables + for var in required_vars { + let Some(&dep) = declarator.get(var) else { + continue; + }; - for var in data.var_decls.iter() { - if required_vars.remove(var) { - specifiers.push(ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: var.clone().into(), - imported: None, - is_type_only: false, - })); - } - } + if dep == ix as u32 { + continue; } + let specifiers = vec![ImportSpecifier::Named(ImportNamedSpecifier { + span: DUMMY_SP, + local: var.clone().into(), + imported: None, + is_type_only: false, + })]; + part_deps.entry(ix as u32).or_default().push(dep); chunk @@ -366,10 +441,21 @@ impl DepGraph { modules.push(chunk); } + exports.insert(Key::Exports, modules.len() as u32); + + for star in &star_reexports { + exports_module + .body + .push(ModuleItem::ModuleDecl(ModuleDecl::ExportAll(star.clone()))); + } + + modules.push(exports_module); + SplitModuleResult { entrypoints: exports, part_deps, modules, + star_reexports, } } @@ -378,176 +464,47 @@ impl DepGraph { /// /// Note that [ModuleItem] and [Module] are represented as [ItemId] for /// performance. - pub(super) fn finalize( - &self, - data: &FxHashMap, - ) -> InternedGraph> { - /// Returns true if it should be called again - fn add_to_group( - graph: &InternedGraph, - data: &FxHashMap, - group: &mut Vec, - start_ix: u32, - global_done: &mut FxHashSet, - group_done: &mut FxHashSet, - ) -> bool { - let mut changed = false; - - // Check deps of `start`. - for dep_ix in graph - .idx_graph - .neighbors_directed(start_ix, petgraph::Direction::Outgoing) - { - let dep_id = graph.graph_ix.get_index(dep_ix as _).unwrap(); - - if global_done.insert(dep_ix) - || (data.get(dep_id).map_or(false, |data| data.pure) - && group_done.insert(dep_ix)) - { - changed = true; - - group.push(dep_id.clone()); - - add_to_group(graph, data, group, dep_ix, global_done, group_done); - } - } - - changed - } - - let mut cycles = kosaraju_scc(&self.g.idx_graph); - cycles.retain(|v| v.len() > 1); - - // If a node have two or more dependents, it should be in a separate - // group. - - let mut groups = vec![]; - let mut global_done = FxHashSet::default(); - - // Module evaluation node and export nodes starts a group - for id in self.g.graph_ix.iter() { - let ix = self.g.get_node(id); - - if let ItemId::Group(_) = id { - groups.push((vec![id.clone()], FxHashSet::default())); - global_done.insert(ix); - } - } - - // Cycles should form a separate group - for id in self.g.graph_ix.iter() { - let ix = self.g.get_node(id); - - if let Some(cycle) = cycles.iter().find(|v| v.contains(&ix)) { - if cycle.iter().all(|v| !global_done.contains(v)) { - let ids = cycle - .iter() - .map(|&ix| self.g.graph_ix[ix as usize].clone()) - .collect::>(); + pub(super) fn finalize(&self) -> InternedGraph> { + let graph = self.g.idx_graph.clone().into_graph::(); - global_done.extend(cycle.iter().copied()); + let condensed = condensation(graph, false); - groups.push((ids, Default::default())); - } - } - } + let mut new_graph = InternedGraph::default(); + let mut done = FxHashSet::default(); - // Expand **starting** nodes - for (ix, id) in self.g.graph_ix.iter().enumerate() { - // If a node is reachable from two or more nodes, it should be in a - // separate group. + let mapped = condensed.map( + |_, node| { + let mut item_ids = node + .iter() + .map(|&ix| { + done.insert(ix); - if global_done.contains(&(ix as u32)) { - continue; - } + self.g.graph_ix[ix as usize].clone() + }) + .collect::>(); + item_ids.sort(); - // Don't store a pure item in a separate chunk - if data.get(id).map_or(false, |data| data.pure) { - continue; - } + new_graph.node(&item_ids) + }, + |_, edge| *edge, + ); - // The number of nodes that this node is dependent on. - let dependant_count = self - .g - .idx_graph - .neighbors_directed(ix as _, petgraph::Direction::Incoming) - .count(); + let map = GraphMap::from_graph(mapped); - // The number of starting points that can reach to this node. - let count_of_startings = global_done - .iter() - .filter(|&&staring_point| { - has_path_connecting(&self.g.idx_graph, staring_point, ix as _, None) - }) - .count(); + // Insert nodes without any edges - if dependant_count >= 2 && count_of_startings >= 2 { - groups.push((vec![id.clone()], FxHashSet::default())); - global_done.insert(ix as u32); + for node in self.g.graph_ix.iter() { + let ix = self.g.get_node(node); + if !done.contains(&ix) { + let item_ids = vec![node.clone()]; + new_graph.node(&item_ids); } } - loop { - let mut changed = false; - - for (group, group_done) in &mut groups { - let start = &group[0]; - let start_ix = self.g.get_node(start); - changed |= - add_to_group(&self.g, data, group, start_ix, &mut global_done, group_done); - } - - if !changed { - break; - } + InternedGraph { + idx_graph: map, + graph_ix: new_graph.graph_ix, } - - let mut groups = groups.into_iter().map(|v| v.0).collect::>(); - - // We need to sort, because we start from the group item and add others start - // from them. But the final module should be in the order of the original code. - for group in groups.iter_mut() { - group.sort(); - group.dedup(); - } - - let mut new_graph = InternedGraph::default(); - let mut group_ix_by_item_ix = FxHashMap::default(); - - for group in &groups { - let group_ix = new_graph.node(group); - - for item in group { - let item_ix = self.g.get_node(item); - group_ix_by_item_ix.insert(item_ix, group_ix); - } - } - - for group in &groups { - let group_ix = new_graph.node(group); - - for item in group { - let item_ix = self.g.get_node(item); - - for item_dep_ix in self - .g - .idx_graph - .neighbors_directed(item_ix, petgraph::Direction::Outgoing) - { - let dep_group_ix = group_ix_by_item_ix.get(&item_dep_ix); - if let Some(&dep_group_ix) = dep_group_ix { - if group_ix == dep_group_ix { - continue; - } - new_graph - .idx_graph - .add_edge(group_ix, dep_group_ix, Dependency::Strong); - } - } - } - } - - new_graph } /// Fills information per module items @@ -557,6 +514,7 @@ impl DepGraph { unresolved_ctxt: SyntaxContext, top_level_ctxt: SyntaxContext, ) -> (Vec, FxHashMap) { + let top_level_vars = collect_top_level_decls(module); let mut exports = vec![]; let mut items = FxHashMap::default(); let mut ids = vec![]; @@ -697,21 +655,41 @@ impl DepGraph { }); { - let mut used_ids = ids_used_by_ignoring_nested( - &export.decl, - unresolved_ctxt, - top_level_ctxt, - ); + let mut used_ids = if export.decl.is_fn_expr() { + ids_used_by_ignoring_nested( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + ids_used_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + }; + used_ids.read.remove(&default_var.to_id()); used_ids.write.insert(default_var.to_id()); - let captured_ids = - ids_captured_by(&export.decl, unresolved_ctxt, top_level_ctxt); + let mut captured_ids = if export.decl.is_fn_expr() { + ids_captured_by( + &export.decl, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ) + } else { + Vars::default() + }; + captured_ids.read.remove(&default_var.to_id()); + let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, write_vars: used_ids.write, eventual_write_vars: captured_ids.write, var_decls: [default_var.to_id()].into_iter().collect(), - side_effects: true, content: ModuleItem::ModuleDecl(item.clone()), ..Default::default() }; @@ -741,9 +719,14 @@ impl DepGraph { &export.expr, unresolved_ctxt, top_level_ctxt, + &top_level_vars, + ); + let captured_ids = ids_captured_by( + &export.expr, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, ); - let captured_ids = - ids_captured_by(&export.expr, unresolved_ctxt, top_level_ctxt); used_ids.write.insert(default_var.to_id()); @@ -843,11 +826,7 @@ impl DepGraph { kind: ItemIdItemKind::ImportBinding(si as _), }; ids.push(id.clone()); - let local = match s { - ImportSpecifier::Named(s) => s.local.to_id(), - ImportSpecifier::Default(s) => s.local.to_id(), - ImportSpecifier::Namespace(s) => s.local.to_id(), - }; + let local = s.local().to_id(); items.insert( id, ItemData { @@ -875,7 +854,12 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&f.function, unresolved_ctxt, top_level_ctxt); + let vars = ids_used_by( + &f.function, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(f.ident.to_id()); @@ -905,19 +889,19 @@ impl DepGraph { }; ids.push(id.clone()); - let vars = ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt); + let mut vars = + ids_used_by(&c.class, unresolved_ctxt, top_level_ctxt, &top_level_vars); let var_decls = { let mut v = IndexSet::with_capacity_and_hasher(1, Default::default()); v.insert(c.ident.to_id()); v }; + vars.write.insert(c.ident.to_id()); items.insert( id, ItemData { - is_hoisted: true, - eventual_read_vars: vars.read, - eventual_write_vars: vars.write, - write_vars: var_decls.clone(), + read_vars: vars.read, + write_vars: vars.write, var_decls, content: ModuleItem::Stmt(Stmt::Decl(Decl::Class(c.clone()))), ..Default::default() @@ -937,13 +921,21 @@ impl DepGraph { ids.push(id.clone()); let decl_ids: Vec = find_pat_ids(&decl.name); - let vars = ids_used_by_ignoring_nested( + let mut vars = ids_used_by_ignoring_nested( + &decl.init, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let mut eventual_vars = ids_captured_by( &decl.init, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); - let eventual_vars = - ids_captured_by(&decl.init, unresolved_ctxt, top_level_ctxt); + + vars.read.retain(|id| !decl_ids.contains(id)); + eventual_vars.read.retain(|id| !decl_ids.contains(id)); let side_effects = vars.found_unresolved; @@ -951,6 +943,7 @@ impl DepGraph { decls: vec![decl.clone()], ..*v.clone() }); + vars.write.extend(decl_ids.iter().cloned()); let content = ModuleItem::Stmt(Stmt::Decl(Decl::Var(var_decl))); items.insert( id, @@ -958,7 +951,7 @@ impl DepGraph { var_decls: decl_ids.clone().into_iter().collect(), read_vars: vars.read, eventual_read_vars: eventual_vars.read, - write_vars: decl_ids.into_iter().chain(vars.write).collect(), + write_vars: vars.write, eventual_write_vars: eventual_vars.write, content, side_effects, @@ -972,20 +965,27 @@ impl DepGraph { expr: box Expr::Assign(assign), .. })) => { - let mut used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let mut used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); if assign.op != op!("=") { - used_ids.read.extend(used_ids.write.iter().cloned()); - - let extra_ids = ids_used_by_ignoring_nested( + let ids_used_by_left = ids_used_by_ignoring_nested( &assign.left, unresolved_ctxt, top_level_ctxt, + &top_level_vars, ); - used_ids.read.extend(extra_ids.read); - used_ids.write.extend(extra_ids.write); + + used_ids.read.extend(used_ids.write.iter().cloned()); + + used_ids.read.extend(ids_used_by_left.read); + used_ids.write.extend(ids_used_by_left.write); } let side_effects = used_ids.found_unresolved; @@ -1011,15 +1011,21 @@ impl DepGraph { ModuleItem::ModuleDecl( ModuleDecl::ExportDefaultDecl(..) | ModuleDecl::ExportDefaultExpr(..) - | ModuleDecl::ExportNamed(NamedExport { .. }), + | ModuleDecl::ExportNamed(NamedExport { .. }) + | ModuleDecl::ExportAll(..), ) => {} _ => { // Default to normal - let used_ids = - ids_used_by_ignoring_nested(item, unresolved_ctxt, top_level_ctxt); - let captured_ids = ids_captured_by(item, unresolved_ctxt, top_level_ctxt); + let used_ids = ids_used_by_ignoring_nested( + item, + unresolved_ctxt, + top_level_ctxt, + &top_level_vars, + ); + let captured_ids = + ids_captured_by(item, unresolved_ctxt, top_level_ctxt, &top_level_vars); let data = ItemData { read_vars: used_ids.read, eventual_read_vars: captured_ids.read, @@ -1058,10 +1064,10 @@ impl DepGraph { for (local, export_name) in exports { let name = match &export_name { - Some(ModuleExportName::Ident(v)) => v.to_id(), - _ => local.clone(), + Some(ModuleExportName::Ident(v)) => v.sym.clone(), + _ => local.0.clone(), }; - let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.0.clone())); + let id = ItemId::Group(ItemIdGroupKind::Export(local.clone(), name.clone())); ids.push(id.clone()); items.insert( id.clone(), @@ -1078,8 +1084,8 @@ impl DepGraph { type_only: false, with: None, })), - read_vars: [name.clone()].into_iter().collect(), - export: Some(name.0), + read_vars: [local.clone()].into_iter().collect(), + export: Some(name), ..Default::default() }, ); diff --git a/crates/turbopack-ecmascript/src/tree_shake/mod.rs b/crates/turbopack-ecmascript/src/tree_shake/mod.rs index c72b11ecfc1ab..c68a2b747eeeb 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/mod.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/mod.rs @@ -1,13 +1,16 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Write}; use anyhow::{bail, Result}; use indexmap::IndexSet; use rustc_hash::FxHashMap; use swc_core::{ common::{util::take::Take, SyntaxContext, DUMMY_SP, GLOBALS}, - ecma::ast::{ - ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, ModuleExportName, - ModuleItem, NamedExport, Program, + ecma::{ + ast::{ + ExportAll, ExportNamedSpecifier, Id, Ident, ImportDecl, Module, ModuleDecl, + ModuleExportName, ModuleItem, NamedExport, Program, + }, + codegen::{text_writer::JsWriter, Emitter}, }, }; use turbo_tasks::{RcStr, ValueToString, Vc}; @@ -21,7 +24,6 @@ use crate::{analyzer::graph::EvalContext, parse::ParseResult, EcmascriptModuleAs pub mod asset; pub mod chunk_item; -mod cjs_finder; mod graph; pub mod merge; #[cfg(test)] @@ -110,6 +112,10 @@ impl Analyzer<'_> { for id in item.var_decls.iter() { let state = self.vars.entry(id.clone()).or_default(); + if state.declarator.is_none() { + state.declarator = Some(item_id.clone()); + } + if item.is_hoisted { state.last_writes.push(item_id.clone()); } else { @@ -171,7 +177,7 @@ impl Analyzer<'_> { if let Some(declarator) = &state.declarator { if declarator != item_id { // A write also depends on the declaration. - self.g.add_weak_deps(item_id, [declarator].iter().copied()); + self.g.add_strong_deps(item_id, [declarator]); } } } @@ -256,6 +262,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_strong_deps(item_id, state.last_writes.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A read also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // For each var in EVENTUAL_WRITE_VARS: @@ -266,6 +279,13 @@ impl Analyzer<'_> { let state = get_var(&self.vars, id); self.g.add_weak_deps(item_id, state.last_reads.iter()); + + if let Some(declarator) = &state.declarator { + if declarator != item_id { + // A write also depends on the declaration. + self.g.add_strong_deps(item_id, [declarator]); + } + } } // (no state update happens, since this is only triggered by @@ -302,6 +322,7 @@ impl Analyzer<'_> { pub(crate) enum Key { ModuleEvaluation, Export(RcStr), + Exports, } /// Converts [Vc] to the index. @@ -312,9 +333,9 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result let key = match &*part { ModulePart::Evaluation => Key::ModuleEvaluation, ModulePart::Export(export) => Key::Export(export.await?.as_str().into()), + ModulePart::Exports => Key::Exports, ModulePart::Internal(part_id) => return Ok(*part_id), ModulePart::Locals - | ModulePart::Exports | ModulePart::Facade | ModulePart::RenamedExport { .. } | ModulePart::RenamedNamespace { .. } => { @@ -322,23 +343,64 @@ async fn get_part_id(result: &SplitResult, part: Vc) -> Result } }; - let entrypoints = match &result { - SplitResult::Ok { entrypoints, .. } => entrypoints, - _ => bail!("split failed"), + let SplitResult::Ok { + entrypoints, + modules, + .. + } = &result + else { + bail!("split failed") }; - let part_id = match entrypoints.get(&key) { - Some(id) => *id, - None => { - bail!( - "could not find part id for module part {:?} in {:?}", - key, - entrypoints - ) + if let Some(id) = entrypoints.get(&key) { + return Ok(*id); + } + + // This is required to handle `export * from 'foo'` + if let ModulePart::Export(..) = &*part { + if let Some(&v) = entrypoints.get(&Key::Exports) { + return Ok(v); } - }; + } - Ok(part_id) + let mut dump = String::new(); + + for (idx, m) in modules.iter().enumerate() { + let ParseResult::Ok { + program, + source_map, + .. + } = &*m.await? + else { + bail!("failed to get module") + }; + + { + let mut buf = vec![]; + + { + let wr = JsWriter::new(Default::default(), "\n", &mut buf, None); + + let mut emitter = Emitter { + cfg: Default::default(), + comments: None, + cm: source_map.clone(), + wr, + }; + + emitter.emit_program(program).unwrap(); + } + let code = String::from_utf8(buf).unwrap(); + + writeln!(dump, "# Module #{idx}:\n{code}\n\n\n")?; + } + } + + bail!( + "could not find part id for module part {:?} in {:?}\n\nModule dump:\n{dump}", + key, + entrypoints + ) } #[turbo_tasks::value(shared, serialization = "none", eq = "manual")] @@ -355,6 +417,9 @@ pub(crate) enum SplitResult { #[turbo_tasks(trace_ignore)] deps: FxHashMap>, + + #[turbo_tasks(debug_ignore, trace_ignore)] + star_reexports: Vec, }, Failed { parse_result: Vc, @@ -372,7 +437,12 @@ impl PartialEq for SplitResult { #[turbo_tasks::function] pub(super) async fn split_module(asset: Vc) -> Result> { - Ok(split(asset.source().ident(), asset.source(), asset.parse())) + Ok(split( + asset.source().ident(), + asset.source(), + asset.parse(), + asset.options().await?.special_exports, + )) } #[turbo_tasks::function] @@ -380,6 +450,7 @@ pub(super) async fn split( ident: Vc, source: Vc>, parsed: Vc, + special_exports: Vc>, ) -> Result> { let parse_result = parsed.await?; @@ -393,7 +464,7 @@ pub(super) async fn split( .. } => { // If the script file is a common js file, we cannot split the module - if cjs_finder::contains_cjs(program) { + if util::should_skip_tree_shaking(program, &special_exports.await?) { return Ok(SplitResult::Failed { parse_result: parsed, } @@ -419,6 +490,7 @@ pub(super) async fn split( entrypoints, part_deps, modules, + star_reexports, } = dep_graph.split_module(&items); assert_ne!(modules.len(), 0, "modules.len() == 0;\nModule: {module:?}",); @@ -431,7 +503,6 @@ pub(super) async fn split( modules.len() ); } - let modules = modules .into_iter() .map(|module| { @@ -440,7 +511,6 @@ pub(super) async fn split( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - false, Some(source), ); @@ -459,6 +529,7 @@ pub(super) async fn split( entrypoints, deps: part_deps, modules, + star_reexports, } .cell()) } @@ -483,6 +554,7 @@ pub(super) async fn part_of_module( modules, entrypoints, deps, + star_reexports, .. } => { debug_assert_ne!(modules.len(), 0, "modules.len() == 0"); @@ -552,14 +624,18 @@ pub(super) async fn part_of_module( }, ))); + module.body.extend(star_reexports.iter().map(|export_all| { + ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) + })); + let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); + return Ok(ParseResult::Ok { program, comments: comments.clone(), @@ -624,12 +700,15 @@ pub(super) async fn part_of_module( ))); } + module.body.extend(star_reexports.iter().map(|export_all| { + ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all.clone())) + })); + let program = Program::Module(module); let eval_context = EvalContext::new( &program, eval_context.unresolved_mark, eval_context.top_level_mark, - true, None, ); return Ok(ParseResult::Ok { diff --git a/crates/turbopack-ecmascript/src/tree_shake/tests.rs b/crates/turbopack-ecmascript/src/tree_shake/tests.rs index 12e443b59aafa..12c3d572b0961 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/tests.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/tests.rs @@ -163,7 +163,7 @@ fn run(input: PathBuf) { writeln!(s, "# Phase 4").unwrap(); writeln!(s, "```mermaid\n{}```", render_graph(&item_ids, analyzer.g)).unwrap(); - let mut condensed = analyzer.g.finalize(analyzer.items); + let mut condensed = analyzer.g.finalize(); writeln!(s, "# Final").unwrap(); writeln!( diff --git a/crates/turbopack-ecmascript/src/tree_shake/util.rs b/crates/turbopack-ecmascript/src/tree_shake/util.rs index 79224046c7dd7..76f0d2d0be46d 100644 --- a/crates/turbopack-ecmascript/src/tree_shake/util.rs +++ b/crates/turbopack-ecmascript/src/tree_shake/util.rs @@ -1,17 +1,22 @@ use std::hash::BuildHasherDefault; use indexmap::IndexSet; -use rustc_hash::FxHasher; +use rustc_hash::{FxHashSet, FxHasher}; use swc_core::{ common::SyntaxContext, ecma::{ ast::{ - AssignTarget, BlockStmtOrExpr, Constructor, ExportNamedSpecifier, ExportSpecifier, - Expr, Function, Id, Ident, MemberExpr, MemberProp, NamedExport, Pat, PropName, + ArrowExpr, AssignPatProp, AssignTarget, ClassDecl, ClassExpr, Constructor, DefaultDecl, + ExportDefaultDecl, ExportNamedSpecifier, ExportSpecifier, Expr, FnDecl, FnExpr, + Function, Id, Ident, ImportSpecifier, MemberExpr, MemberProp, NamedExport, Param, Pat, + Prop, PropName, VarDeclarator, *, }, visit::{noop_visit_type, Visit, VisitWith}, }, }; +use turbo_tasks::RcStr; + +use crate::TURBOPACK_HELPER; #[derive(Debug, Default, Clone, Copy)] enum Mode { @@ -27,10 +32,11 @@ struct Target { } /// A visitor which collects variables which are read or written. -#[derive(Default)] -pub(crate) struct IdentUsageCollector { +pub(crate) struct IdentUsageCollector<'a> { unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, + vars: Vars, is_nested: bool, @@ -39,7 +45,7 @@ pub(crate) struct IdentUsageCollector { mode: Option, } -impl IdentUsageCollector { +impl IdentUsageCollector<'_> { fn with_nested(&mut self, f: impl FnOnce(&mut Self)) { if !self.target.eventual { return; @@ -58,17 +64,21 @@ impl IdentUsageCollector { } } -impl Visit for IdentUsageCollector { +impl Visit for IdentUsageCollector<'_> { fn visit_assign_target(&mut self, n: &AssignTarget) { self.with_mode(Some(Mode::Write), |this| { n.visit_children_with(this); }) } - fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) { + fn visit_class(&mut self, n: &Class) { + n.super_class.visit_with(self); + self.with_nested(|this| { - n.visit_children_with(this); - }) + n.decorators.visit_with(this); + + n.body.visit_with(this); + }); } fn visit_constructor(&mut self, n: &Constructor) { @@ -92,7 +102,6 @@ impl Visit for IdentUsageCollector { e.visit_children_with(this); }) } - fn visit_function(&mut self, n: &Function) { self.with_nested(|this| { n.visit_children_with(this); @@ -114,6 +123,7 @@ impl Visit for IdentUsageCollector { if n.span.ctxt != self.unresolved && n.span.ctxt != self.top_level && n.span.ctxt != SyntaxContext::empty() + && !self.top_level_vars.contains(&n.to_id()) { return; } @@ -162,6 +172,16 @@ impl Visit for IdentUsageCollector { }) } + fn visit_prop(&mut self, n: &Prop) { + match n { + Prop::Shorthand(v) => { + self.with_mode(None, |c| c.visit_ident(v)); + } + + _ => n.visit_children_with(self), + } + } + fn visit_prop_name(&mut self, n: &PropName) { if let PropName::Computed(..) = n { n.visit_children_with(self); @@ -186,18 +206,26 @@ pub(crate) struct Vars { /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_captured_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_captured_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: false, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -207,18 +235,26 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by(n: &N, unresolved: SyntaxContext, top_level: SyntaxContext) -> Vars +pub(crate) fn ids_used_by<'a, N>( + n: &N, + unresolved: SyntaxContext, + top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, +) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: true, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars @@ -228,23 +264,273 @@ where /// /// Note: This functions accept `SyntaxContext` to filter out variables which /// are not interesting. We only need to analyze top-level variables. -pub(crate) fn ids_used_by_ignoring_nested( +pub(crate) fn ids_used_by_ignoring_nested<'a, N>( n: &N, unresolved: SyntaxContext, top_level: SyntaxContext, + top_level_vars: &'a FxHashSet, ) -> Vars where - N: VisitWith, + N: VisitWith>, { let mut v = IdentUsageCollector { unresolved, top_level, + top_level_vars, target: Target { direct: true, eventual: false, }, - ..Default::default() + vars: Vars::default(), + is_nested: false, + mode: None, }; n.visit_with(&mut v); v.vars } + +pub struct TopLevelBindingCollector { + bindings: FxHashSet, + is_pat_decl: bool, +} + +impl TopLevelBindingCollector { + fn add(&mut self, i: &Ident) { + self.bindings.insert(i.to_id()); + } +} + +impl Visit for TopLevelBindingCollector { + noop_visit_type!(); + + fn visit_arrow_expr(&mut self, _: &ArrowExpr) {} + + fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) { + node.value.visit_with(self); + + if self.is_pat_decl { + self.add(&node.key); + } + } + + fn visit_class_decl(&mut self, node: &ClassDecl) { + self.add(&node.ident); + } + + fn visit_expr(&mut self, _: &Expr) {} + + fn visit_export_default_decl(&mut self, e: &ExportDefaultDecl) { + match &e.decl { + DefaultDecl::Class(ClassExpr { + ident: Some(ident), .. + }) => { + self.add(ident); + } + DefaultDecl::Fn(FnExpr { + ident: Some(ident), + function: f, + }) if f.body.is_some() => { + self.add(ident); + } + _ => {} + } + } + + fn visit_fn_decl(&mut self, node: &FnDecl) { + self.add(&node.ident); + } + + fn visit_import_specifier(&mut self, node: &ImportSpecifier) { + match node { + ImportSpecifier::Named(s) => self.add(&s.local), + ImportSpecifier::Default(s) => { + self.add(&s.local); + } + ImportSpecifier::Namespace(s) => { + self.add(&s.local); + } + } + } + + fn visit_param(&mut self, node: &Param) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.visit_children_with(self); + self.is_pat_decl = old; + } + + fn visit_pat(&mut self, node: &Pat) { + node.visit_children_with(self); + + if self.is_pat_decl { + if let Pat::Ident(i) = node { + self.add(&i.id) + } + } + } + + fn visit_var_declarator(&mut self, node: &VarDeclarator) { + let old = self.is_pat_decl; + self.is_pat_decl = true; + node.name.visit_with(self); + + self.is_pat_decl = false; + node.init.visit_with(self); + self.is_pat_decl = old; + } +} + +/// Collects binding identifiers. +pub fn collect_top_level_decls(n: &N) -> FxHashSet +where + N: VisitWith, +{ + let mut v = TopLevelBindingCollector { + bindings: Default::default(), + is_pat_decl: false, + }; + n.visit_with(&mut v); + v.bindings +} + +pub fn should_skip_tree_shaking(m: &Program, special_exports: &[RcStr]) -> bool { + if let Program::Module(m) = m { + for item in m.body.iter() { + match item { + // Skip turbopack helpers. + ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { + with, specifiers, .. + })) => { + if let Some(with) = with.as_deref().and_then(|v| v.as_import_with()) { + for item in with.values.iter() { + if item.key.sym == *TURBOPACK_HELPER { + // Skip tree shaking if the import is from turbopack-helper + return true; + } + } + } + + // TODO(PACK-3150): Tree shaking has a bug related to ModuleExportName::Str + for s in specifiers.iter() { + if let ImportSpecifier::Named(is) = s { + if matches!(is.imported, Some(ModuleExportName::Str(..))) { + return true; + } + } + } + } + + // Tree shaking has a bug related to ModuleExportName::Str + ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport { + src: Some(..), + specifiers, + .. + })) => { + for s in specifiers { + if let ExportSpecifier::Named(es) = s { + if matches!(es.orig, ModuleExportName::Str(..)) + || matches!(es.exported, Some(ModuleExportName::Str(..))) + { + return true; + } + } + } + } + + // Skip sever actions + ModuleItem::Stmt(Stmt::Expr(ExprStmt { + expr: box Expr::Lit(Lit::Str(Str { value, .. })), + .. + })) => { + if value == "use server" { + return true; + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Var(box VarDecl { decls, .. }), + .. + })) => { + for decl in decls { + if let Pat::Ident(name) = &decl.name { + if special_exports.iter().any(|s| **s == *name.sym) { + return true; + } + } + } + } + + // Skip special reexports that are recognized by next.js + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: Decl::Fn(f), + .. + })) => { + if special_exports.iter().any(|s| **s == *f.ident.sym) { + return true; + } + } + + _ => {} + } + } + + let mut visitor = ShouldSkip::default(); + m.visit_with(&mut visitor); + if visitor.skip { + return true; + } + + for item in m.body.iter() { + if item.is_module_decl() { + return false; + } + } + } + + true +} + +#[derive(Default)] +struct ShouldSkip { + skip: bool, +} + +impl Visit for ShouldSkip { + fn visit_expr_stmt(&mut self, e: &ExprStmt) { + e.visit_children_with(self); + + if let Expr::Lit(Lit::Str(Str { value, .. })) = &*e.expr { + if value == "use server" { + self.skip = true; + } + } + } + + fn visit_stmt(&mut self, n: &Stmt) { + if self.skip { + return; + } + + n.visit_children_with(self); + } + + fn visit_await_expr(&mut self, n: &AwaitExpr) { + // __turbopack_wasm_module__ is not analyzable because __turbopack_wasm_module__ + // is injected global. + if let Expr::Call(CallExpr { + callee: Callee::Expr(expr), + .. + }) = &*n.arg + { + if expr.is_ident_ref_to("__turbopack_wasm_module__") { + self.skip = true; + return; + } + } + + n.visit_children_with(self); + } + + noop_visit_type!(); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md index 66a2680795ce9..812f1ef7c0759 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,68 +334,92 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(0, ImportBinding(0)), ItemId(7, Normal)]"]; - N1["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; - N2["Items: [ItemId(Export(("foo", #2), "foo"))]"]; - N3["Items: [ItemId(Export(("external1", #2), "external1")), ItemId(10, Normal)]"]; - N4["Items: [ItemId(Export(("external2", #2), "external2")), ItemId(11, Normal)]"]; - N5["Items: [ItemId(1, VarDeclarator(0))]"]; - N6["Items: [ItemId(2, VarDeclarator(0))]"]; - N7["Items: [ItemId(3, VarDeclarator(0)), ItemId(4, Normal)]"]; - N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N9["Items: [ItemId(6, Normal)]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(9, Normal)]"]; - N0 --> N8; - N0 --> N10; - N0 --> N9; - N0 --> N6; - N1 --> N9; - N1 --> N5; - N2 --> N6; - N3 --> N10; - N3 --> N9; - N4 --> N6; - N4 --> N8; - N4 --> N1; - N6 --> N5; - N7 --> N5; + N0["Items: [ItemId(0, ImportBinding(0))]"]; + N1["Items: [ItemId(0, ImportOfModule)]"]; + N2["Items: [ItemId(3, VarDeclarator(0))]"]; + N3["Items: [ItemId(1, VarDeclarator(0))]"]; + N4["Items: [ItemId(2, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("foo", #2), "foo"))]"]; + N6["Items: [ItemId(4, Normal)]"]; + N7["Items: [ItemId(5, VarDeclarator(0))]"]; + N8["Items: [ItemId(6, Normal)]"]; + N9["Items: [ItemId(9, Normal)]"]; + N10["Items: [ItemId(10, Normal)]"]; + N11["Items: [ItemId(Export(("external1", #2), "external1"))]"]; + N12["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; + N13["Items: [ItemId(11, Normal)]"]; + N14["Items: [ItemId(Export(("external2", #2), "external2"))]"]; + N15["Items: [ItemId(7, Normal)]"]; + N16["Items: [ItemId(ModuleEvaluation)]"]; + N17["Items: [ItemId(8, Normal)]"]; + N4 --> N3; + N6 --> N2; + N6 --> N3; + N6 -.-> N4; N7 --> N6; - N8 --> N7; - N8 --> N5; - N9 --> N7; - N9 --> N5; - N9 --> N6; + N7 --> N3; + N8 --> N6; + N8 --> N3; + N8 -.-> N4; + N8 -.-> N7; + N15 --> N7; + N15 --> N1; + N15 -.-> N0; + N15 -.-> N8; + N15 -.-> N4; + N15 -.-> N9; + N17 --> N7; + N17 -.-> N15; + N12 --> N8; + N12 --> N3; + N5 --> N4; + N11 --> N10; + N14 --> N13; + N9 --> N0; N9 --> N8; + N9 --> N3; N10 --> N9; + N10 --> N8; + N10 --> N3; + N13 -.-> N4; + N13 -.-> N7; + N13 -.-> N12; + N13 --> N3; + N16 --> N1; + N16 --> N15; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 16, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 5, Export( "foobar", - ): 1, + ): 12, Export( "external2", - ): 4, + ): 14, } ``` @@ -400,22 +427,7 @@ graph TD # Modules (dev) ## Part 0 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -"module evaluation"; -import "module"; import { upper } from "module"; -console.log(foobarCopy); export { upper } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -423,182 +435,314 @@ export { upper } from "__TURBOPACK_VAR__" assert { ``` ## Part 1 ```js +import "module"; + +``` +## Part 2 +```js +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 +}; +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { foobar }; ``` -## Part 2 +## Part 5 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 4 }; export { foo }; ``` -## Part 3 +## Part 6 ```js -import { internal } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 }; -export { external1 }; -function external1() { - return internal() + foobar; -} -export { external1 } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +foobar += bar; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 8 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +foobar += "foo"; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 1 + __turbopack_part__: 3 }; -export { external2 }; -function external2() { - foobar += "."; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function internal() { + return upper(foobar); } -export { external2 } from "__TURBOPACK_VAR__" assert { +export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 10 ```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { internal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +function external1() { + return internal() + foobar; +} +export { external1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 6 +## Part 11 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { external1 }; ``` -## Part 7 +## Part 12 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +export { foobar }; ``` -## Part 8 +## Part 13 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -let foobarCopy = foobar; -export { foobarCopy } from "__TURBOPACK_VAR__" assert { +function external2() { + foobar += "."; +} +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 9 +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { external2 }; + +``` +## Part 15 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -foobar += "foo"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +console.log(foobarCopy); ``` -## Part 10 +## Part 16 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { upper } from "module"; -function internal() { - return upper(foobar); -} -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 1 }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 }; +"module evaluation"; ``` -## Merged (module eval) +## Part 17 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 15 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +foobarCopy += "Unused"; + +``` +## Part 18 +```js +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" }; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 15 }; -import "module"; -import { upper } from "module"; "module evaluation"; -console.log(foobarCopy); -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 15, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 17, Export( "foobar", - ): 1, + ): 8, Export( "external2", - ): 4, + ): 5, } ``` @@ -606,124 +750,268 @@ export { upper } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js +import { upper } from "module"; +export { upper } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "module"; + +``` +## Part 2 +```js +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -"module evaluation"; -import "module"; -let foobarCopy = foobar; -console.log(foobarCopy); -export { foobarCopy } from "__TURBOPACK_VAR__" assert { +function external2() { + foobar += "."; +} +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 1 +## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 4 +}; +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { external2 }; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -export { foobar }; +foobar += bar; ``` -## Part 2 +## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -export { foo }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +foobar += "foo"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { foobar }; ``` -## Part 3 +## Part 9 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -export { external1 }; -import { upper } from "module"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; function internal() { return upper(foobar); } +export { internal } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { internal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; function external1() { return internal() + foobar; } -export { upper } from "__TURBOPACK_VAR__" assert { +export { external1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; -export { external1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { external1 }; ``` -## Part 4 +## Part 12 ```js -export { external2 }; -function external2() { - foobar += "."; -} -export { external2 } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 13 ```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 }; +foobarCopy += "Unused"; ``` -## Part 6 +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +console.log(foobarCopy); + +``` +## Part 15 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 17 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 16 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { foo }; + +``` +## Part 18 +```js +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" }; -foobar += "foo"; ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 14 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -import "module"; "module evaluation"; -let foobarCopy = foobar; -console.log(foobarCopy); -export { foobarCopy } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md index d121155292e1d..a8a32cb90bbd2 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/2/output.md @@ -292,11 +292,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; ``` # Phase 4 ```mermaid @@ -352,11 +355,14 @@ graph TD Item19 --> Item14; Item3 --> Item13; Item3 --> Item10; + Item3 --> Item5; Item13 --> Item4; Item13 --> Item10; + Item13 --> Item5; Item14 -.-> Item6; Item14 -.-> Item9; Item14 -.-> Item17; + Item14 --> Item5; Item15 --> Item1; Item15 --> Item2; Item15 --> Item11; @@ -364,57 +370,82 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(1, ImportOfModule), ItemId(1, ImportBinding(0)), ItemId(8, Normal), ItemId(12, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("external1", #2), "external1")), ItemId(0, Normal)]"]; - N2["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; - N3["Items: [ItemId(Export(("foo", #2), "foo"))]"]; - N4["Items: [ItemId(Export(("external2", #2), "external2")), ItemId(11, Normal)]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N6["Items: [ItemId(3, VarDeclarator(0))]"]; - N7["Items: [ItemId(4, VarDeclarator(0)), ItemId(5, Normal)]"]; - N8["Items: [ItemId(6, VarDeclarator(0))]"]; - N9["Items: [ItemId(7, Normal)]"]; - N10["Items: [ItemId(1, ImportBinding(0)), ItemId(10, Normal)]"]; - N0 --> N8; - N0 --> N10; - N0 --> N9; - N0 --> N6; - N1 --> N10; - N1 --> N9; - N2 --> N9; - N2 --> N5; - N3 --> N6; - N4 --> N6; - N4 --> N8; - N4 --> N2; + N0["Items: [ItemId(1, ImportBinding(0))]"]; + N1["Items: [ItemId(4, VarDeclarator(0))]"]; + N2["Items: [ItemId(2, VarDeclarator(0))]"]; + N3["Items: [ItemId(3, VarDeclarator(0))]"]; + N4["Items: [ItemId(Export(("foo", #2), "foo"))]"]; + N5["Items: [ItemId(5, Normal)]"]; + N6["Items: [ItemId(6, VarDeclarator(0))]"]; + N7["Items: [ItemId(7, Normal)]"]; + N8["Items: [ItemId(10, Normal)]"]; + N9["Items: [ItemId(0, Normal)]"]; + N10["Items: [ItemId(Export(("external1", #2), "external1"))]"]; + N11["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; + N12["Items: [ItemId(11, Normal)]"]; + N13["Items: [ItemId(Export(("external2", #2), "external2"))]"]; + N14["Items: [ItemId(1, ImportOfModule)]"]; + N15["Items: [ItemId(12, ImportOfModule)]"]; + N16["Items: [ItemId(8, Normal)]"]; + N17["Items: [ItemId(ModuleEvaluation)]"]; + N18["Items: [ItemId(9, Normal)]"]; + N15 --> N14; + N3 --> N2; + N5 --> N1; + N5 --> N2; + N5 -.-> N3; N6 --> N5; + N6 --> N2; N7 --> N5; - N7 --> N6; - N8 --> N7; - N8 --> N5; - N9 --> N7; - N9 --> N5; - N9 --> N6; - N9 --> N8; + N7 --> N2; + N7 -.-> N3; + N7 -.-> N6; + N16 --> N6; + N16 --> N14; + N16 --> N15; + N16 -.-> N8; + N16 -.-> N7; + N16 -.-> N3; + N16 -.-> N0; + N18 --> N6; + N18 -.-> N16; N10 --> N9; + N11 --> N7; + N11 --> N2; + N4 --> N3; + N13 --> N12; + N9 --> N8; + N9 --> N7; + N9 --> N2; + N8 --> N0; + N8 --> N7; + N8 --> N2; + N12 -.-> N3; + N12 -.-> N6; + N12 -.-> N11; + N12 --> N2; + N17 --> N14; + N17 --> N15; + N17 --> N16; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 17, Export( "external1", - ): 1, + ): 10, + Exports: 19, Export( "foo", - ): 3, + ): 4, Export( "foobar", - ): 2, + ): 11, Export( "external2", - ): 4, + ): 13, } ``` @@ -422,23 +453,7 @@ graph TD # Modules (dev) ## Part 0 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -"module evaluation"; -import "module"; import { upper } from "module"; -console.log(foobarCopy); -import "other"; export { upper } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -446,104 +461,123 @@ export { upper } from "__TURBOPACK_VAR__" assert { ``` ## Part 1 ```js -import { internal } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -export { external1 }; -function external1() { - return internal() + foobar; -} -export { external1 } from "__TURBOPACK_VAR__" assert { +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 2 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 +}; +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { foobar }; ``` -## Part 3 +## Part 4 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; export { foo }; ``` -## Part 4 +## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 3 }; -export { external2 }; -function external2() { - foobar += "."; -} -export { external2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; - -``` -## Part 5 -```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; +foobar += bar; ``` ## Part 6 ```js -import { foobar } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 7 ```js -import { foobar } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; +foobar += "foo"; ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; -let foobarCopy = foobar; -export { foobarCopy } from "__TURBOPACK_VAR__" assert { +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function internal() { + return upper(foobar); +} +export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -551,18 +585,26 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { ## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { internal } from "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -foobar += "foo"; +function external1() { + return internal() + foobar; +} +export { external1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 10 @@ -570,56 +612,177 @@ foobar += "foo"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import { upper } from "module"; -function internal() { - return upper(foobar); +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { external1 }; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { foobar }; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function external2() { + foobar += "."; } -export { upper } from "__TURBOPACK_VAR__" assert { +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 }; +export { external2 }; ``` -## Merged (module eval) +## Part 14 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { +import "module"; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "other"; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -import "module"; -import { upper } from "module"; -import "other"; -"module evaluation"; console.log(foobarCopy); -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +"module evaluation"; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +foobarCopy += "Unused"; + +``` +## Part 19 +```js +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" }; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +"module evaluation"; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 18, Export( "external1", - ): 1, + ): 10, + Exports: 19, Export( "foo", - ): 3, + ): 14, Export( "foobar", - ): 2, + ): 7, Export( "external2", ): 4, @@ -630,126 +793,285 @@ export { upper } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 +import { upper } from "module"; +export { upper } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + +``` +## Part 1 +```js +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; -import "module"; -let foobarCopy = foobar; -console.log(foobarCopy); -import "other"; -export { foobarCopy } from "__TURBOPACK_VAR__" assert { + +``` +## Part 2 +```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 1 +## Part 3 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 2 }; -export { external1 }; -function external1() { - return internal() + foobar; -} -import { upper } from "module"; -function internal() { - return upper(foobar); +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function external2() { + foobar += "."; } -export { external1 } from "__TURBOPACK_VAR__" assert { +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +export { external2 }; ``` -## Part 2 +## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +foobar += bar; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +foobar += "foo"; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; export { foobar }; ``` -## Part 3 +## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; -export { foo }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function internal() { + return upper(foobar); +} +export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 9 ```js -export { external2 }; -function external2() { - foobar += "."; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { internal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +function external1() { + return internal() + foobar; } -export { external2 } from "__TURBOPACK_VAR__" assert { +export { external1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 10 ```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { external1 }; ``` -## Part 6 +## Part 11 ```js -import { foobar } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 12 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 11 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 }; -foobar += "foo"; +foobarCopy += "Unused"; ``` -## Merged (module eval) +## Part 13 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { foo }; + +``` +## Part 15 +```js import "module"; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; import "other"; -"module evaluation"; -let foobarCopy = foobar; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; console.log(foobarCopy); -export { foobarCopy } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +"module evaluation"; + +``` +## Part 19 +```js +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" }; ``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md index eefa42f0d0b7a..87f30191cdae3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/3/output.md @@ -320,41 +320,54 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(9, Normal), ItemId(10, Normal)]"]; - N1["Items: [ItemId(Export(("c1_1", #2), "c1_1"))]"]; - N2["Items: [ItemId(Export(("c1_3", #2), "c1_3"))]"]; - N3["Items: [ItemId(Export(("c2_2", #2), "c2_2"))]"]; - N4["Items: [ItemId(3, Normal), ItemId(4, Normal), ItemId(5, Normal)]"]; - N5["Items: [ItemId(6, Normal), ItemId(7, Normal), ItemId(8, Normal)]"]; - N6["Items: [ItemId(0, Normal)]"]; - N7["Items: [ItemId(1, Normal)]"]; - N8["Items: [ItemId(2, Normal)]"]; - N0 --> N4; - N0 --> N6; - N0 --> N7; - N0 --> N5; - N0 --> N8; - N1 --> N4; - N2 --> N4; - N3 --> N5; - N4 --> N6; - N4 --> N7; - N5 --> N8; + N0["Items: [ItemId(2, Normal)]"]; + N1["Items: [ItemId(6, Normal), ItemId(7, Normal), ItemId(8, Normal)]"]; + N2["Items: [ItemId(Export(("c2_2", #2), "c2_2"))]"]; + N3["Items: [ItemId(1, Normal)]"]; + N4["Items: [ItemId(0, Normal)]"]; + N5["Items: [ItemId(3, Normal), ItemId(4, Normal), ItemId(5, Normal)]"]; + N6["Items: [ItemId(Export(("c1_1", #2), "c1_1"))]"]; + N7["Items: [ItemId(Export(("c1_3", #2), "c1_3"))]"]; + N8["Items: [ItemId(9, Normal)]"]; + N9["Items: [ItemId(10, Normal)]"]; + N10["Items: [ItemId(ModuleEvaluation)]"]; + N8 -.-> N5; + N8 -.-> N4; + N8 -.-> N3; + N8 -.-> N1; + N8 -.-> N0; + N9 -.-> N1; + N9 --> N8; + N9 -.-> N5; + N9 -.-> N4; + N9 -.-> N3; + N9 -.-> N0; + N6 --> N5; + N7 --> N5; + N2 --> N1; + N5 --> N5; + N5 --> N4; + N5 --> N3; + N1 --> N1; + N1 --> N0; + N10 --> N8; + N10 --> N9; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + Export( + "c2_2", + ): 2, Export( "c1_1", - ): 1, + ): 6, Export( "c1_3", - ): 2, - Export( - "c2_2", - ): 3, + ): 7, + ModuleEvaluation: 10, + Exports: 11, } ``` @@ -362,57 +375,86 @@ graph TD # Modules (dev) ## Part 0 ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +function d3() {} +export { d3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; + +``` +## Part 1 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 0 }; -import { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { d3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +function c2_1() { + return c2_2(d3); +} +function c2_2() { + return c2_3(); +} +function c2_3() { + return c2_1(); +} +export { c2_1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; -c1_3(); -c2_2(); - -``` -## Part 1 -```js -import { c1_1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +export { c2_2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { c2_3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { c1_1 }; ``` ## Part 2 ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { c1_3 }; +import { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +export { c2_2 }; ``` ## Part 3 ```js -import { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +function d2() {} +export { d2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { c2_2 }; ``` ## Part 4 ```js -import { d1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 +function d1() {} +export { d1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; import { d2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 3 +}; +import { d1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; function c1_1() { return c1_2(); @@ -433,92 +475,128 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -``` -## Part 5 -```js -import { d3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -function c2_1() { - return c2_2(d3); -} -function c2_2() { - return c2_3(); -} -function c2_3() { - return c2_1(); -} -export { c2_1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { c2_2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { c2_3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; - ``` ## Part 6 ```js -function d1() {} -export { d1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; +import { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { c1_1 }; ``` ## Part 7 ```js -function d2() {} -export { d2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; +import { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { c1_3 }; ``` ## Part 8 ```js -function d3() {} -export { d3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +c1_3(); ``` -## Merged (module eval) +## Part 9 ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 0 }; import { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 +}; +c2_2(); + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +"module evaluation"; + +``` +## Part 11 +```js +export { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c2_2" +}; +export { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_1" +}; +export { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_3" }; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; "module evaluation"; -c1_3(); -c2_2(); ``` # Entrypoints ``` { - ModuleEvaluation: 0, + Export( + "c2_2", + ): 2, Export( "c1_1", - ): 1, + ): 6, Export( "c1_3", - ): 2, - Export( - "c2_2", - ): 3, + ): 7, + ModuleEvaluation: 10, + Exports: 11, } ``` @@ -526,44 +604,87 @@ c2_2(); # Modules (prod) ## Part 0 ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +function d3() {} +export { d3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; -c1_3(); -c2_2(); ``` ## Part 1 ```js -import { c1_1 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { d3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function c2_1() { + return c2_2(d3); +} +function c2_2() { + return c2_3(); +} +function c2_3() { + return c2_1(); +} +export { c2_1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { c2_2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { c2_3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { c1_1 }; ``` ## Part 2 ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { c1_3 }; +import { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +export { c2_2 }; ``` ## Part 3 ```js -import { c2_2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +function d2() {} +export { d2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { c2_2 }; ``` ## Part 4 ```js -function d2() {} +function d1() {} +export { d1 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { d2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { d1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; function c1_1() { return c1_2(); } @@ -573,9 +694,6 @@ function c1_2() { function c1_3() { return c1_1(d2); } -export { d2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { c1_1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -587,63 +705,111 @@ export { c1_3 } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 5 +## Part 6 ```js -function c2_1() { - return c2_2(d3); -} -function c2_2() { - return c2_3(); -} -function c2_3() { - return c2_1(); -} -export { c2_1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { c2_2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { c2_3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; +export { c1_1 }; ``` -## Merged (module eval) +## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 5 }; -import { c2_2 } from "__TURBOPACK_PART__" assert { +export { c1_3 }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { c1_3 } from "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -"module evaluation"; c1_3(); + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; c2_2(); +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 11 +```js +export { c2_2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c2_2" +}; +export { c1_1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_1" +}; +export { c1_3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export c1_3" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + ``` # Entrypoints ``` { - ModuleEvaluation: 0, + Export( + "c2_2", + ): 2, Export( "c1_1", - ): 1, + ): 6, Export( "c1_3", - ): 2, - Export( - "c2_2", - ): 3, + ): 7, + ModuleEvaluation: 10, + Exports: 11, } ``` ## Merged (c1_3) ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; export { c1_3 }; @@ -652,28 +818,29 @@ export { c1_3 }; ``` { - ModuleEvaluation: 0, + Export( + "c2_2", + ): 2, Export( "c1_1", - ): 1, + ): 6, Export( "c1_3", - ): 2, - Export( - "c2_2", - ): 3, + ): 7, + ModuleEvaluation: 10, + Exports: 11, } ``` ## Merged (c1_3,c2_2) ```js -import { c1_3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { c2_2 } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; export { c1_3 }; export { c2_2 }; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js new file mode 100644 index 0000000000000..fd849eeea7373 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/input.js @@ -0,0 +1,34 @@ +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; +import Document, { Html, Head, Main, NextScript } from 'next/document'; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +export default MyDocument; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md new file mode 100644 index 0000000000000..41eef0a2bed87 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/amphtml-document/output.md @@ -0,0 +1,800 @@ +# Items + +Count: 14 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsx` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_jsxs` + +## Item 4: Stmt 0, `ImportBinding(2)` + +```js +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; + +``` + +- Hoisted +- Declares: `_Fragment` + +## Item 5: Stmt 1, `ImportOfModule` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 1, `ImportBinding(0)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Document` + +## Item 7: Stmt 1, `ImportBinding(1)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Html` + +## Item 8: Stmt 1, `ImportBinding(2)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Head` + +## Item 9: Stmt 1, `ImportBinding(3)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `Main` + +## Item 10: Stmt 1, `ImportBinding(4)` + +```js +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +``` + +- Hoisted +- Declares: `NextScript` + +## Item 11: Stmt 2, `Normal` + +```js +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} + +``` + +- Declares: `MyDocument` +- Reads: `Document`, `_jsxs`, `_Fragment`, `_jsx`, `Html`, `Head`, `Main`, `NextScript` +- Write: `Document`, `MyDocument` + +## Item 12: Stmt 3, `Normal` + +```js +export default MyDocument; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `MyDocument` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item5; + Item2; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export default"]; + Item2 --> Item1; + Item11 --> Item6; + Item11 --> Item4; + Item11 --> Item5; + Item11 --> Item3; + Item11 --> Item7; + Item11 --> Item8; + Item11 --> Item9; + Item11 --> Item10; + Item12 --> Item11; + Item12 --> Item1; + Item12 --> Item2; + Item14 --> Item12; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item12; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, ImportBinding(4))]"]; + N1["Items: [ItemId(1, ImportBinding(3))]"]; + N2["Items: [ItemId(1, ImportBinding(2))]"]; + N3["Items: [ItemId(1, ImportBinding(1))]"]; + N4["Items: [ItemId(0, ImportBinding(0))]"]; + N5["Items: [ItemId(0, ImportBinding(2))]"]; + N6["Items: [ItemId(0, ImportBinding(1))]"]; + N7["Items: [ItemId(1, ImportBinding(0))]"]; + N8["Items: [ItemId(2, Normal)]"]; + N9["Items: [ItemId(0, ImportOfModule)]"]; + N10["Items: [ItemId(1, ImportOfModule)]"]; + N11["Items: [ItemId(3, Normal)]"]; + N12["Items: [ItemId(ModuleEvaluation)]"]; + N13["Items: [ItemId(Export(("__TURBOPACK__default__export__", #5), "default"))]"]; + N10 --> N9; + N8 --> N7; + N8 --> N6; + N8 --> N5; + N8 --> N4; + N8 --> N3; + N8 --> N2; + N8 --> N1; + N8 --> N0; + N11 --> N8; + N11 --> N9; + N11 --> N10; + N13 --> N11; + N12 --> N9; + N12 --> N10; + N12 --> N11; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 12, + Export( + "default", + ): 13, + Exports: 14, +} +``` + + +# Modules (dev) +## Part 0 +```js +import { NextScript } from 'next/document'; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { Main } from 'next/document'; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { Head } from 'next/document'; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { Html } from 'next/document'; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import { jsx as _jsx } from "react/jsx-runtime"; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { Fragment as _Fragment } from "react/jsx-runtime"; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import { jsxs as _jsxs } from "react/jsx-runtime"; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import Document from 'next/document'; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { Document } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { _jsxs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { _Fragment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { _jsx } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { Html } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { Head } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { Main } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { NextScript } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "react/jsx-runtime"; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import 'next/document'; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { MyDocument } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const __TURBOPACK__default__export__ = MyDocument; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +"module evaluation"; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 14 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 12, + Export( + "default", + ): 13, + Exports: 14, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { NextScript } from 'next/document'; +export { NextScript } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { Main } from 'next/document'; +export { Main } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { Head } from 'next/document'; +export { Head } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { Html } from 'next/document'; +export { Html } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import { jsx as _jsx } from "react/jsx-runtime"; +export { _jsx } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { Fragment as _Fragment } from "react/jsx-runtime"; +export { _Fragment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import { jsxs as _jsxs } from "react/jsx-runtime"; +export { _jsxs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import Document from 'next/document'; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { Document } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { _jsxs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { _Fragment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { _jsx } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { Html } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { Head } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { Main } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { NextScript } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: _jsxs(_Fragment, { + children: [ + initialProps.styles, + _jsx("style", { + dangerouslySetInnerHTML: { + __html: `html { background: hotpink; }` + } + }) + ] + }) + }; + } + render() { + return _jsxs(Html, { + children: [ + _jsx(Head, {}), + _jsxs("body", { + children: [ + _jsx(Main, {}), + _jsx(NextScript, {}) + ] + }) + ] + }); + } +} +export { MyDocument } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "react/jsx-runtime"; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import 'next/document'; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { MyDocument } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const __TURBOPACK__default__export__ = MyDocument; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +"module evaluation"; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 14 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md index b797be2842de7..3c99b727e3757 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md @@ -103,7 +103,7 @@ const routeModule = new AppRouteRouteModule({ - Side effects - Declares: `routeModule` - Reads: `AppRouteRouteModule`, `RouteKind`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `RouteKind`, `userland`, `routeModule` ## Item 10: Stmt 5, `VarDeclarator(0)` @@ -142,6 +142,7 @@ function patchFetch() { - Declares: `patchFetch` - Reads (eventual): `_patchFetch`, `serverHooks`, `staticGenerationAsyncStorage` - Write: `patchFetch` +- Write (eventual): `serverHooks`, `staticGenerationAsyncStorage` # Phase 1 ```mermaid @@ -282,6 +283,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; ``` # Phase 4 ```mermaid @@ -335,6 +338,8 @@ graph TD Item19 --> Item12; Item12 --> Item7; Item12 --> Item10; + Item12 -.-> Item17; + Item12 -.-> Item16; Item13 --> Item1; Item13 --> Item2; Item13 --> Item3; @@ -344,65 +349,80 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("routeModule", #2), "routeModule"))]"]; - N2["Items: [ItemId(Export(("requestAsyncStorage", #2), "requestAsyncStorage"))]"]; - N3["Items: [ItemId(Export(("staticGenerationAsyncStorage", #2), "staticGenerationAsyncStorage"))]"]; - N4["Items: [ItemId(Export(("serverHooks", #2), "serverHooks"))]"]; - N5["Items: [ItemId(Export(("originalPathname", #2), "originalPathname")), ItemId(6, VarDeclarator(0))]"]; - N6["Items: [ItemId(Export(("patchFetch", #2), "patchFetch")), ItemId(2, ImportBinding(0)), ItemId(7, Normal)]"]; - N7["Items: [ItemId(0, ImportOfModule)]"]; - N8["Items: [ItemId(1, ImportOfModule)]"]; - N9["Items: [ItemId(2, ImportOfModule)]"]; - N10["Items: [ItemId(3, ImportOfModule)]"]; - N11["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N12["Items: [ItemId(5, VarDeclarator(0))]"]; - N0 --> N7; - N0 --> N8; - N0 --> N9; - N0 --> N10; - N0 --> N11; - N1 --> N11; - N2 --> N12; - N3 --> N12; - N4 --> N12; - N6 --> N11; - N6 --> N12; + N0["Items: [ItemId(6, VarDeclarator(0))]"]; + N1["Items: [ItemId(Export(("originalPathname", #2), "originalPathname"))]"]; + N2["Items: [ItemId(2, ImportBinding(0))]"]; + N3["Items: [ItemId(3, ImportBinding(0))]"]; + N4["Items: [ItemId(1, ImportBinding(0))]"]; + N5["Items: [ItemId(0, ImportBinding(0))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, ImportOfModule)]"]; + N8["Items: [ItemId(2, ImportOfModule)]"]; + N9["Items: [ItemId(3, ImportOfModule)]"]; + N10["Items: [ItemId(4, VarDeclarator(0))]"]; + N11["Items: [ItemId(ModuleEvaluation)]"]; + N12["Items: [ItemId(Export(("routeModule", #2), "routeModule"))]"]; + N13["Items: [ItemId(5, VarDeclarator(0))]"]; + N14["Items: [ItemId(Export(("serverHooks", #2), "serverHooks"))]"]; + N15["Items: [ItemId(Export(("staticGenerationAsyncStorage", #2), "staticGenerationAsyncStorage"))]"]; + N16["Items: [ItemId(7, Normal)]"]; + N17["Items: [ItemId(Export(("patchFetch", #2), "patchFetch"))]"]; + N18["Items: [ItemId(Export(("requestAsyncStorage", #2), "requestAsyncStorage"))]"]; + N7 --> N6; + N8 --> N6; N8 --> N7; + N9 --> N6; N9 --> N7; N9 --> N8; + N10 --> N5; + N10 --> N4; + N10 --> N3; + N10 --> N6; N10 --> N7; N10 --> N8; N10 --> N9; + N10 -.-> N2; + N13 --> N10; + N12 --> N10; + N18 --> N13; + N15 --> N13; + N14 --> N13; + N1 --> N0; + N17 --> N16; + N16 --> N2; + N16 --> N13; + N16 -.-> N14; + N16 -.-> N15; + N11 --> N6; N11 --> N7; N11 --> N8; N11 --> N9; N11 --> N10; - N12 --> N11; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 11, Export( "serverHooks", - ): 4, + ): 14, Export( - "requestAsyncStorage", - ): 2, + "patchFetch", + ): 17, Export( "staticGenerationAsyncStorage", - ): 3, + ): 15, Export( - "patchFetch", - ): 6, + "requestAsyncStorage", + ): 18, Export( "routeModule", - ): 1, + ): 12, + Exports: 19, Export( "originalPathname", - ): 5, + ): 1, } ``` @@ -410,129 +430,107 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +const originalPathname = 'VAR_ORIGINAL_PATHNAME'; +export { originalPathname } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js -import { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { routeModule as routeModule }; +import { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { originalPathname as originalPathname }; ``` ## Part 2 ```js -import { requestAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; +export { _patchFetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { requestAsyncStorage as requestAsyncStorage }; ``` ## Part 3 ```js -import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import * as userland from 'VAR_USERLAND'; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { staticGenerationAsyncStorage as staticGenerationAsyncStorage }; ``` ## Part 4 ```js -import { serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import { RouteKind } from '../../server/future/route-kind'; +export { RouteKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { serverHooks as serverHooks }; ``` ## Part 5 ```js -export { originalPathname as originalPathname }; -const originalPathname = 'VAR_ORIGINAL_PATHNAME'; -export { originalPathname } from "__TURBOPACK_VAR__" assert { +import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled'; +export { AppRouteRouteModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 6 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { patchFetch as patchFetch }; -import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; -function patchFetch() { - return _patchFetch({ - serverHooks, - staticGenerationAsyncStorage - }); -} -export { _patchFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { patchFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; +import '../../server/future/route-modules/app-route/module.compiled'; ``` ## Part 7 ```js -import '../../server/future/route-modules/app-route/module.compiled'; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import '../../server/future/route-kind'; ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import '../../server/future/route-kind'; +import '../../server/lib/patch-fetch'; ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import '../../server/lib/patch-fetch'; +import 'VAR_USERLAND'; ``` ## Part 10 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -import 'VAR_USERLAND'; - -``` -## Part 11 -```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -543,12 +541,17 @@ import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 2 +}; +import { AppRouteRouteModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled'; -import { RouteKind } from '../../server/future/route-kind'; -import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; -import * as userland from 'VAR_USERLAND'; const routeModule = new AppRouteRouteModule({ definition: { kind: RouteKind.APP_ROUTE, @@ -561,27 +564,49 @@ const routeModule = new AppRouteRouteModule({ nextConfigOutput, userland }); -export { AppRouteRouteModule } from "__TURBOPACK_VAR__" assert { +export { routeModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { RouteKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -export { _patchFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; -export { routeModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +"module evaluation"; ``` ## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 + __turbopack_part__: 10 +}; +export { routeModule as routeModule }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; const { requestAsyncStorage, staticGenerationAsyncStorage, serverHooks } = routeModule; export { requestAsyncStorage } from "__TURBOPACK_VAR__" assert { @@ -594,9 +619,112 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { serverHooks as serverHooks }; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { staticGenerationAsyncStorage as staticGenerationAsyncStorage }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { _patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +function patchFetch() { + return _patchFetch({ + serverHooks, + staticGenerationAsyncStorage + }); +} +export { patchFetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { patchFetch as patchFetch }; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { requestAsyncStorage as requestAsyncStorage }; + +``` +## Part 19 +```js +export { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export originalPathname" +}; +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; +export { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export serverHooks" +}; +export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export staticGenerationAsyncStorage" +}; +export { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export patchFetch" +}; +export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export requestAsyncStorage" +}; + ``` ## Merged (module eval) ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -609,9 +737,6 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 10 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; "module evaluation"; ``` @@ -619,25 +744,26 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 18, Export( - "serverHooks", - ): 4, + "patchFetch", + ): 14, Export( - "requestAsyncStorage", - ): 2, + "serverHooks", + ): 15, Export( "staticGenerationAsyncStorage", - ): 3, + ): 16, Export( - "patchFetch", - ): 6, + "requestAsyncStorage", + ): 17, Export( "routeModule", - ): 1, + ): 11, + Exports: 19, Export( "originalPathname", - ): 5, + ): 1, } ``` @@ -645,126 +771,107 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +const originalPathname = 'VAR_ORIGINAL_PATHNAME'; +export { originalPathname } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js -import { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { routeModule as routeModule }; +import { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { originalPathname as originalPathname }; ``` ## Part 2 ```js -import { requestAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; +export { _patchFetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { requestAsyncStorage as requestAsyncStorage }; ``` ## Part 3 ```js -import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import * as userland from 'VAR_USERLAND'; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { staticGenerationAsyncStorage as staticGenerationAsyncStorage }; ``` ## Part 4 ```js -import { serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +import { RouteKind } from '../../server/future/route-kind'; +export { RouteKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { serverHooks as serverHooks }; ``` ## Part 5 ```js -export { originalPathname as originalPathname }; -const originalPathname = 'VAR_ORIGINAL_PATHNAME'; -export { originalPathname } from "__TURBOPACK_VAR__" assert { +import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled'; +export { AppRouteRouteModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 6 ```js -import { staticGenerationAsyncStorage, serverHooks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 -}; -export { patchFetch as patchFetch }; -import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'; -function patchFetch() { - return _patchFetch({ - serverHooks, - staticGenerationAsyncStorage - }); -} -export { _patchFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { patchFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; +import '../../server/future/route-modules/app-route/module.compiled'; ``` ## Part 7 ```js -import '../../server/future/route-modules/app-route/module.compiled'; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import '../../server/future/route-kind'; ``` ## Part 8 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import '../../server/future/route-kind'; +import '../../server/lib/patch-fetch'; ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import '../../server/lib/patch-fetch'; +import 'VAR_USERLAND'; ``` ## Part 10 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -import 'VAR_USERLAND'; - -``` -## Part 11 -```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; @@ -774,12 +881,15 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import { AppRouteRouteModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled'; -import { RouteKind } from '../../server/future/route-kind'; -import * as userland from 'VAR_USERLAND'; const routeModule = new AppRouteRouteModule({ definition: { kind: RouteKind.APP_ROUTE, @@ -792,24 +902,29 @@ const routeModule = new AppRouteRouteModule({ nextConfigOutput, userland }); -export { AppRouteRouteModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { RouteKind } from "__TURBOPACK_VAR__" assert { +export { routeModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; -export { routeModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { routeModule as routeModule }; ``` ## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; import { routeModule } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 + __turbopack_part__: 10 }; const { requestAsyncStorage, staticGenerationAsyncStorage, serverHooks } = routeModule; export { requestAsyncStorage } from "__TURBOPACK_VAR__" assert { @@ -823,10 +938,82 @@ export { serverHooks } from "__TURBOPACK_VAR__" assert { }; ``` -## Merged (module eval) +## Part 13 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { _patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +function patchFetch() { + return _patchFetch({ + serverHooks, + staticGenerationAsyncStorage + }); +} +export { patchFetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { patchFetch as patchFetch }; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { serverHooks as serverHooks }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { staticGenerationAsyncStorage as staticGenerationAsyncStorage }; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { requestAsyncStorage as requestAsyncStorage }; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 @@ -834,11 +1021,53 @@ import "__TURBOPACK_PART__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +"module evaluation"; + +``` +## Part 19 +```js +export { originalPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export originalPathname" +}; +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; +export { patchFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export patchFetch" +}; +export { serverHooks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export serverHooks" +}; +export { staticGenerationAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export staticGenerationAsyncStorage" +}; +export { requestAsyncStorage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export requestAsyncStorage" +}; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; "module evaluation"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/input.js new file mode 100644 index 0000000000000..1d4bad1ca723e --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/input.js @@ -0,0 +1,7 @@ +a = () => {}; + +function a() {} + + +// use a (side effect) +console.log(a); diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/output.md new file mode 100644 index 0000000000000..0830dedfe77d6 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-fn/output.md @@ -0,0 +1,220 @@ +# Items + +Count: 4 + +## Item 1: Stmt 0, `Normal` + +```js +a = ()=>{}; + +``` + +- Write: `a` + +## Item 2: Stmt 1, `Normal` + +```js +function a() {} + +``` + +- Hoisted +- Declares: `a` +- Write: `a` + +## Item 3: Stmt 2, `Normal` + +```js +console.log(a); + +``` + +- Side effects +- Reads: `a` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item1; + Item3 --> Item2; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item1; + Item3 --> Item2; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, Normal)]"]; + N1["Items: [ItemId(0, Normal)]"]; + N2["Items: [ItemId(2, Normal)]"]; + N3["Items: [ItemId(ModuleEvaluation)]"]; + N1 --> N0; + N2 --> N1; + N2 --> N0; + N3 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 3, + Exports: 4, +} +``` + + +# Modules (dev) +## Part 0 +```js +function a() {} +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +a = ()=>{}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +console.log(a); + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +## Part 4 +```js + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 3, + Exports: 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +function a() {} +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +a = ()=>{}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +console.log(a); + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +## Part 4 +```js + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/input.js new file mode 100644 index 0000000000000..c1312c195753a --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/input.js @@ -0,0 +1,6 @@ +a = 1; + +var a; + +// use a (side effect) +console.log(a); diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/output.md new file mode 100644 index 0000000000000..e052d0eef4423 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/assign-before-decl-var/output.md @@ -0,0 +1,209 @@ +# Items + +Count: 4 + +## Item 1: Stmt 0, `Normal` + +```js +a = 1; + +``` + +- Write: `a` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +var a; + +``` + +- Declares: `a` +- Write: `a` + +## Item 3: Stmt 2, `Normal` + +```js +console.log(a); + +``` + +- Side effects +- Reads: `a` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item2; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item2; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item4["ModuleEvaluation"]; + Item1 --> Item2; + Item3 --> Item2; + Item4 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(2, Normal)]"]; + N2["Items: [ItemId(ModuleEvaluation)]"]; + N3["Items: [ItemId(0, Normal)]"]; + N3 --> N0; + N1 --> N0; + N2 --> N1; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 2, + Exports: 4, +} +``` + + +# Modules (dev) +## Part 0 +```js +var a; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +console.log(a); + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +a = 1; + +``` +## Part 4 +```js + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 2, + Exports: 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +var a; +export { a } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +console.log(a); + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +a = 1; + +``` +## Part 4 +```js + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md index c734bad84fb88..61ba2ddeabda5 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md @@ -79,21 +79,26 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(0, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(1, VarDeclarator(0))]"]; + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(Export(("b", #2), "b"))]"]; + N2["Items: [ItemId(0, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("a", #2), "a"))]"]; + N4["Items: [ItemId(ModuleEvaluation)]"]; + N3 --> N2; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "b", - ): 2, + ): 1, Export( "a", - ): 1, + ): 3, } ``` @@ -101,24 +106,54 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; +const b = "b"; +export { b } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { a as a }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { b as b }; + +``` +## Part 2 +```js const a = "a"; export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { b as b }; -const b = "b"; -export { b } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { a as a }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" }; ``` @@ -131,13 +166,14 @@ export { b } from "__TURBOPACK_VAR__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "b", - ): 2, + ): 1, Export( "a", - ): 1, + ): 3, } ``` @@ -145,24 +181,54 @@ export { b } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -"module evaluation"; +const b = "b"; +export { b } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { a as a }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { b as b }; + +``` +## Part 2 +```js const a = "a"; export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { b as b }; -const b = "b"; -export { b } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { a as a }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" }; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md index 7929d55a7d44b..aacfd5e3fb231 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/complex/output.md @@ -281,10 +281,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; ``` # Phase 4 ```mermaid @@ -338,10 +341,13 @@ graph TD Item17 --> Item12; Item18 --> Item13; Item4 --> Item8; + Item4 --> Item1; Item7 -.-> Item9; Item7 -.-> Item10; + Item7 --> Item1; Item13 --> Item11; Item13 --> Item8; + Item13 --> Item1; Item14 --> Item3; Item14 --> Item6; Item14 --> Item9; @@ -349,65 +355,76 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("dogRef", #2), "dogRef"))]"]; - N2["Items: [ItemId(Export(("cat", #2), "cat"))]"]; - N3["Items: [ItemId(Export(("initialCat", #2), "initialCat")), ItemId(11, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("getChimera", #2), "getChimera")), ItemId(12, Normal)]"]; - N5["Items: [ItemId(3, Normal), ItemId(6, Normal), ItemId(9, VarDeclarator(0))]"]; - N6["Items: [ItemId(0, VarDeclarator(0))]"]; - N7["Items: [ItemId(1, Normal)]"]; - N8["Items: [ItemId(2, Normal)]"]; - N9["Items: [ItemId(4, Normal)]"]; - N10["Items: [ItemId(5, Normal)]"]; - N11["Items: [ItemId(7, Normal)]"]; - N12["Items: [ItemId(8, Normal)]"]; - N13["Items: [ItemId(10, VarDeclarator(0))]"]; - N0 --> N8; - N0 --> N10; - N0 --> N12; - N1 --> N5; - N2 --> N13; - N3 --> N13; - N4 --> N13; - N4 --> N11; - N5 --> N11; - N5 --> N12; - N5 --> N6; - N7 --> N6; + N0["Items: [ItemId(10, VarDeclarator(0))]"]; + N1["Items: [ItemId(Export(("cat", #2), "cat"))]"]; + N2["Items: [ItemId(11, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("initialCat", #2), "initialCat"))]"]; + N4["Items: [ItemId(0, VarDeclarator(0))]"]; + N5["Items: [ItemId(1, Normal)]"]; + N6["Items: [ItemId(2, Normal)]"]; + N7["Items: [ItemId(4, Normal)]"]; + N8["Items: [ItemId(5, Normal)]"]; + N9["Items: [ItemId(7, Normal)]"]; + N10["Items: [ItemId(12, Normal)]"]; + N11["Items: [ItemId(Export(("getChimera", #2), "getChimera"))]"]; + N12["Items: [ItemId(3, Normal)]"]; + N13["Items: [ItemId(8, Normal)]"]; + N14["Items: [ItemId(ModuleEvaluation)]"]; + N15["Items: [ItemId(6, Normal), ItemId(9, VarDeclarator(0))]"]; + N16["Items: [ItemId(Export(("dogRef", #2), "dogRef"))]"]; + N5 --> N4; + N6 --> N5; + N6 --> N4; + N7 --> N5; + N7 --> N4; + N7 -.-> N6; N8 --> N7; + N8 --> N4; N8 --> N6; N9 --> N7; - N9 --> N6; - N9 --> N8; - N10 --> N9; - N10 --> N6; - N10 --> N8; - N11 --> N9; - N11 --> N6; + N9 --> N4; + N9 -.-> N8; + N13 --> N9; + N13 --> N4; + N13 --> N6; + N13 --> N8; + N15 --> N9; + N15 --> N4; + N15 --> N12; + N15 -.-> N15; + N2 --> N0; + N16 --> N15; + N1 --> N0; + N3 --> N2; N11 --> N10; - N12 --> N11; - N12 --> N6; - N12 --> N8; - N12 --> N10; + N12 --> N9; + N12 --> N4; + N15 -.-> N13; + N10 --> N0; + N10 --> N9; + N10 --> N4; + N14 --> N6; + N14 --> N8; + N14 --> N13; ``` # Entrypoints ``` { - ModuleEvaluation: 0, Export( "getChimera", - ): 4, + ): 11, + ModuleEvaluation: 14, Export( "initialCat", ): 3, + Exports: 17, Export( "cat", - ): 2, + ): 1, Export( "dogRef", - ): 1, + ): 16, } ``` @@ -415,59 +432,52 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 +let cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js -import { dogRef } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { dogRef }; - -``` -## Part 2 -```js import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 0 }; export { cat }; ``` -## Part 3 +## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 0 }; -export { initialCat }; const initialCat = cat; export { initialCat } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 3 ```js -import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 + __turbopack_part__: 2 }; -export { getChimera }; -function getChimera() { - return cat + dog; -} -export { getChimera } from "__TURBOPACK_VAR__" assert { +import { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { initialCat }; + +``` +## Part 4 +```js +let dog = "dog"; +export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -475,49 +485,42 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { ## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 + __turbopack_part__: 4 }; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -function getDog() { - return dog; -} -function setDog(newDog) { - dog = newDog; -} -const dogRef = { - initial: dog, - get: getDog, - set: setDog -}; -export { getDog } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { setDog } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { dogRef } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 4 }; +dog += "!"; ``` ## Part 6 ```js -let dog = "dog"; -export { dog } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +console.log(dog); ``` ## Part 7 ```js -import { dog } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; dog += "!"; ``` @@ -526,9 +529,15 @@ dog += "!"; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { dog } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; console.log(dog); ``` @@ -537,78 +546,183 @@ console.log(dog); import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; dog += "!"; ``` ## Part 10 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 4 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function getChimera() { + return cat + dog; +} +export { getChimera } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -console.log(dog); ``` ## Part 11 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { getChimera }; + +``` +## Part 12 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 4 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +function getDog() { + return dog; +} +export { getDog } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -dog += "!"; ``` -## Part 12 +## Part 13 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +console.log(dog); + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 13 }; -console.log(dog); +"module evaluation"; ``` -## Part 13 +## Part 15 ```js -let cat = "cat"; -export { cat } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { getDog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +function setDog(newDog) { + dog = newDog; +} +const dogRef = { + initial: dog, + get: getDog, + set: setDog +}; +export { setDog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +export { dogRef } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { dogRef }; + +``` +## Part 17 +```js +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export initialCat" +}; +export { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getChimera" +}; +export { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export dogRef" +}; ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 12 + __turbopack_part__: 13 }; "module evaluation"; @@ -617,19 +731,20 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, Export( "getChimera", - ): 4, + ): 10, + ModuleEvaluation: 17, Export( "initialCat", ): 3, + Exports: 18, Export( "cat", - ): 2, + ): 1, Export( "dogRef", - ): 1, + ): 13, } ``` @@ -637,84 +752,128 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js +let cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 0 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +export { cat }; + +``` +## Part 2 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 0 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const initialCat = cat; +export { initialCat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; + +``` +## Part 3 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 2 }; -"module evaluation"; -console.log(dog); -console.log(dog); -console.log(dog); +import { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { initialCat }; ``` -## Part 1 +## Part 4 +```js +let dog = "dog"; +export { dog } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 4 }; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -export { dogRef }; -function getDog() { - return dog; -} function setDog(newDog) { dog = newDog; } -const dogRef = { - initial: dog, - get: getDog, - set: setDog -}; -export { getDog } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { setDog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { dogRef } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +dog += "!"; ``` -## Part 2 +## Part 7 ```js -import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -export { cat }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +dog += "!"; ``` -## Part 3 +## Part 8 ```js -import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { initialCat }; -const initialCat = cat; -export { initialCat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +dog += "!"; ``` -## Part 4 +## Part 9 ```js -import { cat } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -export { getChimera }; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; function getChimera() { return cat + dog; } @@ -723,69 +882,172 @@ export { getChimera } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 5 +## Part 10 ```js -let dog = "dog"; -export { dog } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { getChimera }; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +function getDog() { + return dog; +} +export { getDog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 6 +## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { getDog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { setDog } from "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -dog += "!"; +const dogRef = { + initial: dog, + get: getDog, + set: setDog +}; +export { dogRef } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` -## Part 7 +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { dogRef }; + +``` +## Part 14 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -dog += "!"; +console.log(dog); ``` -## Part 8 +## Part 15 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -dog += "!"; +console.log(dog); ``` -## Part 9 +## Part 16 ```js -let cat = "cat"; -export { cat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +console.log(dog); ``` -## Merged (module eval) +## Part 17 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 16 }; -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 14 +}; +"module evaluation"; + +``` +## Part 18 +```js +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { initialCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export initialCat" +}; +export { getChimera } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getChimera" }; +export { dogRef } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export dogRef" +}; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 }; "module evaluation"; -console.log(dog); -console.log(dog); -console.log(dog); ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md index a19d842625785..46e62c868ed1b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md @@ -41,6 +41,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 3 ```mermaid @@ -51,6 +52,7 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; + Item4 --> Item2; ``` # Phase 4 ```mermaid @@ -61,23 +63,28 @@ graph TD Item3["ModuleEvaluation"]; Item4; Item4["export fakeCat"]; - Item3 --> Item1; Item4 --> Item2; + Item3 --> Item1; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__reexport__cat__", #3), "fakeCat")), ItemId(0, ImportBinding(0))]"]; + N0["Items: [ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(ModuleEvaluation)]"]; + N2["Items: [ItemId(0, ImportBinding(0))]"]; + N3["Items: [ItemId(Export(("__TURBOPACK__reexport__cat__", #3), "fakeCat"))]"]; + N3 --> N2; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 1, Export( "fakeCat", - ): 1, + ): 3, + Exports: 4, } ``` @@ -85,22 +92,48 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; import "./lib"; ``` ## Part 1 ```js -export { __TURBOPACK__reexport__cat__ as fakeCat }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js import { cat as __TURBOPACK__reexport__cat__ } from "./lib"; export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { __TURBOPACK__reexport__cat__ as fakeCat }; + +``` +## Part 4 +```js +export { fakeCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export fakeCat" +}; + ``` ## Merged (module eval) ```js -import "./lib"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; ``` @@ -108,10 +141,11 @@ import "./lib"; ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 1, Export( "fakeCat", - ): 1, + ): 3, + Exports: 4, } ``` @@ -119,22 +153,48 @@ import "./lib"; # Modules (prod) ## Part 0 ```js -"module evaluation"; import "./lib"; ``` ## Part 1 ```js -export { __TURBOPACK__reexport__cat__ as fakeCat }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js import { cat as __TURBOPACK__reexport__cat__ } from "./lib"; export { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { __TURBOPACK__reexport__cat__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { __TURBOPACK__reexport__cat__ as fakeCat }; + +``` +## Part 4 +```js +export { fakeCat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export fakeCat" +}; + ``` ## Merged (module eval) ```js -import "./lib"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md index 41b9426b0686b..0d27024f76f45 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md @@ -217,31 +217,40 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("addMessageListener", #2), "addMessageListener")), ItemId(3, Normal)]"]; - N2["Items: [ItemId(Export(("sendMessage", #2), "sendMessage")), ItemId(4, Normal)]"]; - N3["Items: [ItemId(Export(("connectHMR", #2), "connectHMR")), ItemId(2, Normal), ItemId(5, Normal)]"]; - N4["Items: [ItemId(0, VarDeclarator(0))]"]; - N5["Items: [ItemId(1, VarDeclarator(0))]"]; - N1 --> N5; - N2 --> N4; - N3 --> N4; - N3 --> N5; + N0["Items: [ItemId(2, Normal)]"]; + N1["Items: [ItemId(0, VarDeclarator(0))]"]; + N2["Items: [ItemId(1, VarDeclarator(0))]"]; + N3["Items: [ItemId(5, Normal)]"]; + N4["Items: [ItemId(Export(("connectHMR", #2), "connectHMR"))]"]; + N5["Items: [ItemId(4, Normal)]"]; + N6["Items: [ItemId(Export(("sendMessage", #2), "sendMessage"))]"]; + N7["Items: [ItemId(3, Normal)]"]; + N8["Items: [ItemId(Export(("addMessageListener", #2), "addMessageListener"))]"]; + N9["Items: [ItemId(ModuleEvaluation)]"]; + N8 --> N7; + N6 --> N5; + N4 --> N3; + N7 --> N2; + N5 --> N1; + N3 --> N1; + N3 --> N2; + N3 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, Export( "connectHMR", - ): 3, + ): 4, + ModuleEvaluation: 9, Export( "addMessageListener", - ): 1, + ): 8, + Exports: 10, Export( "sendMessage", - ): 2, + ): 6, } ``` @@ -249,54 +258,54 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; +function getSocketProtocol(assetPrefix) { + let protocol = location.protocol; + try { + protocol = new URL(assetPrefix).protocol; + } catch (_) {} + return protocol === "http:" ? "ws" : "wss"; +} +export { getSocketProtocol } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -import { eventCallbacks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { addMessageListener }; -function addMessageListener(cb) { - eventCallbacks.push(cb); -} -export { addMessageListener } from "__TURBOPACK_VAR__" assert { +let source; +export { source } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js -import { source } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { sendMessage }; -function sendMessage(data) { - if (!source || source.readyState !== source.OPEN) return; - return source.send(data); -} -export { sendMessage } from "__TURBOPACK_VAR__" assert { +const eventCallbacks = []; +export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getSocketProtocol } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { source } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 1 }; import { eventCallbacks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; -export { connectHMR }; -function getSocketProtocol(assetPrefix) { - let protocol = location.protocol; - try { - protocol = new URL(assetPrefix).protocol; - } catch (_) {} - return protocol === "http:" ? "ws" : "wss"; -} function connectHMR(options) { const { timeout = 5 * 1000 } = options; function init() { @@ -338,9 +347,6 @@ function connectHMR(options) { } init(); } -export { getSocketProtocol } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { connectHMR } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -348,19 +354,87 @@ export { connectHMR } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -let source; -export { source } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +export { connectHMR }; ``` ## Part 5 ```js -const eventCallbacks = []; -export { eventCallbacks } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { source } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function sendMessage(data) { + if (!source || source.readyState !== source.OPEN) return; + return source.send(data); +} +export { sendMessage } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { sendMessage }; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { eventCallbacks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function addMessageListener(cb) { + eventCallbacks.push(cb); +} +export { addMessageListener } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +export { addMessageListener }; + +``` +## Part 9 +```js +"module evaluation"; + +``` +## Part 10 +```js +export { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export connectHMR" +}; +export { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export sendMessage" +}; +export { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export addMessageListener" +}; + ``` ## Merged (module eval) ```js @@ -371,16 +445,17 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { ``` { - ModuleEvaluation: 0, Export( "connectHMR", - ): 3, + ): 4, + ModuleEvaluation: 9, Export( "addMessageListener", - ): 1, + ): 8, + Exports: 10, Export( "sendMessage", - ): 2, + ): 6, } ``` @@ -388,54 +463,54 @@ export { eventCallbacks } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -"module evaluation"; +function getSocketProtocol(assetPrefix) { + let protocol = location.protocol; + try { + protocol = new URL(assetPrefix).protocol; + } catch (_) {} + return protocol === "http:" ? "ws" : "wss"; +} +export { getSocketProtocol } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -import { eventCallbacks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -export { addMessageListener }; -function addMessageListener(cb) { - eventCallbacks.push(cb); -} -export { addMessageListener } from "__TURBOPACK_VAR__" assert { +let source; +export { source } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js -import { source } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -export { sendMessage }; -function sendMessage(data) { - if (!source || source.readyState !== source.OPEN) return; - return source.send(data); -} -export { sendMessage } from "__TURBOPACK_VAR__" assert { +const eventCallbacks = []; +export { eventCallbacks } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getSocketProtocol } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { source } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 1 }; import { eventCallbacks } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; -export { connectHMR }; -function getSocketProtocol(assetPrefix) { - let protocol = location.protocol; - try { - protocol = new URL(assetPrefix).protocol; - } catch (_) {} - return protocol === "http:" ? "ws" : "wss"; -} function connectHMR(options) { const { timeout = 5 * 1000 } = options; function init() { @@ -477,9 +552,6 @@ function connectHMR(options) { } init(); } -export { getSocketProtocol } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { connectHMR } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -487,19 +559,87 @@ export { connectHMR } from "__TURBOPACK_VAR__" assert { ``` ## Part 4 ```js -let source; -export { source } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +export { connectHMR }; ``` ## Part 5 ```js -const eventCallbacks = []; -export { eventCallbacks } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { source } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function sendMessage(data) { + if (!source || source.readyState !== source.OPEN) return; + return source.send(data); +} +export { sendMessage } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { sendMessage }; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { eventCallbacks } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function addMessageListener(cb) { + eventCallbacks.push(cb); +} +export { addMessageListener } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +export { addMessageListener }; + +``` +## Part 9 +```js +"module evaluation"; + +``` +## Part 10 +```js +export { connectHMR } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export connectHMR" +}; +export { sendMessage } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export sendMessage" +}; +export { addMessageListener } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export addMessageListener" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md index 361e8588ef2c0..e2da7b2f36d97 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md @@ -91,7 +91,7 @@ const hasPostpone = typeof React.unstable_postpone === 'function'; - Declares: `hasPostpone` - Reads: `React` -- Write: `hasPostpone`, `React` +- Write: `React`, `hasPostpone` ## Item 10: Stmt 5, `Normal` @@ -465,9 +465,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; ``` # Phase 4 ```mermaid @@ -536,9 +538,11 @@ graph TD Item14 --> Item15; Item15 --> Item18; Item15 --> Item9; + Item15 --> Item5; Item18 --> Item9; Item19 --> Item18; Item19 --> Item9; + Item19 --> Item5; Item20 --> Item1; Item20 --> Item2; Item20 --> Item3; @@ -547,58 +551,101 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(1, ImportOfModule), ItemId(2, ImportOfModule), ItemId(3, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("createPrerenderState", #2), "createPrerenderState")), ItemId(5, Normal)]"]; - N2["Items: [ItemId(Export(("markCurrentScopeAsDynamic", #2), "markCurrentScopeAsDynamic")), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(6, Normal)]"]; - N3["Items: [ItemId(Export(("trackDynamicDataAccessed", #2), "trackDynamicDataAccessed")), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(7, Normal)]"]; - N4["Items: [ItemId(Export(("Postpone", #2), "Postpone")), ItemId(8, Normal)]"]; - N5["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch")), ItemId(9, Normal)]"]; - N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs")), ItemId(11, Normal)]"]; - N7["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses")), ItemId(12, Normal)]"]; - N8["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal")), ItemId(14, Normal)]"]; - N9["Items: [ItemId(0, ImportBinding(0)), ItemId(4, VarDeclarator(0))]"]; - N10["Items: [ItemId(10, Normal)]"]; + N0["Items: [ItemId(1, ImportBinding(0))]"]; + N1["Items: [ItemId(2, ImportBinding(0))]"]; + N2["Items: [ItemId(3, ImportBinding(0))]"]; + N3["Items: [ItemId(12, Normal)]"]; + N4["Items: [ItemId(Export(("formatDynamicAPIAccesses", #2), "formatDynamicAPIAccesses"))]"]; + N5["Items: [ItemId(11, Normal)]"]; + N6["Items: [ItemId(Export(("usedDynamicAPIs", #2), "usedDynamicAPIs"))]"]; + N7["Items: [ItemId(5, Normal)]"]; + N8["Items: [ItemId(Export(("createPrerenderState", #2), "createPrerenderState"))]"]; + N9["Items: [ItemId(0, ImportBinding(0))]"]; + N10["Items: [ItemId(4, VarDeclarator(0))]"]; N11["Items: [ItemId(13, Normal)]"]; - N2 --> N3; - N2 --> N10; - N3 --> N10; - N4 --> N10; - N5 --> N10; - N8 --> N11; - N8 --> N9; - N10 --> N11; + N12["Items: [ItemId(14, Normal)]"]; + N13["Items: [ItemId(Export(("createPostponedAbortSignal", #2), "createPostponedAbortSignal"))]"]; + N14["Items: [ItemId(10, Normal)]"]; + N15["Items: [ItemId(9, Normal)]"]; + N16["Items: [ItemId(Export(("trackDynamicFetch", #2), "trackDynamicFetch"))]"]; + N17["Items: [ItemId(8, Normal)]"]; + N18["Items: [ItemId(Export(("Postpone", #2), "Postpone"))]"]; + N19["Items: [ItemId(7, Normal)]"]; + N20["Items: [ItemId(Export(("trackDynamicDataAccessed", #2), "trackDynamicDataAccessed"))]"]; + N21["Items: [ItemId(6, Normal)]"]; + N22["Items: [ItemId(Export(("markCurrentScopeAsDynamic", #2), "markCurrentScopeAsDynamic"))]"]; + N23["Items: [ItemId(0, ImportOfModule)]"]; + N24["Items: [ItemId(1, ImportOfModule)]"]; + N25["Items: [ItemId(2, ImportOfModule)]"]; + N26["Items: [ItemId(3, ImportOfModule)]"]; + N27["Items: [ItemId(ModuleEvaluation)]"]; + N24 --> N23; + N25 --> N23; + N25 --> N24; + N26 --> N23; + N26 --> N24; + N26 --> N25; N10 --> N9; - N11 --> N9; + N8 --> N7; + N22 --> N21; + N20 --> N19; + N18 --> N17; + N16 --> N15; + N6 --> N5; + N4 --> N3; + N13 --> N12; + N21 --> N2; + N21 --> N1; + N21 --> N14; + N21 --> N0; + N19 --> N2; + N19 --> N1; + N19 --> N14; + N19 --> N0; + N17 --> N14; + N15 --> N14; + N14 --> N11; + N14 --> N10; + N14 --> N9; + N11 --> N10; + N12 --> N11; + N12 --> N10; + N12 --> N9; + N27 --> N23; + N27 --> N24; + N27 --> N25; + N27 --> N26; ``` # Entrypoints ``` { - ModuleEvaluation: 0, Export( "createPrerenderState", - ): 1, + ): 8, + ModuleEvaluation: 27, Export( "markCurrentScopeAsDynamic", - ): 2, + ): 22, Export( "usedDynamicAPIs", ): 6, Export( - "trackDynamicDataAccessed", - ): 3, + "trackDynamicFetch", + ): 16, Export( "Postpone", - ): 4, + ): 18, Export( - "trackDynamicFetch", - ): 5, + "trackDynamicDataAccessed", + ): 20, Export( "createPostponedAbortSignal", - ): 8, + ): 13, Export( "formatDynamicAPIAccesses", - ): 7, + ): 4, + Exports: 28, } ``` @@ -606,186 +653,165 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; -import 'react'; -import '../../client/components/hooks-server-context'; -import '../../client/components/static-generation-bailout'; -import '../../lib/url'; +import { DynamicServerError } from '../../client/components/hooks-server-context'; +export { DynamicServerError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { createPrerenderState }; -function createPrerenderState(isDebugSkeleton) { - return { - isDebugSkeleton, - dynamicAccesses: [] - }; -} -export { createPrerenderState } from "__TURBOPACK_VAR__" assert { +import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; +export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { markCurrentScopeAsDynamic }; -import { DynamicServerError } from '../../client/components/hooks-server-context'; -import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; import { getPathname } from '../../lib/url'; -function markCurrentScopeAsDynamic(store, expression) { - const pathname = getPathname(store.urlPathname); - if (store.isUnstableCacheCallback) { - return; - } else if (store.dynamicShouldError) { - throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); - } else if (store.prerenderState) { - postponeWithTracking(store.prerenderState, expression, pathname); - } else { - store.revalidate = 0; - if (store.isStaticGeneration) { - const err = new DynamicServerError(`Route ${pathname} couldn't be rendered statically because it used ${expression}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`); - store.dynamicUsageDescription = expression; - store.dynamicUsageStack = err.stack; - throw err; - } - } -} -export { DynamicServerError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { getPathname } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { markCurrentScopeAsDynamic } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 3 ```js -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { trackDynamicDataAccessed }; -import { DynamicServerError } from '../../client/components/hooks-server-context'; -import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; -import { getPathname } from '../../lib/url'; -function trackDynamicDataAccessed(store, expression) { - const pathname = getPathname(store.urlPathname); - if (store.isUnstableCacheCallback) { - throw new Error(`Route ${pathname} used "${expression}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${expression}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`); - } else if (store.dynamicShouldError) { - throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); - } else if (store.prerenderState) { - postponeWithTracking(store.prerenderState, expression, pathname); - } else { - store.revalidate = 0; - if (store.isStaticGeneration) { - const err = new DynamicServerError(`Route ${pathname} couldn't be rendered statically because it used ${expression}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`); - store.dynamicUsageDescription = expression; - store.dynamicUsageStack = err.stack; - throw err; - } - } +function formatDynamicAPIAccesses(prerenderState) { + return prerenderState.dynamicAccesses.filter((access)=>typeof access.stack === 'string' && access.stack.length > 0).map(({ expression, stack })=>{ + stack = stack.split('\n').slice(4).filter((line)=>{ + if (line.includes('node_modules/next/')) { + return false; + } + if (line.includes(' ()')) { + return false; + } + if (line.includes(' (node:')) { + return false; + } + return true; + }).join('\n'); + return `Dynamic API Usage Debug - ${expression}:\n${stack}`; + }); } -export { DynamicServerError } from "__TURBOPACK_VAR__" assert { +export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { getPathname } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { trackDynamicDataAccessed } from "__TURBOPACK_VAR__" assert { +export { formatDynamicAPIAccesses }; + +``` +## Part 5 +```js +function usedDynamicAPIs(prerenderState) { + return prerenderState.dynamicAccesses.length > 0; +} +export { usedDynamicAPIs } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 6 ```js -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { Postpone }; -function Postpone({ reason, prerenderState, pathname }) { - postponeWithTracking(prerenderState, reason, pathname); +import { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { usedDynamicAPIs }; + +``` +## Part 7 +```js +function createPrerenderState(isDebugSkeleton) { + return { + isDebugSkeleton, + dynamicAccesses: [] + }; } -export { Postpone } from "__TURBOPACK_VAR__" assert { +export { createPrerenderState } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 8 ```js -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { trackDynamicFetch }; -function trackDynamicFetch(store, expression) { - if (!store.prerenderState || store.isUnstableCacheCallback) return; - postponeWithTracking(store.prerenderState, expression, store.urlPathname); -} -export { trackDynamicFetch } from "__TURBOPACK_VAR__" assert { +import { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +export { createPrerenderState }; + +``` +## Part 9 +```js +import React from 'react'; +export { React } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 6 +## Part 10 ```js -export { usedDynamicAPIs }; -function usedDynamicAPIs(prerenderState) { - return prerenderState.dynamicAccesses.length > 0; -} -export { usedDynamicAPIs } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { React } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const hasPostpone = typeof React.unstable_postpone === 'function'; +export { hasPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 11 ```js -export { formatDynamicAPIAccesses }; -function formatDynamicAPIAccesses(prerenderState) { - return prerenderState.dynamicAccesses.filter((access)=>typeof access.stack === 'string' && access.stack.length > 0).map(({ expression, stack })=>{ - stack = stack.split('\n').slice(4).filter((line)=>{ - if (line.includes('node_modules/next/')) { - return false; - } - if (line.includes(' ()')) { - return false; - } - if (line.includes(' (node:')) { - return false; - } - return true; - }).join('\n'); - return `Dynamic API Usage Debug - ${expression}:\n${stack}`; - }); +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { hasPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function assertPostpone() { + if (!hasPostpone) { + throw new Error(`Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js`); + } } -export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { +export { assertPostpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 8 +## Part 12 ```js -import { assertPostpone } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; -export { createPostponedAbortSignal }; +import { assertPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; function createPostponedAbortSignal(reason) { assertPostpone(); const controller = new AbortController(); @@ -801,26 +827,34 @@ export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 9 +## Part 13 ```js -import React from 'react'; -const hasPostpone = typeof React.unstable_postpone === 'function'; -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 }; -export { hasPostpone } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 }; +export { createPostponedAbortSignal }; ``` -## Part 10 +## Part 14 ```js -import { assertPostpone } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 11 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; import { React } from "__TURBOPACK_PART__" assert { __turbopack_part__: 9 }; +import { assertPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; function postponeWithTracking(prerenderState, expression, pathname) { assertPostpone(); const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; @@ -835,27 +869,278 @@ export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 11 +## Part 15 ```js -import { hasPostpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 }; -function assertPostpone() { - if (!hasPostpone) { - throw new Error(`Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js`); - } -} -export { assertPostpone } from "__TURBOPACK_VAR__" assert { +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function trackDynamicFetch(store, expression) { + if (!store.prerenderState || store.isUnstableCacheCallback) return; + postponeWithTracking(store.prerenderState, expression, store.urlPathname); +} +export { trackDynamicFetch } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Merged (module eval) +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { trackDynamicFetch }; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function Postpone({ reason, prerenderState, pathname }) { + postponeWithTracking(prerenderState, reason, pathname); +} +export { Postpone } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +export { Postpone }; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DynamicServerError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { StaticGenBailoutError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function trackDynamicDataAccessed(store, expression) { + const pathname = getPathname(store.urlPathname); + if (store.isUnstableCacheCallback) { + throw new Error(`Route ${pathname} used "${expression}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${expression}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`); + } else if (store.dynamicShouldError) { + throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); + } else if (store.prerenderState) { + postponeWithTracking(store.prerenderState, expression, pathname); + } else { + store.revalidate = 0; + if (store.isStaticGeneration) { + const err = new DynamicServerError(`Route ${pathname} couldn't be rendered statically because it used ${expression}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`); + store.dynamicUsageDescription = expression; + store.dynamicUsageStack = err.stack; + throw err; + } + } +} +export { trackDynamicDataAccessed } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +export { trackDynamicDataAccessed }; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DynamicServerError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { StaticGenBailoutError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function markCurrentScopeAsDynamic(store, expression) { + const pathname = getPathname(store.urlPathname); + if (store.isUnstableCacheCallback) { + return; + } else if (store.dynamicShouldError) { + throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); + } else if (store.prerenderState) { + postponeWithTracking(store.prerenderState, expression, pathname); + } else { + store.revalidate = 0; + if (store.isStaticGeneration) { + const err = new DynamicServerError(`Route ${pathname} couldn't be rendered statically because it used ${expression}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`); + store.dynamicUsageDescription = expression; + store.dynamicUsageStack = err.stack; + throw err; + } + } +} +export { markCurrentScopeAsDynamic } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +export { markCurrentScopeAsDynamic }; + +``` +## Part 23 ```js import 'react'; + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; import '../../client/components/hooks-server-context'; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; import '../../client/components/static-generation-bailout'; + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; import '../../lib/url'; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +"module evaluation"; + +``` +## Part 28 +```js +export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export formatDynamicAPIAccesses" +}; +export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export usedDynamicAPIs" +}; +export { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPrerenderState" +}; +export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPostponedAbortSignal" +}; +export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicFetch" +}; +export { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export Postpone" +}; +export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicDataAccessed" +}; +export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export markCurrentScopeAsDynamic" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; "module evaluation"; ``` @@ -863,75 +1148,340 @@ import '../../lib/url'; ``` { - ModuleEvaluation: 0, Export( "createPrerenderState", - ): 1, + ): 8, + ModuleEvaluation: 27, Export( "markCurrentScopeAsDynamic", - ): 2, + ): 22, Export( "usedDynamicAPIs", ): 6, Export( - "trackDynamicDataAccessed", - ): 3, + "trackDynamicFetch", + ): 16, Export( "Postpone", - ): 4, + ): 18, Export( - "trackDynamicFetch", - ): 5, + "trackDynamicDataAccessed", + ): 20, Export( "createPostponedAbortSignal", - ): 8, + ): 13, Export( "formatDynamicAPIAccesses", - ): 7, + ): 4, + Exports: 28, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { DynamicServerError } from '../../client/components/hooks-server-context'; +export { DynamicServerError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; +export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { getPathname } from '../../lib/url'; +export { getPathname } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +function formatDynamicAPIAccesses(prerenderState) { + return prerenderState.dynamicAccesses.filter((access)=>typeof access.stack === 'string' && access.stack.length > 0).map(({ expression, stack })=>{ + stack = stack.split('\n').slice(4).filter((line)=>{ + if (line.includes('node_modules/next/')) { + return false; + } + if (line.includes(' ()')) { + return false; + } + if (line.includes(' (node:')) { + return false; + } + return true; + }).join('\n'); + return `Dynamic API Usage Debug - ${expression}:\n${stack}`; + }); +} +export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { formatDynamicAPIAccesses }; + +``` +## Part 5 +```js +function usedDynamicAPIs(prerenderState) { + return prerenderState.dynamicAccesses.length > 0; +} +export { usedDynamicAPIs } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { usedDynamicAPIs }; + +``` +## Part 7 +```js +function createPrerenderState(isDebugSkeleton) { + return { + isDebugSkeleton, + dynamicAccesses: [] + }; +} +export { createPrerenderState } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +export { createPrerenderState }; + +``` +## Part 9 +```js +import React from 'react'; +export { React } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { React } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const hasPostpone = typeof React.unstable_postpone === 'function'; +export { hasPostpone } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { hasPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +function assertPostpone() { + if (!hasPostpone) { + throw new Error(`Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js`); + } +} +export { assertPostpone } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { React } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { assertPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +function createPostponedAbortSignal(reason) { + assertPostpone(); + const controller = new AbortController(); + try { + React.unstable_postpone(reason); + } catch (x) { + controller.abort(x); + } + return controller.signal; +} +export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { createPostponedAbortSignal }; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { React } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { assertPostpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +function postponeWithTracking(prerenderState, expression, pathname) { + assertPostpone(); + const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; + prerenderState.dynamicAccesses.push({ + stack: prerenderState.isDebugSkeleton ? new Error().stack : undefined, + expression + }); + React.unstable_postpone(reason); } -``` +export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function trackDynamicFetch(store, expression) { + if (!store.prerenderState || store.isUnstableCacheCallback) return; + postponeWithTracking(store.prerenderState, expression, store.urlPathname); +} +export { trackDynamicFetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; -# Modules (prod) -## Part 0 +``` +## Part 16 ```js -"module evaluation"; -import 'react'; -import '../../client/components/hooks-server-context'; -import '../../client/components/static-generation-bailout'; -import '../../lib/url'; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { trackDynamicFetch }; ``` -## Part 1 +## Part 17 ```js -export { createPrerenderState }; -function createPrerenderState(isDebugSkeleton) { - return { - isDebugSkeleton, - dynamicAccesses: [] - }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { postponeWithTracking } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +function Postpone({ reason, prerenderState, pathname }) { + postponeWithTracking(prerenderState, reason, pathname); } -export { createPrerenderState } from "__TURBOPACK_VAR__" assert { +export { Postpone } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 18 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 17 +}; +import { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +export { Postpone }; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DynamicServerError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { StaticGenBailoutError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 14 }; -export { markCurrentScopeAsDynamic }; -import { DynamicServerError } from '../../client/components/hooks-server-context'; -import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; -import { getPathname } from '../../lib/url'; -function markCurrentScopeAsDynamic(store, expression) { +function trackDynamicDataAccessed(store, expression) { const pathname = getPathname(store.urlPathname); if (store.isUnstableCacheCallback) { - return; + throw new Error(`Route ${pathname} used "${expression}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${expression}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`); } else if (store.dynamicShouldError) { throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); } else if (store.prerenderState) { @@ -946,33 +1496,52 @@ function markCurrentScopeAsDynamic(store, expression) { } } } -export { DynamicServerError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { +export { trackDynamicDataAccessed } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { getPathname } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; -export { markCurrentScopeAsDynamic } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 }; +export { trackDynamicDataAccessed }; ``` -## Part 3 +## Part 21 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DynamicServerError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { getPathname } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { StaticGenBailoutError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 14 }; -export { trackDynamicDataAccessed }; -import { DynamicServerError } from '../../client/components/hooks-server-context'; -import { StaticGenBailoutError } from '../../client/components/static-generation-bailout'; -import { getPathname } from '../../lib/url'; -function trackDynamicDataAccessed(store, expression) { +function markCurrentScopeAsDynamic(store, expression) { const pathname = getPathname(store.urlPathname); if (store.isUnstableCacheCallback) { - throw new Error(`Route ${pathname} used "${expression}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${expression}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`); + return; } else if (store.dynamicShouldError) { throw new StaticGenBailoutError(`Route ${pathname} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${expression}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`); } else if (store.prerenderState) { @@ -987,164 +1556,119 @@ function trackDynamicDataAccessed(store, expression) { } } } -export { DynamicServerError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { StaticGenBailoutError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getPathname } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { trackDynamicDataAccessed } from "__TURBOPACK_VAR__" assert { +export { markCurrentScopeAsDynamic } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 22 ```js -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 }; -export { Postpone }; -function Postpone({ reason, prerenderState, pathname }) { - postponeWithTracking(prerenderState, reason, pathname); -} -export { Postpone } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 }; +export { markCurrentScopeAsDynamic }; ``` -## Part 5 +## Part 23 ```js -import { postponeWithTracking } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -export { trackDynamicFetch }; -function trackDynamicFetch(store, expression) { - if (!store.prerenderState || store.isUnstableCacheCallback) return; - postponeWithTracking(store.prerenderState, expression, store.urlPathname); -} -export { trackDynamicFetch } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; +import 'react'; ``` -## Part 6 +## Part 24 ```js -export { usedDynamicAPIs }; -function usedDynamicAPIs(prerenderState) { - return prerenderState.dynamicAccesses.length > 0; -} -export { usedDynamicAPIs } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 }; +import '../../client/components/hooks-server-context'; ``` -## Part 7 +## Part 25 ```js -export { formatDynamicAPIAccesses }; -function formatDynamicAPIAccesses(prerenderState) { - return prerenderState.dynamicAccesses.filter((access)=>typeof access.stack === 'string' && access.stack.length > 0).map(({ expression, stack })=>{ - stack = stack.split('\n').slice(4).filter((line)=>{ - if (line.includes('node_modules/next/')) { - return false; - } - if (line.includes(' ()')) { - return false; - } - if (line.includes(' (node:')) { - return false; - } - return true; - }).join('\n'); - return `Dynamic API Usage Debug - ${expression}:\n${stack}`; - }); -} -export { formatDynamicAPIAccesses } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 }; +import '../../client/components/static-generation-bailout'; ``` -## Part 8 +## Part 26 ```js -import { assertPostpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 }; -import { React } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 }; -export { createPostponedAbortSignal }; -function createPostponedAbortSignal(reason) { - assertPostpone(); - const controller = new AbortController(); - try { - React.unstable_postpone(reason); - } catch (x) { - controller.abort(x); - } - return controller.signal; -} -export { createPostponedAbortSignal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 }; +import '../../lib/url'; ``` -## Part 9 +## Part 27 ```js -import React from 'react'; -const hasPostpone = typeof React.unstable_postpone === 'function'; -export { React } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 }; -export { hasPostpone } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; +"module evaluation"; ``` -## Part 10 +## Part 28 ```js -import { assertPostpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 11 +export { formatDynamicAPIAccesses } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export formatDynamicAPIAccesses" }; -import { React } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +export { usedDynamicAPIs } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export usedDynamicAPIs" }; -function postponeWithTracking(prerenderState, expression, pathname) { - assertPostpone(); - const reason = `Route ${pathname} needs to bail out of prerendering at this point because it used ${expression}. ` + `React throws this special object to indicate where. It should not be caught by ` + `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`; - prerenderState.dynamicAccesses.push({ - stack: prerenderState.isDebugSkeleton ? new Error().stack : undefined, - expression - }); - React.unstable_postpone(reason); -} -export { postponeWithTracking } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +export { createPrerenderState } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPrerenderState" }; - -``` -## Part 11 -```js -import { hasPostpone } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +export { createPostponedAbortSignal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export createPostponedAbortSignal" }; -function assertPostpone() { - if (!hasPostpone) { - throw new Error(`Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js`); - } -} -export { assertPostpone } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +export { trackDynamicFetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicFetch" +}; +export { Postpone } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export Postpone" +}; +export { trackDynamicDataAccessed } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export trackDynamicDataAccessed" +}; +export { markCurrentScopeAsDynamic } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export markCurrentScopeAsDynamic" }; ``` ## Merged (module eval) ```js -import 'react'; -import '../../client/components/hooks-server-context'; -import '../../client/components/static-generation-bailout'; -import '../../lib/url'; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md index 5220a3ffac6a3..de4f99770472e 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,50 +1638,414 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; - N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; - N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; - N3["Items: [ItemId(0, ImportOfModule)]"]; - N4["Items: [ItemId(1, ImportOfModule)]"]; - N5["Items: [ItemId(2, ImportOfModule)]"]; - N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; - N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; - N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N0 --> N3; - N0 --> N4; - N0 --> N5; - N0 --> N7; - N0 --> N8; - N0 --> N6; - N0 --> N2; - N1 --> N6; - N2 --> N8; - N4 --> N3; - N5 --> N3; - N5 --> N4; - N6 --> N8; - N7 --> N3; - N7 --> N4; - N7 --> N5; - N7 --> N8; + N0["Items: [ItemId(0, ImportBinding(0))]"]; + N1["Items: [ItemId(1, ImportBinding(0))]"]; + N2["Items: [ItemId(2, ImportBinding(0))]"]; + N3["Items: [ItemId(3, Normal)]"]; + N4["Items: [ItemId(4, Normal)]"]; + N5["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, ImportOfModule)]"]; + N8["Items: [ItemId(2, ImportOfModule)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; + N10["Items: [ItemId(6, VarDeclarator(0))]"]; + N11["Items: [ItemId(7, Normal)]"]; + N12["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N14["Items: [ItemId(9, Normal)]"]; + N15["Items: [ItemId(10, Normal)]"]; + N16["Items: [ItemId(11, Normal)]"]; + N17["Items: [ItemId(12, Normal)]"]; + N18["Items: [ItemId(13, Normal)]"]; + N19["Items: [ItemId(14, Normal)]"]; + N20["Items: [ItemId(15, Normal)]"]; + N21["Items: [ItemId(16, Normal)]"]; + N22["Items: [ItemId(17, Normal)]"]; + N23["Items: [ItemId(18, Normal)]"]; + N24["Items: [ItemId(19, Normal)]"]; + N25["Items: [ItemId(20, Normal)]"]; + N26["Items: [ItemId(21, Normal)]"]; + N27["Items: [ItemId(22, Normal)]"]; + N28["Items: [ItemId(23, Normal)]"]; + N29["Items: [ItemId(24, Normal)]"]; + N30["Items: [ItemId(ModuleEvaluation)]"]; N7 --> N6; N8 --> N6; N8 --> N7; - N8 --> N3; - N8 --> N4; - N8 --> N5; + N9 --> N6; + N9 --> N7; + N9 --> N8; + N9 -.-> N2; + N9 -.-> N1; + N9 -.-> N0; + N9 -.-> N3; + N10 --> N4; + N10 --> N9; + N10 --> N6; + N10 --> N7; + N10 --> N8; + N10 -.-> N2; + N10 -.-> N1; + N10 -.-> N0; + N10 -.-> N3; + N11 --> N10; + N11 --> N6; + N11 --> N7; + N11 --> N8; + N11 --> N9; + N11 -.-> N2; + N11 -.-> N1; + N11 -.-> N0; + N11 -.-> N3; + N13 --> N6; + N13 --> N7; + N13 --> N8; + N13 --> N9; + N13 --> N10; + N13 --> N11; + N13 -.-> N2; + N13 -.-> N1; + N13 -.-> N0; + N13 -.-> N3; + N14 --> N13; + N14 --> N6; + N14 --> N7; + N14 --> N8; + N14 --> N9; + N14 --> N10; + N14 --> N11; + N14 -.-> N2; + N14 -.-> N1; + N14 -.-> N0; + N14 -.-> N3; + N15 --> N13; + N15 --> N6; + N15 --> N7; + N15 --> N8; + N15 --> N9; + N15 --> N10; + N15 --> N11; + N15 --> N14; + N15 -.-> N2; + N15 -.-> N1; + N15 -.-> N0; + N15 -.-> N3; + N16 --> N13; + N16 --> N6; + N16 --> N7; + N16 --> N8; + N16 --> N9; + N16 --> N10; + N16 --> N11; + N16 --> N14; + N16 --> N15; + N16 -.-> N2; + N16 -.-> N1; + N16 -.-> N0; + N16 -.-> N3; + N17 --> N13; + N17 --> N6; + N17 --> N7; + N17 --> N8; + N17 --> N9; + N17 --> N10; + N17 --> N11; + N17 --> N14; + N17 --> N15; + N17 --> N16; + N17 -.-> N2; + N17 -.-> N1; + N17 -.-> N0; + N17 -.-> N3; + N18 --> N13; + N18 --> N6; + N18 --> N7; + N18 --> N8; + N18 --> N9; + N18 --> N10; + N18 --> N11; + N18 --> N14; + N18 --> N15; + N18 --> N16; + N18 --> N17; + N18 -.-> N2; + N18 -.-> N1; + N18 -.-> N0; + N18 -.-> N3; + N19 --> N13; + N19 --> N6; + N19 --> N7; + N19 --> N8; + N19 --> N9; + N19 --> N10; + N19 --> N11; + N19 --> N14; + N19 --> N15; + N19 --> N16; + N19 --> N17; + N19 --> N18; + N19 -.-> N2; + N19 -.-> N1; + N19 -.-> N0; + N19 -.-> N3; + N20 --> N13; + N20 --> N6; + N20 --> N7; + N20 --> N8; + N20 --> N9; + N20 --> N10; + N20 --> N11; + N20 --> N14; + N20 --> N15; + N20 --> N16; + N20 --> N17; + N20 --> N18; + N20 --> N19; + N20 -.-> N2; + N20 -.-> N1; + N20 -.-> N0; + N20 -.-> N3; + N21 --> N13; + N21 --> N6; + N21 --> N7; + N21 --> N8; + N21 --> N9; + N21 --> N10; + N21 --> N11; + N21 --> N14; + N21 --> N15; + N21 --> N16; + N21 --> N17; + N21 --> N18; + N21 --> N19; + N21 --> N20; + N21 -.-> N2; + N21 -.-> N1; + N21 -.-> N0; + N21 -.-> N3; + N22 --> N13; + N22 --> N6; + N22 --> N7; + N22 --> N8; + N22 --> N9; + N22 --> N10; + N22 --> N11; + N22 --> N14; + N22 --> N15; + N22 --> N16; + N22 --> N17; + N22 --> N18; + N22 --> N19; + N22 --> N20; + N22 --> N21; + N22 -.-> N2; + N22 -.-> N1; + N22 -.-> N0; + N22 -.-> N3; + N23 --> N13; + N23 --> N6; + N23 --> N7; + N23 --> N8; + N23 --> N9; + N23 --> N10; + N23 --> N11; + N23 --> N14; + N23 --> N15; + N23 --> N16; + N23 --> N17; + N23 --> N18; + N23 --> N19; + N23 --> N20; + N23 --> N21; + N23 --> N22; + N23 -.-> N2; + N23 -.-> N1; + N23 -.-> N0; + N23 -.-> N3; + N24 --> N13; + N24 --> N6; + N24 --> N7; + N24 --> N8; + N24 --> N9; + N24 --> N10; + N24 --> N11; + N24 --> N14; + N24 --> N15; + N24 --> N16; + N24 --> N17; + N24 --> N18; + N24 --> N19; + N24 --> N20; + N24 --> N21; + N24 --> N22; + N24 --> N23; + N24 -.-> N2; + N24 -.-> N1; + N24 -.-> N0; + N24 -.-> N3; + N25 --> N13; + N25 --> N6; + N25 --> N7; + N25 --> N8; + N25 --> N9; + N25 --> N10; + N25 --> N11; + N25 --> N14; + N25 --> N15; + N25 --> N16; + N25 --> N17; + N25 --> N18; + N25 --> N19; + N25 --> N20; + N25 --> N21; + N25 --> N22; + N25 --> N23; + N25 --> N24; + N25 -.-> N2; + N25 -.-> N1; + N25 -.-> N0; + N25 -.-> N3; + N26 --> N13; + N26 --> N6; + N26 --> N7; + N26 --> N8; + N26 --> N9; + N26 --> N10; + N26 --> N11; + N26 --> N14; + N26 --> N15; + N26 --> N16; + N26 --> N17; + N26 --> N18; + N26 --> N19; + N26 --> N20; + N26 --> N21; + N26 --> N22; + N26 --> N23; + N26 --> N24; + N26 --> N25; + N26 -.-> N2; + N26 -.-> N1; + N26 -.-> N0; + N26 -.-> N3; + N27 --> N13; + N27 --> N6; + N27 --> N7; + N27 --> N8; + N27 --> N9; + N27 --> N10; + N27 --> N11; + N27 --> N14; + N27 --> N15; + N27 --> N16; + N27 --> N17; + N27 --> N18; + N27 --> N19; + N27 --> N20; + N27 --> N21; + N27 --> N22; + N27 --> N23; + N27 --> N24; + N27 --> N25; + N27 --> N26; + N27 -.-> N2; + N27 -.-> N1; + N27 -.-> N0; + N27 -.-> N3; + N28 --> N13; + N28 --> N6; + N28 --> N7; + N28 --> N8; + N28 --> N9; + N28 --> N10; + N28 --> N11; + N28 --> N14; + N28 --> N15; + N28 --> N16; + N28 --> N17; + N28 --> N18; + N28 --> N19; + N28 --> N20; + N28 --> N21; + N28 --> N22; + N28 --> N23; + N28 --> N24; + N28 --> N25; + N28 --> N26; + N28 --> N27; + N28 -.-> N2; + N28 -.-> N1; + N28 -.-> N0; + N28 -.-> N3; + N29 --> N13; + N29 --> N6; + N29 --> N7; + N29 --> N8; + N29 --> N9; + N29 --> N10; + N29 --> N11; + N29 --> N14; + N29 --> N15; + N29 --> N16; + N29 --> N17; + N29 --> N18; + N29 --> N19; + N29 --> N20; + N29 --> N21; + N29 --> N22; + N29 --> N23; + N29 --> N24; + N29 --> N25; + N29 --> N26; + N29 --> N27; + N29 --> N28; + N29 -.-> N2; + N29 -.-> N1; + N29 -.-> N0; + N29 -.-> N3; + N5 --> N3; + N12 --> N11; + N12 --> N10; + N3 --> N2; + N3 --> N1; + N4 --> N0; + N4 --> N3; + N30 --> N6; + N30 --> N7; + N30 --> N8; + N30 --> N9; + N30 --> N10; + N30 --> N11; + N30 --> N13; + N30 --> N14; + N30 --> N15; + N30 --> N16; + N30 --> N17; + N30 --> N18; + N30 --> N19; + N30 --> N20; + N30 --> N21; + N30 --> N22; + N30 --> N23; + N30 --> N24; + N30 --> N25; + N30 --> N26; + N30 --> N27; + N30 --> N28; + N30 --> N29; ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, + ModuleEvaluation: 30, Export( "IPC", - ): 2, + ): 12, + Exports: 31, + Export( + "structuredError", + ): 5, } ``` @@ -1656,125 +2053,42 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -"module evaluation"; import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; -}; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); export { createConnection } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { improveConsole } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 1 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { structuredError }; ``` ## Part 2 ```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { getProperError } from "./error"; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { IPC }; ``` ## Part 3 ```js -import "node:net"; - -``` -## Part 4 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 2 }; -import "../compiled/stacktrace-parser"; - -``` -## Part 5 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import { parseStackTrace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -import "./error"; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { getProperError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; function structuredError(e) { e = getProperError(e); return { @@ -1783,72 +2097,25 @@ function structuredError(e) { stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] }; } -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { structuredError } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 4 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -const PORT = process.argv[2]; -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { PORT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 3 }; - -``` -## Part 8 -```js import { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { PORT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { createConnection } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; function createIpc(port) { const socket = createConnection(port, "127.0.0.1"); const packetQueue = []; @@ -1975,135 +2242,199 @@ function createIpc(port) { } }; } -const IPC = createIpc(parseInt(PORT, 10)); -export { createConnection } from "__TURBOPACK_VAR__" assert { +export { createIpc } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { createIpc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +export { structuredError }; + +``` +## Part 6 +```js +import "node:net"; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -export { IPC } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "../compiled/stacktrace-parser"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; +import "./error"; ``` -## Merged (module eval) +## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; +const PORT = process.argv[2]; +export { PORT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 1 }; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -"module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { createIpc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { PORT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; -export { improveConsole } from "__TURBOPACK_VAR__" assert { +const IPC = createIpc(parseInt(PORT, 10)); +export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, - Export( - "IPC", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 +## Part 11 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 10 }; -"module evaluation"; process.on("uncaughtException", (err)=>{ IPC.sendError(err); }); + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { IPC }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2118,316 +2449,2536 @@ const improveConsole = (name, stream, addStack)=>{ stdio.write("TURBOPACK_OUTPUT_E\n"); }; }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); export { improveConsole } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 1 +## Part 14 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -export { structuredError }; - -``` -## Part 2 -```js -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -export { IPC }; - -``` -## Part 3 -```js -import "node:net"; - -``` -## Part 4 -```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; -import "../compiled/stacktrace-parser"; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("error", "stderr", true); ``` -## Part 5 +## Part 15 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 13 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 6 }; -import "./error"; - -``` -## Part 6 -```js -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -function structuredError(e) { - e = getProperError(e); - return { - name: e.name, - message: e.message, - stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] - }; -} -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; -export { structuredError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; - -``` -## Part 7 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 11 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 14 }; -const PORT = process.argv[2]; -export { PORT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("warn", "stderr", true); ``` -## Part 8 +## Part 16 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -import { PORT } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 10 }; -import { createConnection } from "node:net"; -function createIpc(port) { - const socket = createConnection(port, "127.0.0.1"); - const packetQueue = []; - const recvPromiseResolveQueue = []; - function pushPacket(packet) { - const recvPromiseResolve = recvPromiseResolveQueue.shift(); - if (recvPromiseResolve != null) { - recvPromiseResolve(JSON.parse(packet.toString("utf8"))); - } else { - packetQueue.push(packet); - } - } - let state = { - type: "waiting" - }; - let buffer = Buffer.alloc(0); - socket.once("connect", ()=>{ - socket.on("data", (chunk)=>{ - buffer = Buffer.concat([ - buffer, - chunk - ]); - loop: while(true){ - switch(state.type){ - case "waiting": - { - if (buffer.length >= 4) { - const length = buffer.readUInt32BE(0); - buffer = buffer.subarray(4); - state = { - type: "packet", - length - }; - } else { - break loop; - } - break; - } - case "packet": - { - if (buffer.length >= state.length) { - const packet = buffer.subarray(0, state.length); - buffer = buffer.subarray(state.length); - state = { - type: "waiting" - }; - pushPacket(packet); - } else { - break loop; - } - break; - } - } - } - }); - }); - socket.once("close", ()=>{ - process.exit(0); - }); - function send(message) { - const packet = Buffer.from(JSON.stringify(message), "utf8"); - const length = Buffer.alloc(4); - length.writeUInt32BE(packet.length); - socket.write(length); - return new Promise((resolve, reject)=>{ - socket.write(packet, (err)=>{ - process.stderr.write(`TURBOPACK_OUTPUT_D\n`); - process.stdout.write(`TURBOPACK_OUTPUT_D\n`); - if (err != null) { - reject(err); - } else { - resolve(); - } - }); - }); - } - function sendReady() { - const length = Buffer.from([ - 0, - 0, - 0, - 0 - ]); - return new Promise((resolve, reject)=>{ - socket.write(length, (err)=>{ - process.stderr.write(`TURBOPACK_OUTPUT_D\n`); - process.stdout.write(`TURBOPACK_OUTPUT_D\n`); - if (err != null) { - reject(err); - } else { - resolve(); - } - }); - }); - } - return { - async recv () { - const packet = packetQueue.shift(); - if (packet != null) { - return JSON.parse(packet.toString("utf8")); - } - const result = await new Promise((resolve)=>{ - recvPromiseResolveQueue.push((result)=>{ - resolve(result); - }); - }); - return result; - }, - send (message) { - return send(message); - }, - sendReady, - async sendError (error) { - try { - await send({ - type: "error", - ...structuredError(error) - }); - } catch (err) { - console.error("failed to send error back to rust:", err); - process.exit(1); - } - process.exit(0); - } - }; -} -const IPC = createIpc(parseInt(PORT, 10)); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 }; -export { createIpc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 }; -export { IPC } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("count", "stdout", true); ``` -## Merged (module eval) +## Part 17 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("trace", "stderr", false); + +``` +## Part 18 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 13 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -"module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); -export { improveConsole } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("group", "stdout", true); + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("groupCollapsed", "stdout", true); + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("table", "stdout", true); + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("debug", "stdout", true); + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("info", "stdout", true); + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dir", "stdout", true); + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dirxml", "stdout", true); + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeEnd", "stdout", true); + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeLog", "stdout", true); + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeStamp", "stdout", true); + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("assert", "stderr", true); + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +"module evaluation"; + +``` +## Part 31 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 30, + Export( + "IPC", + ): 12, + Exports: 31, + Export( + "structuredError", + ): 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { createConnection } from "node:net"; +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { getProperError } from "./error"; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { parseStackTrace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { getProperError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function structuredError(e) { + e = getProperError(e); + return { + name: e.name, + message: e.message, + stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] + }; +} +export { structuredError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { structuredError }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { createConnection } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function createIpc(port) { + const socket = createConnection(port, "127.0.0.1"); + const packetQueue = []; + const recvPromiseResolveQueue = []; + function pushPacket(packet) { + const recvPromiseResolve = recvPromiseResolveQueue.shift(); + if (recvPromiseResolve != null) { + recvPromiseResolve(JSON.parse(packet.toString("utf8"))); + } else { + packetQueue.push(packet); + } + } + let state = { + type: "waiting" + }; + let buffer = Buffer.alloc(0); + socket.once("connect", ()=>{ + socket.on("data", (chunk)=>{ + buffer = Buffer.concat([ + buffer, + chunk + ]); + loop: while(true){ + switch(state.type){ + case "waiting": + { + if (buffer.length >= 4) { + const length = buffer.readUInt32BE(0); + buffer = buffer.subarray(4); + state = { + type: "packet", + length + }; + } else { + break loop; + } + break; + } + case "packet": + { + if (buffer.length >= state.length) { + const packet = buffer.subarray(0, state.length); + buffer = buffer.subarray(state.length); + state = { + type: "waiting" + }; + pushPacket(packet); + } else { + break loop; + } + break; + } + } + } + }); + }); + socket.once("close", ()=>{ + process.exit(0); + }); + function send(message) { + const packet = Buffer.from(JSON.stringify(message), "utf8"); + const length = Buffer.alloc(4); + length.writeUInt32BE(packet.length); + socket.write(length); + return new Promise((resolve, reject)=>{ + socket.write(packet, (err)=>{ + process.stderr.write(`TURBOPACK_OUTPUT_D\n`); + process.stdout.write(`TURBOPACK_OUTPUT_D\n`); + if (err != null) { + reject(err); + } else { + resolve(); + } + }); + }); + } + function sendReady() { + const length = Buffer.from([ + 0, + 0, + 0, + 0 + ]); + return new Promise((resolve, reject)=>{ + socket.write(length, (err)=>{ + process.stderr.write(`TURBOPACK_OUTPUT_D\n`); + process.stdout.write(`TURBOPACK_OUTPUT_D\n`); + if (err != null) { + reject(err); + } else { + resolve(); + } + }); + }); + } + return { + async recv () { + const packet = packetQueue.shift(); + if (packet != null) { + return JSON.parse(packet.toString("utf8")); + } + const result = await new Promise((resolve)=>{ + recvPromiseResolveQueue.push((result)=>{ + resolve(result); + }); + }); + return result; + }, + send (message) { + return send(message); + }, + sendReady, + async sendError (error) { + try { + await send({ + type: "error", + ...structuredError(error) + }); + } catch (err) { + console.error("failed to send error back to rust:", err); + process.exit(1); + } + process.exit(0); + } + }; +} +export { createIpc } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "node:net"; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "../compiled/stacktrace-parser"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "./error"; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const PORT = process.argv[2]; +export { PORT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { createIpc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { PORT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const IPC = createIpc(parseInt(PORT, 10)); +export { IPC } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { IPC }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const improveConsole = (name, stream, addStack)=>{ + const original = console[name]; + const stdio = process[stream]; + console[name] = (...args)=>{ + stdio.write(`TURBOPACK_OUTPUT_B\n`); + original(...args); + if (addStack) { + const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; + stdio.write("TURBOPACK_OUTPUT_S\n"); + stdio.write(stack); + } + stdio.write("TURBOPACK_OUTPUT_E\n"); + }; +}; +export { improveConsole } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("error", "stderr", true); + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("warn", "stderr", true); + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("count", "stdout", true); + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("trace", "stderr", false); + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("log", "stdout", true); + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("group", "stdout", true); + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("groupCollapsed", "stdout", true); + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("table", "stdout", true); + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("debug", "stdout", true); + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("info", "stdout", true); + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dir", "stdout", true); + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dirxml", "stdout", true); + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeEnd", "stdout", true); + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeLog", "stdout", true); + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeStamp", "stdout", true); + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("assert", "stderr", true); + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 31 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md index 6426c3f4376c8..7b7bcbb87484e 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md @@ -150,17 +150,17 @@ graph TD Item13["export x"]; Item14; Item14["export y"]; - Item2 -.-> Item1; - Item3 -.-> Item1; - Item4 --> Item1; + Item2 --> Item1; + Item3 --> Item1; Item4 --> Item3; + Item4 --> Item1; Item5 -.-> Item4; - Item5 -.-> Item1; + Item5 --> Item1; Item6 -.-> Item4; - Item6 -.-> Item1; - Item7 --> Item1; + Item6 --> Item1; Item7 --> Item3; Item7 --> Item6; + Item7 --> Item1; Item7 -.-> Item4; Item8 --> Item7; Item8 --> Item1; @@ -197,17 +197,17 @@ graph TD Item13["export x"]; Item14; Item14["export y"]; - Item2 -.-> Item1; - Item3 -.-> Item1; - Item4 --> Item1; + Item2 --> Item1; + Item3 --> Item1; Item4 --> Item3; + Item4 --> Item1; Item5 -.-> Item4; - Item5 -.-> Item1; + Item5 --> Item1; Item6 -.-> Item4; - Item6 -.-> Item1; - Item7 --> Item1; + Item6 --> Item1; Item7 --> Item3; Item7 --> Item6; + Item7 --> Item1; Item7 -.-> Item4; Item8 --> Item7; Item8 --> Item1; @@ -244,17 +244,17 @@ graph TD Item13["export x"]; Item14; Item14["export y"]; - Item2 -.-> Item1; - Item3 -.-> Item1; - Item4 --> Item1; + Item2 --> Item1; + Item3 --> Item1; Item4 --> Item3; + Item4 --> Item1; Item5 -.-> Item4; - Item5 -.-> Item1; + Item5 --> Item1; Item6 -.-> Item4; - Item6 -.-> Item1; - Item7 --> Item1; + Item6 --> Item1; Item7 --> Item3; Item7 --> Item6; + Item7 --> Item1; Item7 -.-> Item4; Item8 --> Item7; Item8 --> Item1; @@ -275,36 +275,60 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("x", #2), "x"))]"]; - N2["Items: [ItemId(Export(("y", #2), "y")), ItemId(11, VarDeclarator(0))]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N4["Items: [ItemId(2, Normal)]"]; - N5["Items: [ItemId(3, Normal)]"]; - N6["Items: [ItemId(5, Normal), ItemId(6, Normal), ItemId(7, Normal), ItemId(8, Normal), ItemId(9, Normal)]"]; - N0 --> N5; - N1 --> N6; - N1 --> N3; - N2 --> N6; - N2 --> N3; - N4 --> N3; - N5 --> N3; + N0["Items: [ItemId(0, VarDeclarator(0))]"]; + N1["Items: [ItemId(2, Normal)]"]; + N2["Items: [ItemId(3, Normal)]"]; + N3["Items: [ItemId(ModuleEvaluation)]"]; + N4["Items: [ItemId(5, Normal)]"]; + N5["Items: [ItemId(6, Normal)]"]; + N6["Items: [ItemId(7, Normal)]"]; + N7["Items: [ItemId(8, Normal)]"]; + N8["Items: [ItemId(9, Normal)]"]; + N9["Items: [ItemId(Export(("x", #2), "x"))]"]; + N10["Items: [ItemId(11, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("y", #2), "y"))]"]; + N12["Items: [ItemId(4, Normal)]"]; + N13["Items: [ItemId(1, Normal)]"]; + N13 --> N0; + N1 --> N0; + N2 --> N1; + N2 --> N0; + N12 -.-> N2; + N12 --> N0; + N4 -.-> N2; + N4 --> N0; + N5 --> N1; N5 --> N4; + N5 --> N0; + N5 -.-> N2; N6 --> N5; - N6 --> N3; - N6 --> N4; + N6 --> N0; + N6 -.-> N2; + N7 --> N6; + N7 --> N0; + N7 -.-> N2; + N8 --> N7; + N8 --> N0; + N8 -.-> N2; + N10 --> N8; + N10 --> N0; + N9 --> N8; + N9 --> N0; + N11 --> N10; + N3 --> N2; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 3, + Exports: 14, Export( "y", - ): 2, + ): 11, Export( "x", - ): 1, + ): 9, } ``` @@ -312,63 +336,77 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +let x = 1; +export { x } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 0 }; import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; -export { x as x }; +x = 3; ``` ## Part 2 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; -import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { y }; -const y = x; -export { y } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +console.log(x); ``` ## Part 3 ```js -let x = 1; -export { x } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; +"module evaluation"; ``` ## Part 4 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; -x = 3; +x = 5; ``` ## Part 5 ```js -import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -console.log(x); +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x += 6; ``` ## Part 6 @@ -376,23 +414,133 @@ console.log(x); import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 2 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -x = 5; -x += 6; x += 7; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; x += 8; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; x += 9; +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { x as x }; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const y = x; +export { y } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { y }; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x = 4; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x = 2; + +``` +## Part 14 +```js +export { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export x" +}; +export { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export y" +}; + ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; "module evaluation"; @@ -401,13 +549,14 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 12, + Exports: 14, Export( "y", - ): 2, + ): 9, Export( "x", - ): 1, + ): 10, } ``` @@ -415,79 +564,194 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js +let x = 1; +export { x } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x = 5; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x = 4; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x = 3; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x += 6; + +``` +## Part 5 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -"module evaluation"; -console.log(x); +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +x += 7; ``` -## Part 1 +## Part 6 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; -export { x as x }; +x += 8; ``` -## Part 2 +## Part 7 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 +}; +x += 9; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { y }; const y = x; export { y } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 3 +## Part 9 ```js -let x = 1; -export { x } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; +import { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { y }; ``` -## Part 4 +## Part 10 ```js -x = 3; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { x as x }; ``` -## Part 5 +## Part 11 ```js -import { x } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -x = 5; -x += 6; -x += 7; -x += 8; -x += 9; +import { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +console.log(x); ``` -## Merged (module eval) +## Part 12 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +"module evaluation"; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { x } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 +}; +x = 2; + +``` +## Part 14 +```js +export { y } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export y" +}; +export { x } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export x" }; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 11 }; "module evaluation"; -console.log(x); ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md index adbe2ec572da3..bd16595f615f3 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md @@ -140,10 +140,10 @@ export const run = async (moduleFactory)=>{ ``` +- Side effects - Declares: `run` -- Reads (eventual): `ipc`, `queue` -- Write: `run` -- Write (eventual): `ipc`, `queue` +- Reads: `ipc`, `queue` +- Write: `ipc`, `queue`, `run` # Phase 1 ```mermaid @@ -171,6 +171,9 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item5 --> Item1; Item7 --> Item5; ``` # Phase 3 @@ -186,9 +189,10 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; ``` # Phase 4 ```mermaid @@ -203,25 +207,40 @@ graph TD Item7; Item7["export run"]; Item3 --> Item2; - Item7 --> Item5; Item5 --> Item3; Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; Item6 --> Item1; + Item6 --> Item5; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule)]"]; - N1["Items: [ItemId(Export(("run", #2), "run")), ItemId(0, ImportBinding(0)), ItemId(1, VarDeclarator(0)), ItemId(2, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; + N0["Items: [ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(2, VarDeclarator(0))]"]; + N2["Items: [ItemId(0, ImportBinding(0))]"]; + N3["Items: [ItemId(1, VarDeclarator(0))]"]; + N4["Items: [ItemId(3, VarDeclarator(0))]"]; + N5["Items: [ItemId(ModuleEvaluation)]"]; + N6["Items: [ItemId(Export(("run", #2), "run"))]"]; + N3 --> N2; + N4 --> N3; + N4 --> N1; + N4 --> N0; + N6 --> N4; + N5 --> N0; + N5 --> N4; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 5, + Exports: 7, Export( "run", - ): 1, + ): 6, } ``` @@ -229,16 +248,56 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; import "./index"; ``` ## Part 1 ```js -export { run }; +const queue = []; +export { queue } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js import { IPC } from "./index"; +export { IPC } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; const ipc = IPC; -const queue = []; +export { ipc } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { ipc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { queue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; const run = async (moduleFactory)=>{ let nextId = 1; const requests = new Map(); @@ -330,23 +389,48 @@ const run = async (moduleFactory)=>{ } } }; -export { IPC } from "__TURBOPACK_VAR__" assert { +export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { ipc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { queue } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { run } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +"module evaluation"; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { run }; + +``` +## Part 7 +```js +export { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export run" }; ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; "module evaluation"; ``` @@ -354,10 +438,11 @@ import "./index"; ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 5, + Exports: 7, Export( "run", - ): 1, + ): 6, } ``` @@ -365,16 +450,56 @@ import "./index"; # Modules (prod) ## Part 0 ```js -"module evaluation"; import "./index"; ``` ## Part 1 ```js -export { run }; +const queue = []; +export { queue } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js import { IPC } from "./index"; +export { IPC } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; const ipc = IPC; -const queue = []; +export { ipc } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { ipc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { queue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; const run = async (moduleFactory)=>{ let nextId = 1; const requests = new Map(); @@ -466,23 +591,48 @@ const run = async (moduleFactory)=>{ } } }; -export { IPC } from "__TURBOPACK_VAR__" assert { +export { run } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { ipc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { queue } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { run } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +"module evaluation"; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { run }; + +``` +## Part 7 +```js +export { run } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export run" }; ``` ## Merged (module eval) ```js -import "./index"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; "module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md index 5220a3ffac6a3..de4f99770472e 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md @@ -251,8 +251,8 @@ process.on("uncaughtException", (err)=>{ ``` - Side effects -- Reads (eventual): `IPC` -- Write (eventual): `IPC` +- Reads: `IPC` +- Write: `IPC` ## Item 12: Stmt 8, `VarDeclarator(0)` @@ -274,6 +274,7 @@ const improveConsole = (name, stream, addStack)=>{ ``` +- Side effects - Declares: `improveConsole` - Write: `improveConsole` @@ -534,15 +535,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -840,6 +851,7 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; ``` # Phase 3 @@ -898,15 +910,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1204,12 +1226,12 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; ``` # Phase 4 ```mermaid @@ -1267,15 +1289,25 @@ graph TD Item10 -.-> Item5; Item10 -.-> Item4; Item10 -.-> Item7; + Item11 --> Item10; Item11 --> Item1; Item11 --> Item2; Item11 --> Item3; Item11 --> Item9; - Item11 --> Item10; Item11 -.-> Item6; Item11 -.-> Item5; Item11 -.-> Item4; Item11 -.-> Item7; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item11; + Item12 -.-> Item6; + Item12 -.-> Item5; + Item12 -.-> Item4; + Item12 -.-> Item7; Item13 --> Item12; Item13 --> Item1; Item13 --> Item2; @@ -1573,18 +1605,19 @@ graph TD Item28 -.-> Item4; Item28 -.-> Item7; Item30 --> Item7; + Item31 --> Item11; Item31 --> Item10; Item7 --> Item6; Item7 --> Item5; Item8 --> Item4; Item8 --> Item7; - Item11 -.-> Item31; Item29 --> Item1; Item29 --> Item2; Item29 --> Item3; Item29 --> Item9; Item29 --> Item10; Item29 --> Item11; + Item29 --> Item12; Item29 --> Item13; Item29 --> Item14; Item29 --> Item15; @@ -1605,50 +1638,414 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(7, Normal), ItemId(8, VarDeclarator(0)), ItemId(9, Normal), ItemId(10, Normal), ItemId(11, Normal), ItemId(12, Normal), ItemId(13, Normal), ItemId(14, Normal), ItemId(15, Normal), ItemId(16, Normal), ItemId(17, Normal), ItemId(18, Normal), ItemId(19, Normal), ItemId(20, Normal), ItemId(21, Normal), ItemId(22, Normal), ItemId(23, Normal), ItemId(24, Normal)]"]; - N1["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; - N2["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; - N3["Items: [ItemId(0, ImportOfModule)]"]; - N4["Items: [ItemId(1, ImportOfModule)]"]; - N5["Items: [ItemId(2, ImportOfModule)]"]; - N6["Items: [ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(3, Normal)]"]; - N7["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(5, VarDeclarator(0))]"]; - N8["Items: [ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(2, ImportBinding(0)), ItemId(4, Normal), ItemId(6, VarDeclarator(0))]"]; - N0 --> N3; - N0 --> N4; - N0 --> N5; - N0 --> N7; - N0 --> N8; - N0 --> N6; - N0 --> N2; - N1 --> N6; - N2 --> N8; - N4 --> N3; - N5 --> N3; - N5 --> N4; - N6 --> N8; - N7 --> N3; - N7 --> N4; - N7 --> N5; - N7 --> N8; + N0["Items: [ItemId(0, ImportBinding(0))]"]; + N1["Items: [ItemId(1, ImportBinding(0))]"]; + N2["Items: [ItemId(2, ImportBinding(0))]"]; + N3["Items: [ItemId(3, Normal)]"]; + N4["Items: [ItemId(4, Normal)]"]; + N5["Items: [ItemId(Export(("structuredError", #2), "structuredError"))]"]; + N6["Items: [ItemId(0, ImportOfModule)]"]; + N7["Items: [ItemId(1, ImportOfModule)]"]; + N8["Items: [ItemId(2, ImportOfModule)]"]; + N9["Items: [ItemId(5, VarDeclarator(0))]"]; + N10["Items: [ItemId(6, VarDeclarator(0))]"]; + N11["Items: [ItemId(7, Normal)]"]; + N12["Items: [ItemId(Export(("IPC", #2), "IPC"))]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N14["Items: [ItemId(9, Normal)]"]; + N15["Items: [ItemId(10, Normal)]"]; + N16["Items: [ItemId(11, Normal)]"]; + N17["Items: [ItemId(12, Normal)]"]; + N18["Items: [ItemId(13, Normal)]"]; + N19["Items: [ItemId(14, Normal)]"]; + N20["Items: [ItemId(15, Normal)]"]; + N21["Items: [ItemId(16, Normal)]"]; + N22["Items: [ItemId(17, Normal)]"]; + N23["Items: [ItemId(18, Normal)]"]; + N24["Items: [ItemId(19, Normal)]"]; + N25["Items: [ItemId(20, Normal)]"]; + N26["Items: [ItemId(21, Normal)]"]; + N27["Items: [ItemId(22, Normal)]"]; + N28["Items: [ItemId(23, Normal)]"]; + N29["Items: [ItemId(24, Normal)]"]; + N30["Items: [ItemId(ModuleEvaluation)]"]; N7 --> N6; N8 --> N6; N8 --> N7; - N8 --> N3; - N8 --> N4; - N8 --> N5; + N9 --> N6; + N9 --> N7; + N9 --> N8; + N9 -.-> N2; + N9 -.-> N1; + N9 -.-> N0; + N9 -.-> N3; + N10 --> N4; + N10 --> N9; + N10 --> N6; + N10 --> N7; + N10 --> N8; + N10 -.-> N2; + N10 -.-> N1; + N10 -.-> N0; + N10 -.-> N3; + N11 --> N10; + N11 --> N6; + N11 --> N7; + N11 --> N8; + N11 --> N9; + N11 -.-> N2; + N11 -.-> N1; + N11 -.-> N0; + N11 -.-> N3; + N13 --> N6; + N13 --> N7; + N13 --> N8; + N13 --> N9; + N13 --> N10; + N13 --> N11; + N13 -.-> N2; + N13 -.-> N1; + N13 -.-> N0; + N13 -.-> N3; + N14 --> N13; + N14 --> N6; + N14 --> N7; + N14 --> N8; + N14 --> N9; + N14 --> N10; + N14 --> N11; + N14 -.-> N2; + N14 -.-> N1; + N14 -.-> N0; + N14 -.-> N3; + N15 --> N13; + N15 --> N6; + N15 --> N7; + N15 --> N8; + N15 --> N9; + N15 --> N10; + N15 --> N11; + N15 --> N14; + N15 -.-> N2; + N15 -.-> N1; + N15 -.-> N0; + N15 -.-> N3; + N16 --> N13; + N16 --> N6; + N16 --> N7; + N16 --> N8; + N16 --> N9; + N16 --> N10; + N16 --> N11; + N16 --> N14; + N16 --> N15; + N16 -.-> N2; + N16 -.-> N1; + N16 -.-> N0; + N16 -.-> N3; + N17 --> N13; + N17 --> N6; + N17 --> N7; + N17 --> N8; + N17 --> N9; + N17 --> N10; + N17 --> N11; + N17 --> N14; + N17 --> N15; + N17 --> N16; + N17 -.-> N2; + N17 -.-> N1; + N17 -.-> N0; + N17 -.-> N3; + N18 --> N13; + N18 --> N6; + N18 --> N7; + N18 --> N8; + N18 --> N9; + N18 --> N10; + N18 --> N11; + N18 --> N14; + N18 --> N15; + N18 --> N16; + N18 --> N17; + N18 -.-> N2; + N18 -.-> N1; + N18 -.-> N0; + N18 -.-> N3; + N19 --> N13; + N19 --> N6; + N19 --> N7; + N19 --> N8; + N19 --> N9; + N19 --> N10; + N19 --> N11; + N19 --> N14; + N19 --> N15; + N19 --> N16; + N19 --> N17; + N19 --> N18; + N19 -.-> N2; + N19 -.-> N1; + N19 -.-> N0; + N19 -.-> N3; + N20 --> N13; + N20 --> N6; + N20 --> N7; + N20 --> N8; + N20 --> N9; + N20 --> N10; + N20 --> N11; + N20 --> N14; + N20 --> N15; + N20 --> N16; + N20 --> N17; + N20 --> N18; + N20 --> N19; + N20 -.-> N2; + N20 -.-> N1; + N20 -.-> N0; + N20 -.-> N3; + N21 --> N13; + N21 --> N6; + N21 --> N7; + N21 --> N8; + N21 --> N9; + N21 --> N10; + N21 --> N11; + N21 --> N14; + N21 --> N15; + N21 --> N16; + N21 --> N17; + N21 --> N18; + N21 --> N19; + N21 --> N20; + N21 -.-> N2; + N21 -.-> N1; + N21 -.-> N0; + N21 -.-> N3; + N22 --> N13; + N22 --> N6; + N22 --> N7; + N22 --> N8; + N22 --> N9; + N22 --> N10; + N22 --> N11; + N22 --> N14; + N22 --> N15; + N22 --> N16; + N22 --> N17; + N22 --> N18; + N22 --> N19; + N22 --> N20; + N22 --> N21; + N22 -.-> N2; + N22 -.-> N1; + N22 -.-> N0; + N22 -.-> N3; + N23 --> N13; + N23 --> N6; + N23 --> N7; + N23 --> N8; + N23 --> N9; + N23 --> N10; + N23 --> N11; + N23 --> N14; + N23 --> N15; + N23 --> N16; + N23 --> N17; + N23 --> N18; + N23 --> N19; + N23 --> N20; + N23 --> N21; + N23 --> N22; + N23 -.-> N2; + N23 -.-> N1; + N23 -.-> N0; + N23 -.-> N3; + N24 --> N13; + N24 --> N6; + N24 --> N7; + N24 --> N8; + N24 --> N9; + N24 --> N10; + N24 --> N11; + N24 --> N14; + N24 --> N15; + N24 --> N16; + N24 --> N17; + N24 --> N18; + N24 --> N19; + N24 --> N20; + N24 --> N21; + N24 --> N22; + N24 --> N23; + N24 -.-> N2; + N24 -.-> N1; + N24 -.-> N0; + N24 -.-> N3; + N25 --> N13; + N25 --> N6; + N25 --> N7; + N25 --> N8; + N25 --> N9; + N25 --> N10; + N25 --> N11; + N25 --> N14; + N25 --> N15; + N25 --> N16; + N25 --> N17; + N25 --> N18; + N25 --> N19; + N25 --> N20; + N25 --> N21; + N25 --> N22; + N25 --> N23; + N25 --> N24; + N25 -.-> N2; + N25 -.-> N1; + N25 -.-> N0; + N25 -.-> N3; + N26 --> N13; + N26 --> N6; + N26 --> N7; + N26 --> N8; + N26 --> N9; + N26 --> N10; + N26 --> N11; + N26 --> N14; + N26 --> N15; + N26 --> N16; + N26 --> N17; + N26 --> N18; + N26 --> N19; + N26 --> N20; + N26 --> N21; + N26 --> N22; + N26 --> N23; + N26 --> N24; + N26 --> N25; + N26 -.-> N2; + N26 -.-> N1; + N26 -.-> N0; + N26 -.-> N3; + N27 --> N13; + N27 --> N6; + N27 --> N7; + N27 --> N8; + N27 --> N9; + N27 --> N10; + N27 --> N11; + N27 --> N14; + N27 --> N15; + N27 --> N16; + N27 --> N17; + N27 --> N18; + N27 --> N19; + N27 --> N20; + N27 --> N21; + N27 --> N22; + N27 --> N23; + N27 --> N24; + N27 --> N25; + N27 --> N26; + N27 -.-> N2; + N27 -.-> N1; + N27 -.-> N0; + N27 -.-> N3; + N28 --> N13; + N28 --> N6; + N28 --> N7; + N28 --> N8; + N28 --> N9; + N28 --> N10; + N28 --> N11; + N28 --> N14; + N28 --> N15; + N28 --> N16; + N28 --> N17; + N28 --> N18; + N28 --> N19; + N28 --> N20; + N28 --> N21; + N28 --> N22; + N28 --> N23; + N28 --> N24; + N28 --> N25; + N28 --> N26; + N28 --> N27; + N28 -.-> N2; + N28 -.-> N1; + N28 -.-> N0; + N28 -.-> N3; + N29 --> N13; + N29 --> N6; + N29 --> N7; + N29 --> N8; + N29 --> N9; + N29 --> N10; + N29 --> N11; + N29 --> N14; + N29 --> N15; + N29 --> N16; + N29 --> N17; + N29 --> N18; + N29 --> N19; + N29 --> N20; + N29 --> N21; + N29 --> N22; + N29 --> N23; + N29 --> N24; + N29 --> N25; + N29 --> N26; + N29 --> N27; + N29 --> N28; + N29 -.-> N2; + N29 -.-> N1; + N29 -.-> N0; + N29 -.-> N3; + N5 --> N3; + N12 --> N11; + N12 --> N10; + N3 --> N2; + N3 --> N1; + N4 --> N0; + N4 --> N3; + N30 --> N6; + N30 --> N7; + N30 --> N8; + N30 --> N9; + N30 --> N10; + N30 --> N11; + N30 --> N13; + N30 --> N14; + N30 --> N15; + N30 --> N16; + N30 --> N17; + N30 --> N18; + N30 --> N19; + N30 --> N20; + N30 --> N21; + N30 --> N22; + N30 --> N23; + N30 --> N24; + N30 --> N25; + N30 --> N26; + N30 --> N27; + N30 --> N28; + N30 --> N29; ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, + ModuleEvaluation: 30, Export( "IPC", - ): 2, + ): 12, + Exports: 31, + Export( + "structuredError", + ): 5, } ``` @@ -1656,125 +2053,42 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 -}; -"module evaluation"; import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; -}; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); export { createConnection } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { improveConsole } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 1 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { structuredError }; ``` ## Part 2 ```js -import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { getProperError } from "./error"; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { IPC }; ``` ## Part 3 ```js -import "node:net"; - -``` -## Part 4 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 2 }; -import "../compiled/stacktrace-parser"; - -``` -## Part 5 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import { parseStackTrace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -import "./error"; - -``` -## Part 6 -```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import { getProperError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; function structuredError(e) { e = getProperError(e); return { @@ -1783,72 +2097,25 @@ function structuredError(e) { stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] }; } -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { structuredError } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 4 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -const PORT = process.argv[2]; -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { PORT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 3 }; - -``` -## Part 8 -```js import { structuredError } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import { PORT } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { createConnection } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; function createIpc(port) { const socket = createConnection(port, "127.0.0.1"); const packetQueue = []; @@ -1975,135 +2242,199 @@ function createIpc(port) { } }; } -const IPC = createIpc(parseInt(PORT, 10)); -export { createConnection } from "__TURBOPACK_VAR__" assert { +export { createIpc } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { createIpc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +export { structuredError }; + +``` +## Part 6 +```js +import "node:net"; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -export { IPC } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "../compiled/stacktrace-parser"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; +import "./error"; ``` -## Merged (module eval) +## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; +const PORT = process.argv[2]; +export { PORT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 1 }; -import { createConnection } from "node:net"; -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -"module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { createIpc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { PORT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; -export { improveConsole } from "__TURBOPACK_VAR__" assert { +const IPC = createIpc(parseInt(PORT, 10)); +export { IPC } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -# Entrypoints - -``` -{ - ModuleEvaluation: 0, - Export( - "structuredError", - ): 1, - Export( - "IPC", - ): 2, -} -``` - - -# Modules (prod) -## Part 0 +## Part 11 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; import { IPC } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 10 }; -"module evaluation"; process.on("uncaughtException", (err)=>{ IPC.sendError(err); }); + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { IPC }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; const improveConsole = (name, stream, addStack)=>{ const original = console[name]; const stdio = process[stream]; @@ -2118,316 +2449,2536 @@ const improveConsole = (name, stream, addStack)=>{ stdio.write("TURBOPACK_OUTPUT_E\n"); }; }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); -improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); export { improveConsole } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 1 +## Part 14 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -export { structuredError }; - -``` -## Part 2 -```js -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -export { IPC }; - -``` -## Part 3 -```js -import "node:net"; - -``` -## Part 4 -```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; -import "../compiled/stacktrace-parser"; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("error", "stderr", true); ``` -## Part 5 +## Part 15 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 13 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 6 }; -import "./error"; - -``` -## Part 6 -```js -import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; -import { getProperError } from "./error"; -function structuredError(e) { - e = getProperError(e); - return { - name: e.name, - message: e.message, - stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] - }; -} -export { parseStackTrace } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { getProperError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; -export { structuredError } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 }; - -``` -## Part 7 -```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 11 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 14 }; -const PORT = process.argv[2]; -export { PORT } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("warn", "stderr", true); ``` -## Part 8 +## Part 16 ```js -import { structuredError } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -import { PORT } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 9 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 10 }; -import { createConnection } from "node:net"; -function createIpc(port) { - const socket = createConnection(port, "127.0.0.1"); - const packetQueue = []; - const recvPromiseResolveQueue = []; - function pushPacket(packet) { - const recvPromiseResolve = recvPromiseResolveQueue.shift(); - if (recvPromiseResolve != null) { - recvPromiseResolve(JSON.parse(packet.toString("utf8"))); - } else { - packetQueue.push(packet); - } - } - let state = { - type: "waiting" - }; - let buffer = Buffer.alloc(0); - socket.once("connect", ()=>{ - socket.on("data", (chunk)=>{ - buffer = Buffer.concat([ - buffer, - chunk - ]); - loop: while(true){ - switch(state.type){ - case "waiting": - { - if (buffer.length >= 4) { - const length = buffer.readUInt32BE(0); - buffer = buffer.subarray(4); - state = { - type: "packet", - length - }; - } else { - break loop; - } - break; - } - case "packet": - { - if (buffer.length >= state.length) { - const packet = buffer.subarray(0, state.length); - buffer = buffer.subarray(state.length); - state = { - type: "waiting" - }; - pushPacket(packet); - } else { - break loop; - } - break; - } - } - } - }); - }); - socket.once("close", ()=>{ - process.exit(0); - }); - function send(message) { - const packet = Buffer.from(JSON.stringify(message), "utf8"); - const length = Buffer.alloc(4); - length.writeUInt32BE(packet.length); - socket.write(length); - return new Promise((resolve, reject)=>{ - socket.write(packet, (err)=>{ - process.stderr.write(`TURBOPACK_OUTPUT_D\n`); - process.stdout.write(`TURBOPACK_OUTPUT_D\n`); - if (err != null) { - reject(err); - } else { - resolve(); - } - }); - }); - } - function sendReady() { - const length = Buffer.from([ - 0, - 0, - 0, - 0 - ]); - return new Promise((resolve, reject)=>{ - socket.write(length, (err)=>{ - process.stderr.write(`TURBOPACK_OUTPUT_D\n`); - process.stdout.write(`TURBOPACK_OUTPUT_D\n`); - if (err != null) { - reject(err); - } else { - resolve(); - } - }); - }); - } - return { - async recv () { - const packet = packetQueue.shift(); - if (packet != null) { - return JSON.parse(packet.toString("utf8")); - } - const result = await new Promise((resolve)=>{ - recvPromiseResolveQueue.push((result)=>{ - resolve(result); - }); - }); - return result; - }, - send (message) { - return send(message); - }, - sendReady, - async sendError (error) { - try { - await send({ - type: "error", - ...structuredError(error) - }); - } catch (err) { - console.error("failed to send error back to rust:", err); - process.exit(1); - } - process.exit(0); - } - }; -} -const IPC = createIpc(parseInt(PORT, 10)); -export { createConnection } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 }; -export { createIpc } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 }; -export { IPC } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("count", "stdout", true); ``` -## Merged (module eval) +## Part 17 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("trace", "stderr", false); + +``` +## Part 18 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 13 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { IPC } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -"module evaluation"; -process.on("uncaughtException", (err)=>{ - IPC.sendError(err); -}); -const improveConsole = (name, stream, addStack)=>{ - const original = console[name]; - const stdio = process[stream]; - console[name] = (...args)=>{ - stdio.write(`TURBOPACK_OUTPUT_B\n`); - original(...args); - if (addStack) { - const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; - stdio.write("TURBOPACK_OUTPUT_S\n"); - stdio.write(stack); - } - stdio.write("TURBOPACK_OUTPUT_E\n"); - }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 }; -improveConsole("error", "stderr", true); -improveConsole("warn", "stderr", true); -improveConsole("count", "stdout", true); -improveConsole("trace", "stderr", false); improveConsole("log", "stdout", true); -improveConsole("group", "stdout", true); -improveConsole("groupCollapsed", "stdout", true); -improveConsole("table", "stdout", true); -improveConsole("debug", "stdout", true); -improveConsole("info", "stdout", true); -improveConsole("dir", "stdout", true); -improveConsole("dirxml", "stdout", true); -improveConsole("timeEnd", "stdout", true); -improveConsole("timeLog", "stdout", true); -improveConsole("timeStamp", "stdout", true); -improveConsole("assert", "stderr", true); -export { improveConsole } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("group", "stdout", true); + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("groupCollapsed", "stdout", true); + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("table", "stdout", true); + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("debug", "stdout", true); + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("info", "stdout", true); + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dir", "stdout", true); + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dirxml", "stdout", true); + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeEnd", "stdout", true); + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeLog", "stdout", true); + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeStamp", "stdout", true); + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("assert", "stderr", true); + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +"module evaluation"; + +``` +## Part 31 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 30, + Export( + "IPC", + ): 12, + Exports: 31, + Export( + "structuredError", + ): 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { createConnection } from "node:net"; +export { createConnection } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { parse as parseStackTrace } from "../compiled/stacktrace-parser"; +export { parseStackTrace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { getProperError } from "./error"; +export { getProperError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { parseStackTrace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { getProperError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function structuredError(e) { + e = getProperError(e); + return { + name: e.name, + message: e.message, + stack: typeof e.stack === "string" ? parseStackTrace(e.stack) : [] + }; +} +export { structuredError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { structuredError }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { createConnection } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function createIpc(port) { + const socket = createConnection(port, "127.0.0.1"); + const packetQueue = []; + const recvPromiseResolveQueue = []; + function pushPacket(packet) { + const recvPromiseResolve = recvPromiseResolveQueue.shift(); + if (recvPromiseResolve != null) { + recvPromiseResolve(JSON.parse(packet.toString("utf8"))); + } else { + packetQueue.push(packet); + } + } + let state = { + type: "waiting" + }; + let buffer = Buffer.alloc(0); + socket.once("connect", ()=>{ + socket.on("data", (chunk)=>{ + buffer = Buffer.concat([ + buffer, + chunk + ]); + loop: while(true){ + switch(state.type){ + case "waiting": + { + if (buffer.length >= 4) { + const length = buffer.readUInt32BE(0); + buffer = buffer.subarray(4); + state = { + type: "packet", + length + }; + } else { + break loop; + } + break; + } + case "packet": + { + if (buffer.length >= state.length) { + const packet = buffer.subarray(0, state.length); + buffer = buffer.subarray(state.length); + state = { + type: "waiting" + }; + pushPacket(packet); + } else { + break loop; + } + break; + } + } + } + }); + }); + socket.once("close", ()=>{ + process.exit(0); + }); + function send(message) { + const packet = Buffer.from(JSON.stringify(message), "utf8"); + const length = Buffer.alloc(4); + length.writeUInt32BE(packet.length); + socket.write(length); + return new Promise((resolve, reject)=>{ + socket.write(packet, (err)=>{ + process.stderr.write(`TURBOPACK_OUTPUT_D\n`); + process.stdout.write(`TURBOPACK_OUTPUT_D\n`); + if (err != null) { + reject(err); + } else { + resolve(); + } + }); + }); + } + function sendReady() { + const length = Buffer.from([ + 0, + 0, + 0, + 0 + ]); + return new Promise((resolve, reject)=>{ + socket.write(length, (err)=>{ + process.stderr.write(`TURBOPACK_OUTPUT_D\n`); + process.stdout.write(`TURBOPACK_OUTPUT_D\n`); + if (err != null) { + reject(err); + } else { + resolve(); + } + }); + }); + } + return { + async recv () { + const packet = packetQueue.shift(); + if (packet != null) { + return JSON.parse(packet.toString("utf8")); + } + const result = await new Promise((resolve)=>{ + recvPromiseResolveQueue.push((result)=>{ + resolve(result); + }); + }); + return result; + }, + send (message) { + return send(message); + }, + sendReady, + async sendError (error) { + try { + await send({ + type: "error", + ...structuredError(error) + }); + } catch (err) { + console.error("failed to send error back to rust:", err); + process.exit(1); + } + process.exit(0); + } + }; +} +export { createIpc } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "node:net"; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "../compiled/stacktrace-parser"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "./error"; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +const PORT = process.argv[2]; +export { PORT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { createIpc } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { PORT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +const IPC = createIpc(parseInt(PORT, 10)); +export { IPC } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +process.on("uncaughtException", (err)=>{ + IPC.sendError(err); +}); + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { IPC }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const improveConsole = (name, stream, addStack)=>{ + const original = console[name]; + const stdio = process[stream]; + console[name] = (...args)=>{ + stdio.write(`TURBOPACK_OUTPUT_B\n`); + original(...args); + if (addStack) { + const stack = new Error().stack?.replace(/^.+\n.+\n/, "") + "\n"; + stdio.write("TURBOPACK_OUTPUT_S\n"); + stdio.write(stack); + } + stdio.write("TURBOPACK_OUTPUT_E\n"); + }; +}; +export { improveConsole } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("error", "stderr", true); + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("warn", "stderr", true); + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("count", "stdout", true); + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("trace", "stderr", false); + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("log", "stdout", true); + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("group", "stdout", true); + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("groupCollapsed", "stdout", true); + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("table", "stdout", true); + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("debug", "stdout", true); + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("info", "stdout", true); + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dir", "stdout", true); + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("dirxml", "stdout", true); + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeEnd", "stdout", true); + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeLog", "stdout", true); + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("timeStamp", "stdout", true); + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { improveConsole } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +improveConsole("assert", "stderr", true); + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 31 +```js +export { structuredError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export structuredError" +}; +export { IPC } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export IPC" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 19 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js new file mode 100644 index 0000000000000..2f8e8f3d19740 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md new file mode 100644 index 0000000000000..cc06bf3abb693 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/let-bug-1/output.md @@ -0,0 +1,545 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(2, VarDeclarator(0))]"]; + N2["Items: [ItemId(0, VarDeclarator(0))]"]; + N3["Items: [ItemId(4, Normal)]"]; + N4["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics"))]"]; + N5["Items: [ItemId(3, Normal)]"]; + N6["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader"))]"]; + N7["Items: [ItemId(ModuleEvaluation)]"]; + N6 --> N5; + N4 --> N3; + N5 --> N2; + N5 --> N1; + N5 --> N0; + N3 --> N2; + N3 --> N0; + N3 --> N1; +``` +# Entrypoints + +``` +{ + Export( + "getClientComponentLoaderMetrics", + ): 4, + ModuleEvaluation: 7, + Exports: 8, + Export( + "wrapClientComponentLoader", + ): 6, +} +``` + + +# Modules (dev) +## Part 0 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getClientComponentLoaderMetrics }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { wrapClientComponentLoader }; + +``` +## Part 7 +```js +"module evaluation"; + +``` +## Part 8 +```js +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + Export( + "getClientComponentLoaderMetrics", + ): 4, + ModuleEvaluation: 7, + Exports: 8, + Export( + "wrapClientComponentLoader", + ): 6, +} +``` + + +# Modules (prod) +## Part 0 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getClientComponentLoaderMetrics }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + const startTime = performance.now(); + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = startTime; + } + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { wrapClientComponentLoader }; + +``` +## Part 7 +```js +"module evaluation"; + +``` +## Part 8 +```js +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js new file mode 100644 index 0000000000000..831bb0474831b --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/input.js @@ -0,0 +1,44 @@ +let clientComponentLoadStart = 0; +let clientComponentLoadTimes = 0; +let clientComponentLoadCount = 0; +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md new file mode 100644 index 0000000000000..31feb044292c8 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/logger/output.md @@ -0,0 +1,545 @@ +# Items + +Count: 8 + +## Item 1: Stmt 0, `VarDeclarator(0)` + +```js +let clientComponentLoadStart = 0; + +``` + +- Declares: `clientComponentLoadStart` +- Write: `clientComponentLoadStart` + +## Item 2: Stmt 1, `VarDeclarator(0)` + +```js +let clientComponentLoadTimes = 0; + +``` + +- Declares: `clientComponentLoadTimes` +- Write: `clientComponentLoadTimes` + +## Item 3: Stmt 2, `VarDeclarator(0)` + +```js +let clientComponentLoadCount = 0; + +``` + +- Declares: `clientComponentLoadCount` +- Write: `clientComponentLoadCount` + +## Item 4: Stmt 3, `Normal` + +```js +export function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} + +``` + +- Hoisted +- Declares: `wrapClientComponentLoader` +- Reads (eventual): `clientComponentLoadStart` +- Write: `wrapClientComponentLoader` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadCount`, `clientComponentLoadTimes` + +## Item 5: Stmt 4, `Normal` + +```js +export function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} + +``` + +- Hoisted +- Declares: `getClientComponentLoaderMetrics` +- Reads (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` +- Write: `getClientComponentLoaderMetrics` +- Write (eventual): `clientComponentLoadStart`, `clientComponentLoadTimes`, `clientComponentLoadCount` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export wrapClientComponentLoader"]; + Item8; + Item8["export getClientComponentLoaderMetrics"]; + Item7 --> Item4; + Item8 --> Item5; + Item4 --> Item1; + Item4 --> Item3; + Item4 --> Item2; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(2, VarDeclarator(0))]"]; + N2["Items: [ItemId(0, VarDeclarator(0))]"]; + N3["Items: [ItemId(4, Normal)]"]; + N4["Items: [ItemId(Export(("getClientComponentLoaderMetrics", #2), "getClientComponentLoaderMetrics"))]"]; + N5["Items: [ItemId(3, Normal)]"]; + N6["Items: [ItemId(Export(("wrapClientComponentLoader", #2), "wrapClientComponentLoader"))]"]; + N7["Items: [ItemId(ModuleEvaluation)]"]; + N6 --> N5; + N4 --> N3; + N5 --> N2; + N5 --> N1; + N5 --> N0; + N3 --> N2; + N3 --> N0; + N3 --> N1; +``` +# Entrypoints + +``` +{ + Export( + "getClientComponentLoaderMetrics", + ): 4, + ModuleEvaluation: 7, + Exports: 8, + Export( + "wrapClientComponentLoader", + ): 6, +} +``` + + +# Modules (dev) +## Part 0 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getClientComponentLoaderMetrics }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { wrapClientComponentLoader }; + +``` +## Part 7 +```js +"module evaluation"; + +``` +## Part 8 +```js +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` +# Entrypoints + +``` +{ + Export( + "getClientComponentLoaderMetrics", + ): 4, + ModuleEvaluation: 7, + Exports: 8, + Export( + "wrapClientComponentLoader", + ): 6, +} +``` + + +# Modules (prod) +## Part 0 +```js +let clientComponentLoadTimes = 0; +export { clientComponentLoadTimes } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let clientComponentLoadCount = 0; +export { clientComponentLoadCount } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +let clientComponentLoadStart = 0; +export { clientComponentLoadStart } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function getClientComponentLoaderMetrics(options = {}) { + const metrics = clientComponentLoadStart === 0 ? undefined : { + clientComponentLoadStart, + clientComponentLoadTimes, + clientComponentLoadCount + }; + if (options.reset) { + clientComponentLoadStart = 0; + clientComponentLoadTimes = 0; + clientComponentLoadCount = 0; + } + return metrics; +} +export { getClientComponentLoaderMetrics } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getClientComponentLoaderMetrics }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadTimes } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { clientComponentLoadStart } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { clientComponentLoadCount } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function wrapClientComponentLoader(ComponentMod) { + if (!('performance' in globalThis)) { + return ComponentMod.__next_app__; + } + return { + require: (...args)=>{ + if (clientComponentLoadStart === 0) { + clientComponentLoadStart = performance.now(); + } + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.require(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + }, + loadChunk: (...args)=>{ + const startTime = performance.now(); + try { + clientComponentLoadCount += 1; + return ComponentMod.__next_app__.loadChunk(...args); + } finally{ + clientComponentLoadTimes += performance.now() - startTime; + } + } + }; +} +export { wrapClientComponentLoader } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { wrapClientComponentLoader }; + +``` +## Part 7 +```js +"module evaluation"; + +``` +## Part 8 +```js +export { getClientComponentLoaderMetrics } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getClientComponentLoaderMetrics" +}; +export { wrapClientComponentLoader } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export wrapClientComponentLoader" +}; + +``` +## Merged (module eval) +```js +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/input.js new file mode 100644 index 0000000000000..ed24f234dc66f --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/input.js @@ -0,0 +1,85 @@ +import style from './style'; +import compose from './compose'; +import { createUnaryUnit, getValue } from './spacing'; +import { handleBreakpoints } from './breakpoints'; +import responsivePropType from './responsivePropType'; +export const gap = props => { + if (props.gap !== undefined && props.gap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap'); + + const styleFromPropValue = propValue => ({ + gap: getValue(transformer, propValue) + }); + + return handleBreakpoints(props, props.gap, styleFromPropValue); + } + + return null; +}; +gap.propTypes = process.env.NODE_ENV !== 'production' ? { + gap: responsivePropType +} : {}; +gap.filterProps = ['gap']; +export const columnGap = props => { + if (props.columnGap !== undefined && props.columnGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap'); + + const styleFromPropValue = propValue => ({ + columnGap: getValue(transformer, propValue) + }); + + return handleBreakpoints(props, props.columnGap, styleFromPropValue); + } + + return null; +}; +columnGap.propTypes = process.env.NODE_ENV !== 'production' ? { + columnGap: responsivePropType +} : {}; +columnGap.filterProps = ['columnGap']; +export const rowGap = props => { + if (props.rowGap !== undefined && props.rowGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap'); + + const styleFromPropValue = propValue => ({ + rowGap: getValue(transformer, propValue) + }); + + return handleBreakpoints(props, props.rowGap, styleFromPropValue); + } + + return null; +}; +rowGap.propTypes = process.env.NODE_ENV !== 'production' ? { + rowGap: responsivePropType +} : {}; +rowGap.filterProps = ['rowGap']; +export const gridColumn = style({ + prop: 'gridColumn' +}); +export const gridRow = style({ + prop: 'gridRow' +}); +export const gridAutoFlow = style({ + prop: 'gridAutoFlow' +}); +export const gridAutoColumns = style({ + prop: 'gridAutoColumns' +}); +export const gridAutoRows = style({ + prop: 'gridAutoRows' +}); +export const gridTemplateColumns = style({ + prop: 'gridTemplateColumns' +}); +export const gridTemplateRows = style({ + prop: 'gridTemplateRows' +}); +export const gridTemplateAreas = style({ + prop: 'gridTemplateAreas' +}); +export const gridArea = style({ + prop: 'gridArea' +}); +const grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea); +export default grid; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/output.md new file mode 100644 index 0000000000000..0ff6fe58205f5 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/mui-sys/output.md @@ -0,0 +1,3335 @@ +# Items + +Count: 45 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import style from './style'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import style from './style'; + +``` + +- Hoisted +- Declares: `style` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import compose from './compose'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import compose from './compose'; + +``` + +- Hoisted +- Declares: `compose` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { createUnaryUnit, getValue } from './spacing'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { createUnaryUnit, getValue } from './spacing'; + +``` + +- Hoisted +- Declares: `createUnaryUnit` + +## Item 7: Stmt 2, `ImportBinding(1)` + +```js +import { createUnaryUnit, getValue } from './spacing'; + +``` + +- Hoisted +- Declares: `getValue` + +## Item 8: Stmt 3, `ImportOfModule` + +```js +import { handleBreakpoints } from './breakpoints'; + +``` + +- Hoisted +- Side effects + +## Item 9: Stmt 3, `ImportBinding(0)` + +```js +import { handleBreakpoints } from './breakpoints'; + +``` + +- Hoisted +- Declares: `handleBreakpoints` + +## Item 10: Stmt 4, `ImportOfModule` + +```js +import responsivePropType from './responsivePropType'; + +``` + +- Hoisted +- Side effects + +## Item 11: Stmt 4, `ImportBinding(0)` + +```js +import responsivePropType from './responsivePropType'; + +``` + +- Hoisted +- Declares: `responsivePropType` + +## Item 12: Stmt 5, `VarDeclarator(0)` + +```js +export const gap = (props)=>{ + if (props.gap !== undefined && props.gap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap'); + const styleFromPropValue = (propValue)=>({ + gap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.gap, styleFromPropValue); + } + return null; +}; + +``` + +- Side effects +- Declares: `gap` +- Reads: `createUnaryUnit`, `getValue`, `handleBreakpoints` +- Write: `gap` + +## Item 13: Stmt 6, `Normal` + +```js +gap.propTypes = process.env.NODE_ENV !== 'production' ? { + gap: responsivePropType +} : {}; + +``` + +- Side effects +- Reads: `gap`, `responsivePropType` +- Write: `gap` + +## Item 14: Stmt 7, `Normal` + +```js +gap.filterProps = [ + 'gap' +]; + +``` + +- Reads: `gap` +- Write: `gap` + +## Item 15: Stmt 8, `VarDeclarator(0)` + +```js +export const columnGap = (props)=>{ + if (props.columnGap !== undefined && props.columnGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap'); + const styleFromPropValue = (propValue)=>({ + columnGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.columnGap, styleFromPropValue); + } + return null; +}; + +``` + +- Side effects +- Declares: `columnGap` +- Reads: `createUnaryUnit`, `getValue`, `handleBreakpoints` +- Write: `columnGap` + +## Item 16: Stmt 9, `Normal` + +```js +columnGap.propTypes = process.env.NODE_ENV !== 'production' ? { + columnGap: responsivePropType +} : {}; + +``` + +- Side effects +- Reads: `columnGap`, `responsivePropType` +- Write: `columnGap` + +## Item 17: Stmt 10, `Normal` + +```js +columnGap.filterProps = [ + 'columnGap' +]; + +``` + +- Reads: `columnGap` +- Write: `columnGap` + +## Item 18: Stmt 11, `VarDeclarator(0)` + +```js +export const rowGap = (props)=>{ + if (props.rowGap !== undefined && props.rowGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap'); + const styleFromPropValue = (propValue)=>({ + rowGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.rowGap, styleFromPropValue); + } + return null; +}; + +``` + +- Side effects +- Declares: `rowGap` +- Reads: `createUnaryUnit`, `getValue`, `handleBreakpoints` +- Write: `rowGap` + +## Item 19: Stmt 12, `Normal` + +```js +rowGap.propTypes = process.env.NODE_ENV !== 'production' ? { + rowGap: responsivePropType +} : {}; + +``` + +- Side effects +- Reads: `rowGap`, `responsivePropType` +- Write: `rowGap` + +## Item 20: Stmt 13, `Normal` + +```js +rowGap.filterProps = [ + 'rowGap' +]; + +``` + +- Reads: `rowGap` +- Write: `rowGap` + +## Item 21: Stmt 14, `VarDeclarator(0)` + +```js +export const gridColumn = style({ + prop: 'gridColumn' +}); + +``` + +- Declares: `gridColumn` +- Reads: `style` +- Write: `gridColumn` + +## Item 22: Stmt 15, `VarDeclarator(0)` + +```js +export const gridRow = style({ + prop: 'gridRow' +}); + +``` + +- Declares: `gridRow` +- Reads: `style` +- Write: `gridRow` + +## Item 23: Stmt 16, `VarDeclarator(0)` + +```js +export const gridAutoFlow = style({ + prop: 'gridAutoFlow' +}); + +``` + +- Declares: `gridAutoFlow` +- Reads: `style` +- Write: `gridAutoFlow` + +## Item 24: Stmt 17, `VarDeclarator(0)` + +```js +export const gridAutoColumns = style({ + prop: 'gridAutoColumns' +}); + +``` + +- Declares: `gridAutoColumns` +- Reads: `style` +- Write: `gridAutoColumns` + +## Item 25: Stmt 18, `VarDeclarator(0)` + +```js +export const gridAutoRows = style({ + prop: 'gridAutoRows' +}); + +``` + +- Declares: `gridAutoRows` +- Reads: `style` +- Write: `gridAutoRows` + +## Item 26: Stmt 19, `VarDeclarator(0)` + +```js +export const gridTemplateColumns = style({ + prop: 'gridTemplateColumns' +}); + +``` + +- Declares: `gridTemplateColumns` +- Reads: `style` +- Write: `gridTemplateColumns` + +## Item 27: Stmt 20, `VarDeclarator(0)` + +```js +export const gridTemplateRows = style({ + prop: 'gridTemplateRows' +}); + +``` + +- Declares: `gridTemplateRows` +- Reads: `style` +- Write: `gridTemplateRows` + +## Item 28: Stmt 21, `VarDeclarator(0)` + +```js +export const gridTemplateAreas = style({ + prop: 'gridTemplateAreas' +}); + +``` + +- Declares: `gridTemplateAreas` +- Reads: `style` +- Write: `gridTemplateAreas` + +## Item 29: Stmt 22, `VarDeclarator(0)` + +```js +export const gridArea = style({ + prop: 'gridArea' +}); + +``` + +- Declares: `gridArea` +- Reads: `style` +- Write: `gridArea` + +## Item 30: Stmt 23, `VarDeclarator(0)` + +```js +const grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea); + +``` + +- Declares: `grid` +- Reads: `compose`, `gap`, `columnGap`, `rowGap`, `gridColumn`, `gridRow`, `gridAutoFlow`, `gridAutoColumns`, `gridAutoRows`, `gridTemplateColumns`, `gridTemplateRows`, `gridTemplateAreas`, `gridArea` +- Write: `grid` + +## Item 31: Stmt 24, `Normal` + +```js +export default grid; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `grid` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item19; + Item20; + Item21; + Item22; + Item23; + Item24; + Item25; + Item26; + Item27; + Item28; + Item29; + Item30; + Item31; + Item32; + Item32["ModuleEvaluation"]; + Item33; + Item33["export gap"]; + Item34; + Item34["export columnGap"]; + Item35; + Item35["export rowGap"]; + Item36; + Item36["export gridColumn"]; + Item37; + Item37["export gridRow"]; + Item38; + Item38["export gridAutoFlow"]; + Item39; + Item39["export gridAutoColumns"]; + Item40; + Item40["export gridAutoRows"]; + Item41; + Item41["export gridTemplateColumns"]; + Item42; + Item42["export gridTemplateRows"]; + Item43; + Item43["export gridTemplateAreas"]; + Item44; + Item44["export gridArea"]; + Item45; + Item45["export default"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item19; + Item20; + Item21; + Item22; + Item23; + Item24; + Item25; + Item26; + Item27; + Item28; + Item29; + Item30; + Item31; + Item32; + Item32["ModuleEvaluation"]; + Item33; + Item33["export gap"]; + Item34; + Item34["export columnGap"]; + Item35; + Item35["export rowGap"]; + Item36; + Item36["export gridColumn"]; + Item37; + Item37["export gridRow"]; + Item38; + Item38["export gridAutoFlow"]; + Item39; + Item39["export gridAutoColumns"]; + Item40; + Item40["export gridAutoRows"]; + Item41; + Item41["export gridTemplateColumns"]; + Item42; + Item42["export gridTemplateRows"]; + Item43; + Item43["export gridTemplateAreas"]; + Item44; + Item44["export gridArea"]; + Item45; + Item45["export default"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item8; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item12; + Item13 --> Item11; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item14 --> Item13; + Item14 --> Item12; + Item15 --> Item8; + Item15 --> Item9; + Item15 --> Item10; + Item15 --> Item1; + Item15 --> Item2; + Item15 --> Item3; + Item15 --> Item4; + Item15 --> Item5; + Item15 --> Item12; + Item15 --> Item13; + Item16 --> Item15; + Item16 --> Item11; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; + Item17 --> Item16; + Item17 --> Item15; + Item18 --> Item8; + Item18 --> Item9; + Item18 --> Item10; + Item18 --> Item1; + Item18 --> Item2; + Item18 --> Item3; + Item18 --> Item4; + Item18 --> Item5; + Item18 --> Item12; + Item18 --> Item13; + Item18 --> Item15; + Item18 --> Item16; + Item19 --> Item18; + Item19 --> Item11; + Item19 --> Item1; + Item19 --> Item2; + Item19 --> Item3; + Item19 --> Item4; + Item19 --> Item5; + Item19 --> Item12; + Item19 --> Item13; + Item19 --> Item15; + Item19 --> Item16; + Item20 --> Item19; + Item20 --> Item18; + Item21 --> Item6; + Item22 --> Item6; + Item23 --> Item6; + Item24 --> Item6; + Item25 --> Item6; + Item26 --> Item6; + Item27 --> Item6; + Item28 --> Item6; + Item29 --> Item6; + Item30 --> Item7; + Item30 --> Item14; + Item30 --> Item12; + Item30 --> Item17; + Item30 --> Item15; + Item30 --> Item20; + Item30 --> Item18; + Item30 --> Item21; + Item30 --> Item22; + Item30 --> Item23; + Item30 --> Item24; + Item30 --> Item25; + Item30 --> Item26; + Item30 --> Item27; + Item30 --> Item28; + Item30 --> Item29; + Item31 --> Item30; + Item31 --> Item1; + Item31 --> Item2; + Item31 --> Item3; + Item31 --> Item4; + Item31 --> Item5; + Item31 --> Item12; + Item31 --> Item13; + Item31 --> Item15; + Item31 --> Item16; + Item31 --> Item18; + Item31 --> Item19; + Item33 --> Item14; + Item33 --> Item12; + Item34 --> Item17; + Item34 --> Item15; + Item35 --> Item20; + Item35 --> Item18; + Item36 --> Item21; + Item37 --> Item22; + Item38 --> Item23; + Item39 --> Item24; + Item40 --> Item25; + Item41 --> Item26; + Item42 --> Item27; + Item43 --> Item28; + Item44 --> Item29; + Item45 --> Item31; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item19; + Item20; + Item21; + Item22; + Item23; + Item24; + Item25; + Item26; + Item27; + Item28; + Item29; + Item30; + Item31; + Item32; + Item32["ModuleEvaluation"]; + Item33; + Item33["export gap"]; + Item34; + Item34["export columnGap"]; + Item35; + Item35["export rowGap"]; + Item36; + Item36["export gridColumn"]; + Item37; + Item37["export gridRow"]; + Item38; + Item38["export gridAutoFlow"]; + Item39; + Item39["export gridAutoColumns"]; + Item40; + Item40["export gridAutoRows"]; + Item41; + Item41["export gridTemplateColumns"]; + Item42; + Item42["export gridTemplateRows"]; + Item43; + Item43["export gridTemplateAreas"]; + Item44; + Item44["export gridArea"]; + Item45; + Item45["export default"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item8; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item12; + Item13 --> Item11; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item14 --> Item13; + Item14 --> Item12; + Item15 --> Item8; + Item15 --> Item9; + Item15 --> Item10; + Item15 --> Item1; + Item15 --> Item2; + Item15 --> Item3; + Item15 --> Item4; + Item15 --> Item5; + Item15 --> Item12; + Item15 --> Item13; + Item16 --> Item15; + Item16 --> Item11; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; + Item17 --> Item16; + Item17 --> Item15; + Item18 --> Item8; + Item18 --> Item9; + Item18 --> Item10; + Item18 --> Item1; + Item18 --> Item2; + Item18 --> Item3; + Item18 --> Item4; + Item18 --> Item5; + Item18 --> Item12; + Item18 --> Item13; + Item18 --> Item15; + Item18 --> Item16; + Item19 --> Item18; + Item19 --> Item11; + Item19 --> Item1; + Item19 --> Item2; + Item19 --> Item3; + Item19 --> Item4; + Item19 --> Item5; + Item19 --> Item12; + Item19 --> Item13; + Item19 --> Item15; + Item19 --> Item16; + Item20 --> Item19; + Item20 --> Item18; + Item21 --> Item6; + Item22 --> Item6; + Item23 --> Item6; + Item24 --> Item6; + Item25 --> Item6; + Item26 --> Item6; + Item27 --> Item6; + Item28 --> Item6; + Item29 --> Item6; + Item30 --> Item7; + Item30 --> Item14; + Item30 --> Item12; + Item30 --> Item17; + Item30 --> Item15; + Item30 --> Item20; + Item30 --> Item18; + Item30 --> Item21; + Item30 --> Item22; + Item30 --> Item23; + Item30 --> Item24; + Item30 --> Item25; + Item30 --> Item26; + Item30 --> Item27; + Item30 --> Item28; + Item30 --> Item29; + Item31 --> Item30; + Item31 --> Item1; + Item31 --> Item2; + Item31 --> Item3; + Item31 --> Item4; + Item31 --> Item5; + Item31 --> Item12; + Item31 --> Item13; + Item31 --> Item15; + Item31 --> Item16; + Item31 --> Item18; + Item31 --> Item19; + Item33 --> Item14; + Item33 --> Item12; + Item34 --> Item17; + Item34 --> Item15; + Item35 --> Item20; + Item35 --> Item18; + Item36 --> Item21; + Item37 --> Item22; + Item38 --> Item23; + Item39 --> Item24; + Item40 --> Item25; + Item41 --> Item26; + Item42 --> Item27; + Item43 --> Item28; + Item44 --> Item29; + Item45 --> Item31; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item19; + Item20; + Item21; + Item22; + Item23; + Item24; + Item25; + Item26; + Item27; + Item28; + Item29; + Item30; + Item31; + Item32; + Item32["ModuleEvaluation"]; + Item33; + Item33["export gap"]; + Item34; + Item34["export columnGap"]; + Item35; + Item35["export rowGap"]; + Item36; + Item36["export gridColumn"]; + Item37; + Item37["export gridRow"]; + Item38; + Item38["export gridAutoFlow"]; + Item39; + Item39["export gridAutoColumns"]; + Item40; + Item40["export gridAutoRows"]; + Item41; + Item41["export gridTemplateColumns"]; + Item42; + Item42["export gridTemplateRows"]; + Item43; + Item43["export gridTemplateAreas"]; + Item44; + Item44["export gridArea"]; + Item45; + Item45["export default"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item8; + Item12 --> Item9; + Item12 --> Item10; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item12; + Item13 --> Item11; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item14 --> Item13; + Item14 --> Item12; + Item15 --> Item8; + Item15 --> Item9; + Item15 --> Item10; + Item15 --> Item1; + Item15 --> Item2; + Item15 --> Item3; + Item15 --> Item4; + Item15 --> Item5; + Item15 --> Item12; + Item15 --> Item13; + Item16 --> Item15; + Item16 --> Item11; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; + Item17 --> Item16; + Item17 --> Item15; + Item18 --> Item8; + Item18 --> Item9; + Item18 --> Item10; + Item18 --> Item1; + Item18 --> Item2; + Item18 --> Item3; + Item18 --> Item4; + Item18 --> Item5; + Item18 --> Item12; + Item18 --> Item13; + Item18 --> Item15; + Item18 --> Item16; + Item19 --> Item18; + Item19 --> Item11; + Item19 --> Item1; + Item19 --> Item2; + Item19 --> Item3; + Item19 --> Item4; + Item19 --> Item5; + Item19 --> Item12; + Item19 --> Item13; + Item19 --> Item15; + Item19 --> Item16; + Item20 --> Item19; + Item20 --> Item18; + Item21 --> Item6; + Item22 --> Item6; + Item23 --> Item6; + Item24 --> Item6; + Item25 --> Item6; + Item26 --> Item6; + Item27 --> Item6; + Item28 --> Item6; + Item29 --> Item6; + Item30 --> Item7; + Item30 --> Item14; + Item30 --> Item12; + Item30 --> Item17; + Item30 --> Item15; + Item30 --> Item20; + Item30 --> Item18; + Item30 --> Item21; + Item30 --> Item22; + Item30 --> Item23; + Item30 --> Item24; + Item30 --> Item25; + Item30 --> Item26; + Item30 --> Item27; + Item30 --> Item28; + Item30 --> Item29; + Item31 --> Item30; + Item31 --> Item1; + Item31 --> Item2; + Item31 --> Item3; + Item31 --> Item4; + Item31 --> Item5; + Item31 --> Item12; + Item31 --> Item13; + Item31 --> Item15; + Item31 --> Item16; + Item31 --> Item18; + Item31 --> Item19; + Item33 --> Item14; + Item33 --> Item12; + Item34 --> Item17; + Item34 --> Item15; + Item35 --> Item20; + Item35 --> Item18; + Item36 --> Item21; + Item37 --> Item22; + Item38 --> Item23; + Item39 --> Item24; + Item40 --> Item25; + Item41 --> Item26; + Item42 --> Item27; + Item43 --> Item28; + Item44 --> Item29; + Item45 --> Item31; + Item32 --> Item1; + Item32 --> Item2; + Item32 --> Item3; + Item32 --> Item4; + Item32 --> Item5; + Item32 --> Item12; + Item32 --> Item13; + Item32 --> Item15; + Item32 --> Item16; + Item32 --> Item18; + Item32 --> Item19; + Item32 --> Item31; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, ImportBinding(0))]"]; + N1["Items: [ItemId(0, ImportBinding(0))]"]; + N2["Items: [ItemId(22, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("gridArea", #2), "gridArea"))]"]; + N4["Items: [ItemId(21, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("gridTemplateAreas", #2), "gridTemplateAreas"))]"]; + N6["Items: [ItemId(20, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("gridTemplateRows", #2), "gridTemplateRows"))]"]; + N8["Items: [ItemId(19, VarDeclarator(0))]"]; + N9["Items: [ItemId(Export(("gridTemplateColumns", #2), "gridTemplateColumns"))]"]; + N10["Items: [ItemId(18, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("gridAutoRows", #2), "gridAutoRows"))]"]; + N12["Items: [ItemId(17, VarDeclarator(0))]"]; + N13["Items: [ItemId(Export(("gridAutoColumns", #2), "gridAutoColumns"))]"]; + N14["Items: [ItemId(16, VarDeclarator(0))]"]; + N15["Items: [ItemId(Export(("gridAutoFlow", #2), "gridAutoFlow"))]"]; + N16["Items: [ItemId(15, VarDeclarator(0))]"]; + N17["Items: [ItemId(Export(("gridRow", #2), "gridRow"))]"]; + N18["Items: [ItemId(14, VarDeclarator(0))]"]; + N19["Items: [ItemId(Export(("gridColumn", #2), "gridColumn"))]"]; + N20["Items: [ItemId(4, ImportBinding(0))]"]; + N21["Items: [ItemId(3, ImportBinding(0))]"]; + N22["Items: [ItemId(2, ImportBinding(1))]"]; + N23["Items: [ItemId(2, ImportBinding(0))]"]; + N24["Items: [ItemId(0, ImportOfModule)]"]; + N25["Items: [ItemId(1, ImportOfModule)]"]; + N26["Items: [ItemId(2, ImportOfModule)]"]; + N27["Items: [ItemId(3, ImportOfModule)]"]; + N28["Items: [ItemId(4, ImportOfModule)]"]; + N29["Items: [ItemId(5, VarDeclarator(0))]"]; + N30["Items: [ItemId(6, Normal)]"]; + N31["Items: [ItemId(8, VarDeclarator(0))]"]; + N32["Items: [ItemId(9, Normal)]"]; + N33["Items: [ItemId(11, VarDeclarator(0))]"]; + N34["Items: [ItemId(12, Normal)]"]; + N35["Items: [ItemId(13, Normal)]"]; + N36["Items: [ItemId(Export(("rowGap", #2), "rowGap"))]"]; + N37["Items: [ItemId(10, Normal)]"]; + N38["Items: [ItemId(Export(("columnGap", #2), "columnGap"))]"]; + N39["Items: [ItemId(7, Normal)]"]; + N40["Items: [ItemId(Export(("gap", #2), "gap"))]"]; + N41["Items: [ItemId(23, VarDeclarator(0))]"]; + N42["Items: [ItemId(24, Normal)]"]; + N43["Items: [ItemId(ModuleEvaluation)]"]; + N44["Items: [ItemId(Export(("__TURBOPACK__default__export__", #12), "default"))]"]; + N25 --> N24; + N26 --> N24; + N26 --> N25; + N27 --> N24; + N27 --> N25; + N27 --> N26; + N28 --> N24; + N28 --> N25; + N28 --> N26; + N28 --> N27; + N29 --> N23; + N29 --> N22; + N29 --> N21; + N29 --> N24; + N29 --> N25; + N29 --> N26; + N29 --> N27; + N29 --> N28; + N30 --> N29; + N30 --> N20; + N30 --> N24; + N30 --> N25; + N30 --> N26; + N30 --> N27; + N30 --> N28; + N39 --> N30; + N39 --> N29; + N31 --> N23; + N31 --> N22; + N31 --> N21; + N31 --> N24; + N31 --> N25; + N31 --> N26; + N31 --> N27; + N31 --> N28; + N31 --> N29; + N31 --> N30; + N32 --> N31; + N32 --> N20; + N32 --> N24; + N32 --> N25; + N32 --> N26; + N32 --> N27; + N32 --> N28; + N32 --> N29; + N32 --> N30; + N37 --> N32; + N37 --> N31; + N33 --> N23; + N33 --> N22; + N33 --> N21; + N33 --> N24; + N33 --> N25; + N33 --> N26; + N33 --> N27; + N33 --> N28; + N33 --> N29; + N33 --> N30; + N33 --> N31; + N33 --> N32; + N34 --> N33; + N34 --> N20; + N34 --> N24; + N34 --> N25; + N34 --> N26; + N34 --> N27; + N34 --> N28; + N34 --> N29; + N34 --> N30; + N34 --> N31; + N34 --> N32; + N35 --> N34; + N35 --> N33; + N18 --> N1; + N16 --> N1; + N14 --> N1; + N12 --> N1; + N10 --> N1; + N8 --> N1; + N6 --> N1; + N4 --> N1; + N2 --> N1; + N41 --> N0; + N41 --> N39; + N41 --> N29; + N41 --> N37; + N41 --> N31; + N41 --> N35; + N41 --> N33; + N41 --> N18; + N41 --> N16; + N41 --> N14; + N41 --> N12; + N41 --> N10; + N41 --> N8; + N41 --> N6; + N41 --> N4; + N41 --> N2; + N42 --> N41; + N42 --> N24; + N42 --> N25; + N42 --> N26; + N42 --> N27; + N42 --> N28; + N42 --> N29; + N42 --> N30; + N42 --> N31; + N42 --> N32; + N42 --> N33; + N42 --> N34; + N40 --> N39; + N40 --> N29; + N38 --> N37; + N38 --> N31; + N36 --> N35; + N36 --> N33; + N19 --> N18; + N17 --> N16; + N15 --> N14; + N13 --> N12; + N11 --> N10; + N9 --> N8; + N7 --> N6; + N5 --> N4; + N3 --> N2; + N44 --> N42; + N43 --> N24; + N43 --> N25; + N43 --> N26; + N43 --> N27; + N43 --> N28; + N43 --> N29; + N43 --> N30; + N43 --> N31; + N43 --> N32; + N43 --> N33; + N43 --> N34; + N43 --> N42; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 43, + Export( + "gap", + ): 40, + Export( + "gridTemplateColumns", + ): 9, + Export( + "gridAutoRows", + ): 11, + Export( + "columnGap", + ): 38, + Export( + "gridArea", + ): 3, + Exports: 45, + Export( + "gridAutoFlow", + ): 15, + Export( + "gridColumn", + ): 19, + Export( + "gridAutoColumns", + ): 13, + Export( + "rowGap", + ): 36, + Export( + "gridTemplateRows", + ): 7, + Export( + "gridTemplateAreas", + ): 5, + Export( + "default", + ): 44, + Export( + "gridRow", + ): 17, +} +``` + + +# Modules (dev) +## Part 0 +```js +import compose from './compose'; +export { compose } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import style from './style'; +export { style } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridArea = style({ + prop: 'gridArea' +}); +export { gridArea } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { gridArea }; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateAreas = style({ + prop: 'gridTemplateAreas' +}); +export { gridTemplateAreas } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { gridTemplateAreas }; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateRows = style({ + prop: 'gridTemplateRows' +}); +export { gridTemplateRows } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { gridTemplateRows }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateColumns = style({ + prop: 'gridTemplateColumns' +}); +export { gridTemplateColumns } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { gridTemplateColumns }; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoRows = style({ + prop: 'gridAutoRows' +}); +export { gridAutoRows } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { gridAutoRows }; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoColumns = style({ + prop: 'gridAutoColumns' +}); +export { gridAutoColumns } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { gridAutoColumns }; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoFlow = style({ + prop: 'gridAutoFlow' +}); +export { gridAutoFlow } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +export { gridAutoFlow }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridRow = style({ + prop: 'gridRow' +}); +export { gridRow } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { gridRow }; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridColumn = style({ + prop: 'gridColumn' +}); +export { gridColumn } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +export { gridColumn }; + +``` +## Part 20 +```js +import responsivePropType from './responsivePropType'; +export { responsivePropType } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import { handleBreakpoints } from './breakpoints'; +export { handleBreakpoints } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import { getValue } from './spacing'; +export { getValue } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 23 +```js +import { createUnaryUnit } from './spacing'; +export { createUnaryUnit } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 24 +```js +import './style'; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import './compose'; + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import './spacing'; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import './breakpoints'; + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import './responsivePropType'; + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const gap = (props)=>{ + if (props.gap !== undefined && props.gap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap'); + const styleFromPropValue = (propValue)=>({ + gap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.gap, styleFromPropValue); + } + return null; +}; +export { gap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +gap.propTypes = process.env.NODE_ENV !== 'production' ? { + gap: responsivePropType +} : {}; + +``` +## Part 31 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const columnGap = (props)=>{ + if (props.columnGap !== undefined && props.columnGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap'); + const styleFromPropValue = (propValue)=>({ + columnGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.columnGap, styleFromPropValue); + } + return null; +}; +export { columnGap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 32 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +columnGap.propTypes = process.env.NODE_ENV !== 'production' ? { + columnGap: responsivePropType +} : {}; + +``` +## Part 33 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const rowGap = (props)=>{ + if (props.rowGap !== undefined && props.rowGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap'); + const styleFromPropValue = (propValue)=>({ + rowGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.rowGap, styleFromPropValue); + } + return null; +}; +export { rowGap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 34 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +rowGap.propTypes = process.env.NODE_ENV !== 'production' ? { + rowGap: responsivePropType +} : {}; + +``` +## Part 35 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +rowGap.filterProps = [ + 'rowGap' +]; + +``` +## Part 36 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +export { rowGap }; + +``` +## Part 37 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +columnGap.filterProps = [ + 'columnGap' +]; + +``` +## Part 38 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 37 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +export { columnGap }; + +``` +## Part 39 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +gap.filterProps = [ + 'gap' +]; + +``` +## Part 40 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 39 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +export { gap }; + +``` +## Part 41 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 39 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 37 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { compose } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +const grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea); +export { grid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 42 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 41 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import { grid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 41 +}; +const __TURBOPACK__default__export__ = grid; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 43 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +"module evaluation"; + +``` +## Part 44 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 45 +```js +export { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridArea" +}; +export { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateAreas" +}; +export { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateRows" +}; +export { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateColumns" +}; +export { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoRows" +}; +export { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoColumns" +}; +export { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoFlow" +}; +export { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridRow" +}; +export { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridColumn" +}; +export { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export rowGap" +}; +export { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export columnGap" +}; +export { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gap" +}; +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 43, + Export( + "gap", + ): 40, + Export( + "gridTemplateColumns", + ): 9, + Export( + "gridAutoRows", + ): 11, + Export( + "columnGap", + ): 38, + Export( + "gridArea", + ): 3, + Exports: 45, + Export( + "gridAutoFlow", + ): 15, + Export( + "gridColumn", + ): 19, + Export( + "gridAutoColumns", + ): 13, + Export( + "rowGap", + ): 36, + Export( + "gridTemplateRows", + ): 7, + Export( + "gridTemplateAreas", + ): 5, + Export( + "default", + ): 44, + Export( + "gridRow", + ): 17, +} +``` + + +# Modules (prod) +## Part 0 +```js +import compose from './compose'; +export { compose } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import style from './style'; +export { style } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridArea = style({ + prop: 'gridArea' +}); +export { gridArea } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { gridArea }; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateAreas = style({ + prop: 'gridTemplateAreas' +}); +export { gridTemplateAreas } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { gridTemplateAreas }; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateRows = style({ + prop: 'gridTemplateRows' +}); +export { gridTemplateRows } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { gridTemplateRows }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridTemplateColumns = style({ + prop: 'gridTemplateColumns' +}); +export { gridTemplateColumns } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { gridTemplateColumns }; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoRows = style({ + prop: 'gridAutoRows' +}); +export { gridAutoRows } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { gridAutoRows }; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoColumns = style({ + prop: 'gridAutoColumns' +}); +export { gridAutoColumns } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { gridAutoColumns }; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridAutoFlow = style({ + prop: 'gridAutoFlow' +}); +export { gridAutoFlow } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +export { gridAutoFlow }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridRow = style({ + prop: 'gridRow' +}); +export { gridRow } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { gridRow }; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { style } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const gridColumn = style({ + prop: 'gridColumn' +}); +export { gridColumn } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +export { gridColumn }; + +``` +## Part 20 +```js +import responsivePropType from './responsivePropType'; +export { responsivePropType } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import { handleBreakpoints } from './breakpoints'; +export { handleBreakpoints } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import { getValue } from './spacing'; +export { getValue } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 23 +```js +import { createUnaryUnit } from './spacing'; +export { createUnaryUnit } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 24 +```js +import './style'; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import './compose'; + +``` +## Part 26 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import './spacing'; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import './breakpoints'; + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import './responsivePropType'; + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const gap = (props)=>{ + if (props.gap !== undefined && props.gap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap'); + const styleFromPropValue = (propValue)=>({ + gap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.gap, styleFromPropValue); + } + return null; +}; +export { gap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +gap.propTypes = process.env.NODE_ENV !== 'production' ? { + gap: responsivePropType +} : {}; + +``` +## Part 31 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const columnGap = (props)=>{ + if (props.columnGap !== undefined && props.columnGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap'); + const styleFromPropValue = (propValue)=>({ + columnGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.columnGap, styleFromPropValue); + } + return null; +}; +export { columnGap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 32 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +columnGap.propTypes = process.env.NODE_ENV !== 'production' ? { + columnGap: responsivePropType +} : {}; + +``` +## Part 33 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import { createUnaryUnit } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 23 +}; +import { getValue } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { handleBreakpoints } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +const rowGap = (props)=>{ + if (props.rowGap !== undefined && props.rowGap !== null) { + const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap'); + const styleFromPropValue = (propValue)=>({ + rowGap: getValue(transformer, propValue) + }); + return handleBreakpoints(props, props.rowGap, styleFromPropValue); + } + return null; +}; +export { rowGap } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 34 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { responsivePropType } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +rowGap.propTypes = process.env.NODE_ENV !== 'production' ? { + rowGap: responsivePropType +} : {}; + +``` +## Part 35 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +rowGap.filterProps = [ + 'rowGap' +]; + +``` +## Part 36 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +export { rowGap }; + +``` +## Part 37 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +columnGap.filterProps = [ + 'columnGap' +]; + +``` +## Part 38 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 37 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +export { columnGap }; + +``` +## Part 39 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +gap.filterProps = [ + 'gap' +]; + +``` +## Part 40 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 39 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +export { gap }; + +``` +## Part 41 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 39 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 37 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { compose } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +const grid = compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea); +export { grid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 42 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 41 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import { grid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 41 +}; +const __TURBOPACK__default__export__ = grid; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 43 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +"module evaluation"; + +``` +## Part 44 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 45 +```js +export { gridArea } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridArea" +}; +export { gridTemplateAreas } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateAreas" +}; +export { gridTemplateRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateRows" +}; +export { gridTemplateColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridTemplateColumns" +}; +export { gridAutoRows } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoRows" +}; +export { gridAutoColumns } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoColumns" +}; +export { gridAutoFlow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridAutoFlow" +}; +export { gridRow } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridRow" +}; +export { gridColumn } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gridColumn" +}; +export { rowGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export rowGap" +}; +export { columnGap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export columnGap" +}; +export { gap } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export gap" +}; +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 25 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 42 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md index add30fe1a5e6a..9425768ace9ba 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md @@ -45,6 +45,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 3 @@ -58,6 +59,7 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; + Item4 --> Item1; Item5 --> Item2; ``` # Phase 4 @@ -71,27 +73,32 @@ graph TD Item4["export DOG"]; Item5; Item5["export cat"]; - Item5 --> Item2; Item4 --> Item1; + Item5 --> Item2; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("dog", #2), "DOG")), ItemId(0, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("cat", #2), "cat")), ItemId(1, VarDeclarator(0))]"]; + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(Export(("cat", #2), "cat"))]"]; + N2["Items: [ItemId(0, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("dog", #2), "DOG"))]"]; + N4["Items: [ItemId(ModuleEvaluation)]"]; + N3 --> N2; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "cat", - ): 2, + ): 1, Export( "DOG", - ): 1, + ): 3, } ``` @@ -99,24 +106,54 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; +const cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { dog as DOG }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { cat as cat }; + +``` +## Part 2 +```js const dog = "dog"; export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { cat as cat }; -const cat = "cat"; -export { cat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { dog as DOG }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" }; ``` @@ -129,13 +166,14 @@ export { cat } from "__TURBOPACK_VAR__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "cat", - ): 2, + ): 1, Export( "DOG", - ): 1, + ): 3, } ``` @@ -143,24 +181,54 @@ export { cat } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -"module evaluation"; +const cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { dog as DOG }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { cat as cat }; + +``` +## Part 2 +```js const dog = "dog"; export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { cat as cat }; -const cat = "cat"; -export { cat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { dog as DOG }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export cat" +}; +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" }; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js new file mode 100644 index 0000000000000..bf12a2b2e4066 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/input.js @@ -0,0 +1,44 @@ +import crypto from 'crypto' +import { urlAlphabet } from './url-alphabet/index.js' +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} +let random = bytes => { + fillPool((bytes -= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} +let customRandom = (alphabet, size, getRandom) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * size) / alphabet.length) + return () => { + let id = '' + while (true) { + let bytes = getRandom(step) + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) +let nanoid = (size = 21) => { + fillPool((size -= 0)) + let id = '' + for (let i = poolOffset - size; i < poolOffset; i++) { + id += urlAlphabet[pool[i] & 63] + } + return id +} +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md new file mode 100644 index 0000000000000..1e473a195069b --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nanoid/output.md @@ -0,0 +1,1131 @@ +# Items + +Count: 18 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import crypto from 'crypto'; + +``` + +- Hoisted +- Declares: `crypto` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { urlAlphabet } from './url-alphabet/index.js'; + +``` + +- Hoisted +- Declares: `urlAlphabet` + +## Item 5: Stmt 2, `VarDeclarator(0)` + +```js +const POOL_SIZE_MULTIPLIER = 128; + +``` + +- Declares: `POOL_SIZE_MULTIPLIER` +- Write: `POOL_SIZE_MULTIPLIER` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +let pool, poolOffset; + +``` + +- Declares: `pool` +- Write: `pool` + +## Item 7: Stmt 3, `VarDeclarator(1)` + +```js +let pool, poolOffset; + +``` + +- Declares: `poolOffset` +- Write: `poolOffset` + +## Item 8: Stmt 4, `VarDeclarator(0)` + +```js +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; + +``` + +- Side effects +- Declares: `fillPool` +- Reads: `pool`, `POOL_SIZE_MULTIPLIER`, `crypto`, `poolOffset` +- Write: `pool`, `crypto`, `poolOffset`, `fillPool` + +## Item 9: Stmt 5, `VarDeclarator(0)` + +```js +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; + +``` + +- Declares: `random` +- Reads: `fillPool`, `pool`, `poolOffset` +- Write: `pool`, `random` + +## Item 10: Stmt 6, `VarDeclarator(0)` + +```js +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; + +``` + +- Side effects +- Declares: `customRandom` +- Write: `customRandom` + +## Item 11: Stmt 7, `VarDeclarator(0)` + +```js +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); + +``` + +- Declares: `customAlphabet` +- Reads: `customRandom`, `random` +- Write: `customAlphabet` + +## Item 12: Stmt 8, `VarDeclarator(0)` + +```js +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; + +``` + +- Declares: `nanoid` +- Reads: `fillPool`, `poolOffset`, `urlAlphabet`, `pool` +- Write: `urlAlphabet`, `pool`, `nanoid` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item2; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item13["ModuleEvaluation"]; + Item14; + Item14["export nanoid"]; + Item15; + Item15["export customAlphabet"]; + Item16; + Item16["export customRandom"]; + Item17; + Item17["export urlAlphabet"]; + Item18; + Item18["export random"]; + Item2 --> Item1; + Item8 --> Item6; + Item8 --> Item5; + Item8 --> Item3; + Item8 --> Item7; + Item8 --> Item1; + Item8 --> Item2; + Item9 --> Item8; + Item9 --> Item6; + Item9 --> Item7; + Item10 --> Item1; + Item10 --> Item2; + Item10 --> Item8; + Item11 --> Item10; + Item11 --> Item9; + Item12 --> Item8; + Item12 --> Item7; + Item12 --> Item4; + Item12 --> Item9; + Item12 --> Item6; + Item14 --> Item12; + Item15 --> Item11; + Item16 --> Item10; + Item17 --> Item12; + Item17 --> Item4; + Item18 --> Item9; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item8; + Item13 --> Item10; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(1, ImportBinding(0))]"]; + N1["Items: [ItemId(3, VarDeclarator(1))]"]; + N2["Items: [ItemId(0, ImportBinding(0))]"]; + N3["Items: [ItemId(2, VarDeclarator(0))]"]; + N4["Items: [ItemId(3, VarDeclarator(0))]"]; + N5["Items: [ItemId(0, ImportOfModule)]"]; + N6["Items: [ItemId(1, ImportOfModule)]"]; + N7["Items: [ItemId(4, VarDeclarator(0))]"]; + N8["Items: [ItemId(6, VarDeclarator(0))]"]; + N9["Items: [ItemId(ModuleEvaluation)]"]; + N10["Items: [ItemId(Export(("customRandom", #2), "customRandom"))]"]; + N11["Items: [ItemId(5, VarDeclarator(0))]"]; + N12["Items: [ItemId(Export(("random", #2), "random"))]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N14["Items: [ItemId(Export(("urlAlphabet", #2), "urlAlphabet"))]"]; + N15["Items: [ItemId(Export(("nanoid", #2), "nanoid"))]"]; + N16["Items: [ItemId(7, VarDeclarator(0))]"]; + N17["Items: [ItemId(Export(("customAlphabet", #2), "customAlphabet"))]"]; + N6 --> N5; + N7 --> N4; + N7 --> N3; + N7 --> N2; + N7 --> N1; + N7 --> N5; + N7 --> N6; + N11 --> N7; + N11 --> N4; + N11 --> N1; + N8 --> N5; + N8 --> N6; + N8 --> N7; + N16 --> N8; + N16 --> N11; + N13 --> N7; + N13 --> N1; + N13 --> N0; + N13 --> N11; + N13 --> N4; + N15 --> N13; + N17 --> N16; + N10 --> N8; + N14 --> N13; + N14 --> N0; + N12 --> N11; + N9 --> N5; + N9 --> N6; + N9 --> N7; + N9 --> N8; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 9, + Exports: 18, + Export( + "customRandom", + ): 10, + Export( + "urlAlphabet", + ): 14, + Export( + "random", + ): 12, + Export( + "customAlphabet", + ): 17, + Export( + "nanoid", + ): 15, +} +``` + + +# Modules (dev) +## Part 0 +```js +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import crypto from 'crypto'; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +const POOL_SIZE_MULTIPLIER = 128; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import 'crypto'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './url-alphabet/index.js'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { crypto } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { customRandom as customRandom }; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { urlAlphabet as urlAlphabet }; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { customAlphabet as customAlphabet }; + +``` +## Part 18 +```js +export { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customRandom" +}; +export { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export random" +}; +export { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export urlAlphabet" +}; +export { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export nanoid" +}; +export { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customAlphabet" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 9, + Exports: 18, + Export( + "customRandom", + ): 10, + Export( + "urlAlphabet", + ): 14, + Export( + "random", + ): 12, + Export( + "customAlphabet", + ): 17, + Export( + "nanoid", + ): 15, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { urlAlphabet } from './url-alphabet/index.js'; +export { urlAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +let poolOffset; +export { poolOffset } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import crypto from 'crypto'; +export { crypto } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +const POOL_SIZE_MULTIPLIER = 128; +export { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let pool; +export { pool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import 'crypto'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import './url-alphabet/index.js'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { POOL_SIZE_MULTIPLIER } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { crypto } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +let fillPool = (bytes)=>{ + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + crypto.randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; +export { fillPool } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +let customRandom = (alphabet, size, getRandom)=>{ + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1; + let step = Math.ceil((1.6 * mask * size) / alphabet.length); + return ()=>{ + let id = ''; + while(true){ + let bytes = getRandom(step); + let i = step; + while(i--){ + id += alphabet[bytes[i] & mask] || ''; + if (id.length === size) return id; + } + } + }; +}; +export { customRandom } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { customRandom as customRandom }; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +let random = (bytes)=>{ + fillPool((bytes -= 0)); + return pool.subarray(poolOffset - bytes, poolOffset); +}; +export { random } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +export { random as random }; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { fillPool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { poolOffset } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { pool } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +let nanoid = (size = 21)=>{ + fillPool((size -= 0)); + let id = ''; + for(let i = poolOffset - size; i < poolOffset; i++){ + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; +export { nanoid } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { urlAlphabet as urlAlphabet }; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { nanoid as nanoid }; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +let customAlphabet = (alphabet, size)=>customRandom(alphabet, size, random); +export { customAlphabet } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { customAlphabet as customAlphabet }; + +``` +## Part 18 +```js +export { customRandom } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customRandom" +}; +export { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export random" +}; +export { urlAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export urlAlphabet" +}; +export { nanoid } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export nanoid" +}; +export { customAlphabet } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export customAlphabet" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js new file mode 100644 index 0000000000000..355cd43370ea1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/input.js @@ -0,0 +1,122 @@ +import { stringifyCookie } from '../../web/spec-extension/cookies'; +import { NextURL } from '../next-url'; +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; +import { ReflectAdapter } from './adapters/reflect'; +import { ResponseCookies } from './cookies'; +const INTERNALS = Symbol('internal response'); +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +/** + * This class extends the [Web `Response` API](https://developer.mozilla.org/docs/Web/API/Response) with additional convenience methods. + * + * Read more: [Next.js Docs: `NextResponse`](https://nextjs.org/docs/app/api-reference/functions/next-response) + */ export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + // rest of props come from Response + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +//# sourceMappingURL=response.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md new file mode 100644 index 0000000000000..42b449b912a94 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/next-response/output.md @@ -0,0 +1,1349 @@ +# Items + +Count: 17 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; + +``` + +- Hoisted +- Declares: `stringifyCookie` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { NextURL } from '../next-url'; + +``` + +- Hoisted +- Declares: `NextURL` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `toNodeOutgoingHttpHeaders` + +## Item 7: Stmt 2, `ImportBinding(1)` + +```js +import { toNodeOutgoingHttpHeaders, validateURL } from '../utils'; + +``` + +- Hoisted +- Declares: `validateURL` + +## Item 8: Stmt 3, `ImportOfModule` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Side effects + +## Item 9: Stmt 3, `ImportBinding(0)` + +```js +import { ReflectAdapter } from './adapters/reflect'; + +``` + +- Hoisted +- Declares: `ReflectAdapter` + +## Item 10: Stmt 4, `ImportOfModule` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Side effects + +## Item 11: Stmt 4, `ImportBinding(0)` + +```js +import { ResponseCookies } from './cookies'; + +``` + +- Hoisted +- Declares: `ResponseCookies` + +## Item 12: Stmt 5, `VarDeclarator(0)` + +```js +const INTERNALS = Symbol('internal response'); + +``` + +- Side effects +- Declares: `INTERNALS` +- Write: `INTERNALS` + +## Item 13: Stmt 6, `VarDeclarator(0)` + +```js +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); + +``` + +- Side effects +- Declares: `REDIRECTS` +- Write: `REDIRECTS` + +## Item 14: Stmt 7, `Normal` + +```js +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} + +``` + +- Hoisted +- Declares: `handleMiddlewareField` +- Write: `handleMiddlewareField` + +## Item 15: Stmt 8, `Normal` + +```js +export class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} + +``` + +- Declares: `NextResponse` +- Reads: `ResponseCookies`, `stringifyCookie`, `handleMiddlewareField`, `ReflectAdapter`, `INTERNALS`, `NextURL`, `toNodeOutgoingHttpHeaders`, `NextResponse`, `REDIRECTS`, `validateURL` +- Write: `ReflectAdapter`, `REDIRECTS`, `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item6; + Item2; + Item7; + Item3; + Item8; + Item9; + Item4; + Item10; + Item5; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item16["ModuleEvaluation"]; + Item17; + Item17["export NextResponse"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item4 --> Item1; + Item4 --> Item2; + Item4 --> Item3; + Item5 --> Item1; + Item5 --> Item2; + Item5 --> Item3; + Item5 --> Item4; + Item12 --> Item1; + Item12 --> Item2; + Item12 --> Item3; + Item12 --> Item4; + Item12 --> Item5; + Item13 --> Item1; + Item13 --> Item2; + Item13 --> Item3; + Item13 --> Item4; + Item13 --> Item5; + Item13 --> Item12; + Item15 --> Item11; + Item15 --> Item6; + Item15 --> Item14; + Item15 --> Item10; + Item15 --> Item12; + Item15 --> Item7; + Item15 --> Item8; + Item15 --> Item13; + Item15 --> Item9; + Item17 --> Item15; + Item16 --> Item1; + Item16 --> Item2; + Item16 --> Item3; + Item16 --> Item4; + Item16 --> Item5; + Item16 --> Item12; + Item16 --> Item13; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(2, ImportBinding(1))]"]; + N1["Items: [ItemId(2, ImportBinding(0))]"]; + N2["Items: [ItemId(1, ImportBinding(0))]"]; + N3["Items: [ItemId(3, ImportBinding(0))]"]; + N4["Items: [ItemId(7, Normal)]"]; + N5["Items: [ItemId(0, ImportBinding(0))]"]; + N6["Items: [ItemId(4, ImportBinding(0))]"]; + N7["Items: [ItemId(0, ImportOfModule)]"]; + N8["Items: [ItemId(1, ImportOfModule)]"]; + N9["Items: [ItemId(2, ImportOfModule)]"]; + N10["Items: [ItemId(3, ImportOfModule)]"]; + N11["Items: [ItemId(4, ImportOfModule)]"]; + N12["Items: [ItemId(5, VarDeclarator(0))]"]; + N13["Items: [ItemId(6, VarDeclarator(0))]"]; + N14["Items: [ItemId(ModuleEvaluation)]"]; + N15["Items: [ItemId(8, Normal)]"]; + N16["Items: [ItemId(Export(("NextResponse", #2), "NextResponse"))]"]; + N8 --> N7; + N9 --> N7; + N9 --> N8; + N10 --> N7; + N10 --> N8; + N10 --> N9; + N11 --> N7; + N11 --> N8; + N11 --> N9; + N11 --> N10; + N12 --> N7; + N12 --> N8; + N12 --> N9; + N12 --> N10; + N12 --> N11; + N13 --> N7; + N13 --> N8; + N13 --> N9; + N13 --> N10; + N13 --> N11; + N13 --> N12; + N15 --> N6; + N15 --> N5; + N15 --> N4; + N15 --> N3; + N15 --> N12; + N15 --> N2; + N15 --> N1; + N15 --> N13; + N15 --> N0; + N16 --> N15; + N14 --> N7; + N14 --> N8; + N14 --> N9; + N14 --> N10; + N14 --> N11; + N14 --> N12; + N14 --> N13; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 14, + Export( + "NextResponse", + ): 16, + Exports: 17, +} +``` + + +# Modules (dev) +## Part 0 +```js +import { validateURL } from '../utils'; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { toNodeOutgoingHttpHeaders } from '../utils'; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextURL } from '../next-url'; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { ReflectAdapter } from './adapters/reflect'; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import { ResponseCookies } from './cookies'; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import '../next-url'; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import '../utils'; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import './adapters/reflect'; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import './cookies'; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { ResponseCookies } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { stringifyCookie } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { handleMiddlewareField } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { ReflectAdapter } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { NextURL } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { toNodeOutgoingHttpHeaders } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { validateURL } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { NextResponse }; + +``` +## Part 17 +```js +export { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export NextResponse" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 14, + Export( + "NextResponse", + ): 16, + Exports: 17, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { validateURL } from '../utils'; +export { validateURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { toNodeOutgoingHttpHeaders } from '../utils'; +export { toNodeOutgoingHttpHeaders } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextURL } from '../next-url'; +export { NextURL } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { ReflectAdapter } from './adapters/reflect'; +export { ReflectAdapter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +function handleMiddlewareField(init, headers) { + var _init_request; + if (init == null ? void 0 : (_init_request = init.request) == null ? void 0 : _init_request.headers) { + if (!(init.request.headers instanceof Headers)) { + throw new Error('request.headers must be an instance of Headers'); + } + const keys = []; + for (const [key, value] of init.request.headers){ + headers.set('x-middleware-request-' + key, value); + keys.push(key); + } + headers.set('x-middleware-override-headers', keys.join(',')); + } +} +export { handleMiddlewareField } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import { stringifyCookie } from '../../web/spec-extension/cookies'; +export { stringifyCookie } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import { ResponseCookies } from './cookies'; +export { ResponseCookies } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import '../../web/spec-extension/cookies'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import '../next-url'; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import '../utils'; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import './adapters/reflect'; + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import './cookies'; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const INTERNALS = Symbol('internal response'); +export { INTERNALS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +const REDIRECTS = new Set([ + 301, + 302, + 303, + 307, + 308 +]); +export { REDIRECTS } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { ResponseCookies } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { stringifyCookie } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { handleMiddlewareField } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { ReflectAdapter } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { INTERNALS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { NextURL } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { toNodeOutgoingHttpHeaders } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { validateURL } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { REDIRECTS } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +class NextResponse extends Response { + constructor(body, init = {}){ + super(body, init); + const headers = this.headers; + const cookies = new ResponseCookies(headers); + const cookiesProxy = new Proxy(cookies, { + get (target, prop, receiver) { + switch(prop){ + case 'delete': + case 'set': + { + return (...args)=>{ + const result = Reflect.apply(target[prop], target, args); + const newHeaders = new Headers(headers); + if (result instanceof ResponseCookies) { + headers.set('x-middleware-set-cookie', result.getAll().map((cookie)=>stringifyCookie(cookie)).join(',')); + } + handleMiddlewareField(init, newHeaders); + return result; + }; + } + default: + return ReflectAdapter.get(target, prop, receiver); + } + } + }); + this[INTERNALS] = { + cookies: cookiesProxy, + url: init.url ? new NextURL(init.url, { + headers: toNodeOutgoingHttpHeaders(headers), + nextConfig: init.nextConfig + }) : undefined + }; + } + [Symbol.for('edge-runtime.inspect.custom')]() { + return { + cookies: this.cookies, + url: this.url, + body: this.body, + bodyUsed: this.bodyUsed, + headers: Object.fromEntries(this.headers), + ok: this.ok, + redirected: this.redirected, + status: this.status, + statusText: this.statusText, + type: this.type + }; + } + get cookies() { + return this[INTERNALS].cookies; + } + static json(body, init) { + const response = Response.json(body, init); + return new NextResponse(response.body, response); + } + static redirect(url, init) { + const status = typeof init === 'number' ? init : (init == null ? void 0 : init.status) ?? 307; + if (!REDIRECTS.has(status)) { + throw new RangeError('Failed to execute "redirect" on "response": Invalid status code'); + } + const initObj = typeof init === 'object' ? init : {}; + const headers = new Headers(initObj == null ? void 0 : initObj.headers); + headers.set('Location', validateURL(url)); + return new NextResponse(null, { + ...initObj, + headers, + status + }); + } + static rewrite(destination, init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-rewrite', validateURL(destination)); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } + static next(init) { + const headers = new Headers(init == null ? void 0 : init.headers); + headers.set('x-middleware-next', '1'); + handleMiddlewareField(init, headers); + return new NextResponse(null, { + ...init, + headers + }); + } +} +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { NextResponse }; + +``` +## Part 17 +```js +export { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export NextResponse" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js new file mode 100644 index 0000000000000..3fafa47598599 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/input.js @@ -0,0 +1,214 @@ +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; +let api; +// we want to allow users to use their own version of @opentelemetry/api if they +// want to, so we try to require it first, and if it fails we fall back to the +// version that is bundled with Next.js +// this is because @opentelemetry/api has to be synced with the version of +// @opentelemetry/tracing that is used, and we don't want to force users to use +// the version that is bundled with Next.js. +// the API is ~stable, so this should be fine +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +/** we use this map to propagate attributes from nested spans to the top span */ const rootSpanAttributesStore = new Map(); +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +let lastSpanId = 0; +const getSpanId = ()=>lastSpanId++; +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +class NextTracerImpl { + /** + * Returns an instance to the trace with configured name. + * Since wrap / trace can be defined in any place prior to actual trace subscriber initialization, + * This should be lazily evaluated. + */ getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + // Active span is already set, too late to propagate. + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + // coerce options form overload + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + // Trying to get active scoped span to assign parent. If option specifies parent span manually, will try to use it. + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + // If there's error make sure it throws + return result.then((res)=>{ + span.end(); + // Need to pass down the promise result, + // it could be react stream response with error { error, stream } + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { getTracer, SpanStatusCode, SpanKind }; + +//# sourceMappingURL=tracer.js.map diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md new file mode 100644 index 0000000000000..65f137044256d --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/nextjs-tracer/output.md @@ -0,0 +1,1814 @@ +# Items + +Count: 23 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `LogSpanAllowList` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { LogSpanAllowList, NextVanillaSpanAllowlist } from './constants'; + +``` + +- Hoisted +- Declares: `NextVanillaSpanAllowlist` + +## Item 4: Stmt 1, `VarDeclarator(0)` + +```js +let api; + +``` + +- Declares: `api` +- Write: `api` + +## Item 5: Stmt 2, `Normal` + +```js +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` + +- Side effects +- Write: `api` + +## Item 6: Stmt 3, `VarDeclarator(0)` + +```js +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; + +``` + +- Declares: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` +- Reads: `api` +- Write: `context`, `propagation`, `trace`, `SpanStatusCode`, `SpanKind`, `ROOT_CONTEXT` + +## Item 7: Stmt 4, `VarDeclarator(0)` + +```js +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; + +``` + +- Declares: `isPromise` +- Write: `isPromise` + +## Item 8: Stmt 5, `Normal` + +```js +export class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} + +``` + +- Declares: `BubbledError` +- Write: `BubbledError` + +## Item 9: Stmt 6, `Normal` + +```js +export function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} + +``` + +- Hoisted +- Declares: `isBubbledError` +- Reads (eventual): `BubbledError` +- Write: `isBubbledError` + +## Item 10: Stmt 7, `VarDeclarator(0)` + +```js +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; + +``` + +- Declares: `closeSpanWithError` +- Reads: `isBubbledError`, `SpanStatusCode` +- Write: `SpanStatusCode`, `closeSpanWithError` + +## Item 11: Stmt 8, `VarDeclarator(0)` + +```js +const rootSpanAttributesStore = new Map(); + +``` + +- Side effects +- Declares: `rootSpanAttributesStore` +- Write: `rootSpanAttributesStore` + +## Item 12: Stmt 9, `VarDeclarator(0)` + +```js +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); + +``` + +- Declares: `rootSpanIdKey` +- Reads: `api` +- Write: `api`, `rootSpanIdKey` + +## Item 13: Stmt 10, `VarDeclarator(0)` + +```js +let lastSpanId = 0; + +``` + +- Declares: `lastSpanId` +- Write: `lastSpanId` + +## Item 14: Stmt 11, `VarDeclarator(0)` + +```js +const getSpanId = ()=>lastSpanId++; + +``` + +- Declares: `getSpanId` +- Reads: `lastSpanId` +- Write: `getSpanId` + +## Item 15: Stmt 12, `VarDeclarator(0)` + +```js +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; + +``` + +- Declares: `clientTraceDataSetter` +- Write: `clientTraceDataSetter` + +## Item 16: Stmt 13, `Normal` + +```js +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} + +``` + +- Declares: `NextTracerImpl` +- Reads: `trace`, `context`, `propagation`, `clientTraceDataSetter`, `NextVanillaSpanAllowlist`, `ROOT_CONTEXT`, `getSpanId`, `rootSpanIdKey`, `rootSpanAttributesStore`, `LogSpanAllowList`, `closeSpanWithError`, `isPromise` +- Write: `trace`, `context`, `propagation`, `NextVanillaSpanAllowlist`, `rootSpanAttributesStore`, `LogSpanAllowList`, `NextTracerImpl` + +## Item 17: Stmt 14, `VarDeclarator(0)` + +```js +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); + +``` + +- Declares: `getTracer` +- Reads: `NextTracerImpl` +- Write: `getTracer` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item7; + Item8; + Item9; + Item10; + Item11; + Item12; + Item13; + Item14; + Item15; + Item16; + Item17; + Item18; + Item18["ModuleEvaluation"]; + Item19; + Item19["export BubbledError"]; + Item20; + Item20["export isBubbledError"]; + Item21; + Item21["export getTracer"]; + Item22; + Item22["export SpanStatusCode"]; + Item23; + Item23["export SpanKind"]; + Item5 --> Item4; + Item5 --> Item1; + Item6 --> Item5; + Item6 --> Item4; + Item10 --> Item9; + Item10 --> Item6; + Item11 --> Item1; + Item11 --> Item5; + Item11 -.-> Item8; + Item12 --> Item5; + Item12 --> Item4; + Item12 -.-> Item6; + Item14 --> Item13; + Item16 --> Item6; + Item16 --> Item15; + Item16 --> Item3; + Item16 --> Item14; + Item16 --> Item12; + Item16 --> Item11; + Item16 --> Item2; + Item16 --> Item10; + Item16 --> Item7; + Item17 --> Item16; + Item19 --> Item8; + Item20 --> Item9; + Item21 --> Item17; + Item22 --> Item10; + Item22 --> Item6; + Item23 --> Item6; + Item9 --> Item8; + Item18 --> Item1; + Item18 --> Item5; + Item18 --> Item11; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(4, VarDeclarator(0))]"]; + N1["Items: [ItemId(0, ImportBinding(0))]"]; + N2["Items: [ItemId(0, ImportBinding(1))]"]; + N3["Items: [ItemId(12, VarDeclarator(0))]"]; + N4["Items: [ItemId(10, VarDeclarator(0))]"]; + N5["Items: [ItemId(11, VarDeclarator(0))]"]; + N6["Items: [ItemId(5, Normal)]"]; + N7["Items: [ItemId(Export(("BubbledError", #2), "BubbledError"))]"]; + N8["Items: [ItemId(6, Normal)]"]; + N9["Items: [ItemId(Export(("isBubbledError", #2), "isBubbledError"))]"]; + N10["Items: [ItemId(0, ImportOfModule)]"]; + N11["Items: [ItemId(1, VarDeclarator(0))]"]; + N12["Items: [ItemId(2, Normal)]"]; + N13["Items: [ItemId(8, VarDeclarator(0))]"]; + N14["Items: [ItemId(ModuleEvaluation)]"]; + N15["Items: [ItemId(3, VarDeclarator(0))]"]; + N16["Items: [ItemId(Export(("SpanKind", #2), "SpanKind"))]"]; + N17["Items: [ItemId(9, VarDeclarator(0))]"]; + N18["Items: [ItemId(7, VarDeclarator(0))]"]; + N19["Items: [ItemId(Export(("SpanStatusCode", #2), "SpanStatusCode"))]"]; + N20["Items: [ItemId(13, Normal)]"]; + N21["Items: [ItemId(14, VarDeclarator(0))]"]; + N22["Items: [ItemId(Export(("getTracer", #2), "getTracer"))]"]; + N12 --> N11; + N12 --> N10; + N15 --> N12; + N15 --> N11; + N18 --> N8; + N18 --> N15; + N13 --> N10; + N13 --> N12; + N13 -.-> N6; + N17 --> N12; + N17 --> N11; + N17 -.-> N15; + N5 --> N4; + N20 --> N15; + N20 --> N3; + N20 --> N2; + N20 --> N5; + N20 --> N17; + N20 --> N13; + N20 --> N1; + N20 --> N18; + N20 --> N0; + N21 --> N20; + N7 --> N6; + N9 --> N8; + N22 --> N21; + N19 --> N18; + N19 --> N15; + N16 --> N15; + N8 --> N6; + N14 --> N10; + N14 --> N12; + N14 --> N13; +``` +# Entrypoints + +``` +{ + Export( + "isBubbledError", + ): 9, + ModuleEvaluation: 14, + Export( + "SpanKind", + ): 16, + Exports: 23, + Export( + "SpanStatusCode", + ): 19, + Export( + "BubbledError", + ): 7, + Export( + "getTracer", + ): 22, +} +``` + + +# Modules (dev) +## Part 0 +```js +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { LogSpanAllowList } from './constants'; +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextVanillaSpanAllowlist } from './constants'; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let lastSpanId = 0; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { lastSpanId } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getSpanId = ()=>lastSpanId++; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { BubbledError }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { isBubbledError }; + +``` +## Part 10 +```js +import './constants'; + +``` +## Part 11 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { SpanKind as SpanKind }; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { trace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { context } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { propagation } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { clientTraceDataSetter } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { NextVanillaSpanAllowlist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 +}; +import { getSpanId } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { rootSpanIdKey } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 17 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { LogSpanAllowList } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { isPromise } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import { NextTracerImpl } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +export { getTracer as getTracer }; + +``` +## Part 23 +```js +export { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export BubbledError" +}; +export { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export isBubbledError" +}; +export { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanKind" +}; +export { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanStatusCode" +}; +export { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getTracer" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + Export( + "isBubbledError", + ): 9, + ModuleEvaluation: 15, + Export( + "SpanKind", + ): 17, + Exports: 23, + Export( + "SpanStatusCode", + ): 19, + Export( + "BubbledError", + ): 7, + Export( + "getTracer", + ): 22, +} +``` + + +# Modules (prod) +## Part 0 +```js +const isPromise = (p)=>{ + return p !== null && typeof p === 'object' && typeof p.then === 'function'; +}; +export { isPromise } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { LogSpanAllowList } from './constants'; +export { LogSpanAllowList } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextVanillaSpanAllowlist } from './constants'; +export { NextVanillaSpanAllowlist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +const clientTraceDataSetter = { + set (carrier, key, value) { + carrier.push({ + key, + value + }); + } +}; +export { clientTraceDataSetter } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +let lastSpanId = 0; +export { lastSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { lastSpanId } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getSpanId = ()=>lastSpanId++; +export { getSpanId } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +class BubbledError extends Error { + constructor(bubble, result){ + super(); + this.bubble = bubble; + this.result = result; + } +} +export { BubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { BubbledError }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +function isBubbledError(error) { + if (typeof error !== 'object' || error === null) return false; + return error instanceof BubbledError; +} +export { isBubbledError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { isBubbledError }; + +``` +## Part 10 +```js +import './constants'; + +``` +## Part 11 +```js +let api; +export { api } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +if (process.env.NEXT_RUNTIME === 'edge') { + api = require('@opentelemetry/api'); +} else { + try { + api = require('@opentelemetry/api'); + } catch (err) { + api = require('next/dist/compiled/@opentelemetry/api'); + } +} + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const rootSpanIdKey = api.createContextKey('next.rootSpanId'); +export { rootSpanIdKey } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +const rootSpanAttributesStore = new Map(); +export { rootSpanAttributesStore } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +"module evaluation"; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +import { api } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 11 +}; +const { context, propagation, trace, SpanStatusCode, SpanKind, ROOT_CONTEXT } = api; +export { context } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { propagation } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { trace } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanStatusCode } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { SpanKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; +export { ROOT_CONTEXT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 17 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { SpanKind as SpanKind }; + +``` +## Part 18 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +const closeSpanWithError = (span, error)=>{ + if (isBubbledError(error) && error.bubble) { + span.setAttribute('next.bubble', true); + } else { + if (error) { + span.recordException(error); + } + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error == null ? void 0 : error.message + }); + } + span.end(); +}; +export { closeSpanWithError } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { SpanStatusCode as SpanStatusCode }; + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { trace } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { context } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { propagation } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { clientTraceDataSetter } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { NextVanillaSpanAllowlist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { ROOT_CONTEXT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import { getSpanId } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { rootSpanIdKey } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { rootSpanAttributesStore } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { LogSpanAllowList } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { closeSpanWithError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { isPromise } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +class NextTracerImpl { + getTracerInstance() { + return trace.getTracer('next.js', '0.0.1'); + } + getContext() { + return context; + } + getTracePropagationData() { + const activeContext = context.active(); + const entries = []; + propagation.inject(activeContext, entries, clientTraceDataSetter); + return entries; + } + getActiveScopeSpan() { + return trace.getSpan(context == null ? void 0 : context.active()); + } + withPropagatedContext(carrier, fn, getter) { + const activeContext = context.active(); + if (trace.getSpanContext(activeContext)) { + return fn(); + } + const remoteContext = propagation.extract(activeContext, carrier, getter); + return context.with(remoteContext, fn); + } + trace(...args) { + var _trace_getSpanContext; + const [type, fnOrOptions, fnOrEmpty] = args; + const { fn, options } = typeof fnOrOptions === 'function' ? { + fn: fnOrOptions, + options: {} + } : { + fn: fnOrEmpty, + options: { + ...fnOrOptions + } + }; + const spanName = options.spanName ?? type; + if (!NextVanillaSpanAllowlist.includes(type) && process.env.NEXT_OTEL_VERBOSE !== '1' || options.hideSpan) { + return fn(); + } + let spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + let isRootSpan = false; + if (!spanContext) { + spanContext = (context == null ? void 0 : context.active()) ?? ROOT_CONTEXT; + isRootSpan = true; + } else if ((_trace_getSpanContext = trace.getSpanContext(spanContext)) == null ? void 0 : _trace_getSpanContext.isRemote) { + isRootSpan = true; + } + const spanId = getSpanId(); + options.attributes = { + 'next.span_name': spanName, + 'next.span_type': type, + ...options.attributes + }; + return context.with(spanContext.setValue(rootSpanIdKey, spanId), ()=>this.getTracerInstance().startActiveSpan(spanName, options, (span)=>{ + const startTime = 'performance' in globalThis && 'measure' in performance ? globalThis.performance.now() : undefined; + const onCleanup = ()=>{ + rootSpanAttributesStore.delete(spanId); + if (startTime && process.env.NEXT_OTEL_PERFORMANCE_PREFIX && LogSpanAllowList.includes(type || '')) { + performance.measure(`${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-${(type.split('.').pop() || '').replace(/[A-Z]/g, (match)=>'-' + match.toLowerCase())}`, { + start: startTime, + end: performance.now() + }); + } + }; + if (isRootSpan) { + rootSpanAttributesStore.set(spanId, new Map(Object.entries(options.attributes ?? {}))); + } + try { + if (fn.length > 1) { + return fn(span, (err)=>closeSpanWithError(span, err)); + } + const result = fn(span); + if (isPromise(result)) { + return result.then((res)=>{ + span.end(); + return res; + }).catch((err)=>{ + closeSpanWithError(span, err); + throw err; + }).finally(onCleanup); + } else { + span.end(); + onCleanup(); + } + return result; + } catch (err) { + closeSpanWithError(span, err); + onCleanup(); + throw err; + } + })); + } + wrap(...args) { + const tracer = this; + const [name, options, fn] = args.length === 3 ? args : [ + args[0], + {}, + args[1] + ]; + if (!NextVanillaSpanAllowlist.includes(name) && process.env.NEXT_OTEL_VERBOSE !== '1') { + return fn; + } + return function() { + let optionsObj = options; + if (typeof optionsObj === 'function' && typeof fn === 'function') { + optionsObj = optionsObj.apply(this, arguments); + } + const lastArgId = arguments.length - 1; + const cb = arguments[lastArgId]; + if (typeof cb === 'function') { + const scopeBoundCb = tracer.getContext().bind(context.active(), cb); + return tracer.trace(name, optionsObj, (_span, done)=>{ + arguments[lastArgId] = function(err) { + done == null ? void 0 : done(err); + return scopeBoundCb.apply(this, arguments); + }; + return fn.apply(this, arguments); + }); + } else { + return tracer.trace(name, optionsObj, ()=>fn.apply(this, arguments)); + } + }; + } + startSpan(...args) { + const [type, options] = args; + const spanContext = this.getSpanContext((options == null ? void 0 : options.parentSpan) ?? this.getActiveScopeSpan()); + return this.getTracerInstance().startSpan(type, options, spanContext); + } + getSpanContext(parentSpan) { + const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined; + return spanContext; + } + getRootSpanAttributes() { + const spanId = context.active().getValue(rootSpanIdKey); + return rootSpanAttributesStore.get(spanId); + } +} +export { NextTracerImpl } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import { NextTracerImpl } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +const getTracer = (()=>{ + const tracer = new NextTracerImpl(); + return ()=>tracer; +})(); +export { getTracer } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +import { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 21 +}; +export { getTracer as getTracer }; + +``` +## Part 23 +```js +export { BubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export BubbledError" +}; +export { isBubbledError } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export isBubbledError" +}; +export { SpanKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanKind" +}; +export { SpanStatusCode } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export SpanStatusCode" +}; +export { getTracer } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getTracer" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js new file mode 100644 index 0000000000000..dbdeaab4b2c2a --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/input.js @@ -0,0 +1,9 @@ +import Stream from 'node:stream'; + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +function fetch(){ + +} + +export default fetch; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md new file mode 100644 index 0000000000000..1b1df3bc56c2b --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-fetch/output.md @@ -0,0 +1,353 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import Stream from 'node:stream'; + +``` + +- Hoisted +- Declares: `Stream` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +``` + +- Declares: `streamDestructionSupported` +- Reads: `Stream` +- Write: `Stream`, `streamDestructionSupported` + +## Item 4: Stmt 2, `Normal` + +```js +function fetch() {} + +``` + +- Hoisted +- Declares: `fetch` +- Write: `fetch` + +## Item 5: Stmt 3, `Normal` + +```js +export default fetch; + +``` + +- Side effects +- Declares: `__TURBOPACK__default__export__` +- Reads: `fetch` +- Write: `__TURBOPACK__default__export__` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item6; + Item6["ModuleEvaluation"]; + Item7; + Item7["export default"]; + Item3 --> Item2; + Item5 --> Item4; + Item5 --> Item1; + Item7 --> Item5; + Item6 --> Item1; + Item6 --> Item5; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(2, Normal)]"]; + N2["Items: [ItemId(3, Normal)]"]; + N3["Items: [ItemId(ModuleEvaluation)]"]; + N4["Items: [ItemId(Export(("__TURBOPACK__default__export__", #4), "default"))]"]; + N5["Items: [ItemId(0, ImportBinding(0))]"]; + N6["Items: [ItemId(1, VarDeclarator(0))]"]; + N6 --> N5; + N2 --> N1; + N2 --> N0; + N4 --> N2; + N3 --> N0; + N3 --> N2; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 3, + Export( + "default", + ): 4, + Exports: 7, +} +``` + + +# Modules (dev) +## Part 0 +```js +import 'node:stream'; + +``` +## Part 1 +```js +function fetch() {} +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { fetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const __TURBOPACK__default__export__ = fetch; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 5 +```js +import Stream from 'node:stream'; +export { Stream } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { Stream } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; +export { streamDestructionSupported } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 3, + Export( + "default", + ): 4, + Exports: 7, +} +``` + + +# Modules (prod) +## Part 0 +```js +import 'node:stream'; + +``` +## Part 1 +```js +function fetch() {} +export { fetch } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { fetch } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const __TURBOPACK__default__export__ = fetch; +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 5 +```js +import Stream from 'node:stream'; +export { Stream } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { Stream } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; +export { streamDestructionSupported } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 7 +```js +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md index 77cd4a23f2131..71de679c499ee 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md @@ -43,13 +43,16 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, Normal)]"]; + N0["Items: [ItemId(0, Normal)]"]; + N1["Items: [ItemId(ModuleEvaluation)]"]; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 1, + Exports: 2, } ``` @@ -57,21 +60,35 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; process.turbopack = {}; +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js + ``` ## Merged (module eval) ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; -process.turbopack = {}; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 1, + Exports: 2, } ``` @@ -79,13 +96,26 @@ process.turbopack = {}; # Modules (prod) ## Part 0 ```js -"module evaluation"; process.turbopack = {}; +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js + ``` ## Merged (module eval) ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; -process.turbopack = {}; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js new file mode 100644 index 0000000000000..0d99a1926bc63 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/input.js @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { DEFAULT_ENVIRONMENT, parseEnvironment, } from '../../utils/environment'; +import { _globalThis } from './globalThis'; +/** + * Gets the environment variables + */ +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md new file mode 100644 index 0000000000000..4cea6db192660 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/otel-core/output.md @@ -0,0 +1,515 @@ +# Items + +Count: 10 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `DEFAULT_ENVIRONMENT` + +## Item 3: Stmt 0, `ImportBinding(1)` + +```js +import { DEFAULT_ENVIRONMENT, parseEnvironment } from '../../utils/environment'; + +``` + +- Hoisted +- Declares: `parseEnvironment` + +## Item 4: Stmt 1, `ImportOfModule` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Side effects + +## Item 5: Stmt 1, `ImportBinding(0)` + +```js +import { _globalThis } from './globalThis'; + +``` + +- Hoisted +- Declares: `_globalThis` + +## Item 6: Stmt 2, `Normal` + +```js +export function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} + +``` + +- Hoisted +- Declares: `getEnv` +- Reads (eventual): `parseEnvironment`, `_globalThis`, `DEFAULT_ENVIRONMENT` +- Write: `getEnv` + +## Item 7: Stmt 3, `Normal` + +```js +export function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} + +``` + +- Hoisted +- Declares: `getEnvWithoutDefaults` +- Reads (eventual): `parseEnvironment`, `_globalThis` +- Write: `getEnvWithoutDefaults` + +# Phase 1 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item3; + Item4; + Item2; + Item5; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export getEnv"]; + Item10; + Item10["export getEnvWithoutDefaults"]; + Item2 --> Item1; + Item9 --> Item6; + Item10 --> Item7; + Item6 --> Item4; + Item6 --> Item5; + Item6 --> Item3; + Item7 --> Item4; + Item7 --> Item5; + Item8 --> Item1; + Item8 --> Item2; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(0, ImportBinding(0))]"]; + N1["Items: [ItemId(1, ImportBinding(0))]"]; + N2["Items: [ItemId(0, ImportBinding(1))]"]; + N3["Items: [ItemId(3, Normal)]"]; + N4["Items: [ItemId(Export(("getEnvWithoutDefaults", #2), "getEnvWithoutDefaults"))]"]; + N5["Items: [ItemId(2, Normal)]"]; + N6["Items: [ItemId(Export(("getEnv", #2), "getEnv"))]"]; + N7["Items: [ItemId(0, ImportOfModule)]"]; + N8["Items: [ItemId(1, ImportOfModule)]"]; + N9["Items: [ItemId(ModuleEvaluation)]"]; + N8 --> N7; + N6 --> N5; + N4 --> N3; + N5 --> N2; + N5 --> N1; + N5 --> N0; + N3 --> N2; + N3 --> N1; + N9 --> N7; + N9 --> N8; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 9, + Exports: 10, + Export( + "getEnvWithoutDefaults", + ): 4, + Export( + "getEnv", + ): 6, +} +``` + + +# Modules (dev) +## Part 0 +```js +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { _globalThis } from './globalThis'; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { parseEnvironment } from '../../utils/environment'; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { _globalThis } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { parseEnvironment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getEnvWithoutDefaults }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DEFAULT_ENVIRONMENT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { parseEnvironment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { _globalThis } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getEnv }; + +``` +## Part 7 +```js +import '../../utils/environment'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import './globalThis'; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 10 +```js +export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnvWithoutDefaults" +}; +export { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnv" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 9, + Exports: 10, + Export( + "getEnvWithoutDefaults", + ): 4, + Export( + "getEnv", + ): 6, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { DEFAULT_ENVIRONMENT } from '../../utils/environment'; +export { DEFAULT_ENVIRONMENT } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { _globalThis } from './globalThis'; +export { _globalThis } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { parseEnvironment } from '../../utils/environment'; +export { parseEnvironment } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { _globalThis } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { parseEnvironment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +function getEnvWithoutDefaults() { + return parseEnvironment(_globalThis); +} +export { getEnvWithoutDefaults } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { getEnvWithoutDefaults }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { DEFAULT_ENVIRONMENT } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { parseEnvironment } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { _globalThis } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function getEnv() { + var globalEnv = parseEnvironment(_globalThis); + return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); +} +export { getEnv } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { getEnv }; + +``` +## Part 7 +```js +import '../../utils/environment'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import './globalThis'; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` +## Part 10 +```js +export { getEnvWithoutDefaults } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnvWithoutDefaults" +}; +export { getEnv } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getEnv" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js new file mode 100644 index 0000000000000..3fa42f80742e1 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/input.js @@ -0,0 +1,9 @@ +import { NextResponse } from "next/server"; + +export const GET = (req) => { + return NextResponse.json({ + pathname: req.nextUrl.pathname, + }); +}; + +export const runtime = "edge"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md new file mode 100644 index 0000000000000..6c90717a68018 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-handler/output.md @@ -0,0 +1,338 @@ +# Items + +Count: 7 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from "next/server"; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `VarDeclarator(0)` + +```js +export const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; + +``` + +- Declares: `GET` +- Reads: `NextResponse` +- Write: `NextResponse`, `GET` + +## Item 4: Stmt 2, `VarDeclarator(0)` + +```js +export const runtime = "edge"; + +``` + +- Declares: `runtime` +- Write: `runtime` + +# Phase 1 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item2; + Item3; + Item4; + Item5; + Item5["ModuleEvaluation"]; + Item6; + Item6["export GET"]; + Item7; + Item7["export runtime"]; + Item3 --> Item2; + Item6 --> Item3; + Item7 --> Item4; + Item5 --> Item1; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(0, ImportOfModule)]"]; + N1["Items: [ItemId(ModuleEvaluation)]"]; + N2["Items: [ItemId(2, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("runtime", #2), "runtime"))]"]; + N4["Items: [ItemId(0, ImportBinding(0))]"]; + N5["Items: [ItemId(1, VarDeclarator(0))]"]; + N6["Items: [ItemId(Export(("GET", #2), "GET"))]"]; + N5 --> N4; + N6 --> N5; + N3 --> N2; + N1 --> N0; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 1, + Exports: 7, + Export( + "runtime", + ): 3, + Export( + "GET", + ): 6, +} +``` + + +# Modules (dev) +## Part 0 +```js +import "next/server"; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { runtime }; + +``` +## Part 4 +```js +import { NextResponse } from "next/server"; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { GET }; + +``` +## Part 7 +```js +export { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export runtime" +}; +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 1, + Exports: 7, + Export( + "runtime", + ): 3, + Export( + "GET", + ): 6, +} +``` + + +# Modules (prod) +## Part 0 +```js +import "next/server"; + +``` +## Part 1 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` +## Part 2 +```js +const runtime = "edge"; +export { runtime } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { runtime }; + +``` +## Part 4 +```js +import { NextResponse } from "next/server"; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const GET = (req)=>{ + return NextResponse.json({ + pathname: req.nextUrl.pathname + }); +}; +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { GET }; + +``` +## Part 7 +```js +export { runtime } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export runtime" +}; +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md index b786b9b06e654..a68471266fca8 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md @@ -81,23 +81,24 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("RouteKind", #2), "RouteKind"))]"]; - N2["Items: [ItemId(0, VarDeclarator(0))]"]; - N3["Items: [ItemId(1, Normal)]"]; - N0 --> N3; - N1 --> N3; - N1 --> N2; - N3 --> N2; + N0["Items: [ItemId(0, VarDeclarator(0))]"]; + N1["Items: [ItemId(1, Normal)]"]; + N2["Items: [ItemId(ModuleEvaluation)]"]; + N3["Items: [ItemId(Export(("RouteKind", #2), "RouteKind"))]"]; + N1 --> N0; + N3 --> N1; + N3 --> N0; + N2 --> N1; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 2, Export( "RouteKind", - ): 1, + ): 3, + Exports: 4, } ``` @@ -105,48 +106,61 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +var RouteKind; +export { RouteKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; import { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 0 }; -export { RouteKind }; +(function(RouteKind) { + RouteKind["PAGES"] = "PAGES"; + RouteKind["PAGES_API"] = "PAGES_API"; + RouteKind["APP_PAGE"] = "APP_PAGE"; + RouteKind["APP_ROUTE"] = "APP_ROUTE"; +})(RouteKind || (RouteKind = {})); ``` ## Part 2 ```js -var RouteKind; -export { RouteKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +"module evaluation"; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 0 +}; +export { RouteKind }; + +``` +## Part 4 +```js +export { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export RouteKind" }; -(function(RouteKind) { - RouteKind["PAGES"] = "PAGES"; - RouteKind["PAGES_API"] = "PAGES_API"; - RouteKind["APP_PAGE"] = "APP_PAGE"; - RouteKind["APP_ROUTE"] = "APP_ROUTE"; -})(RouteKind || (RouteKind = {})); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; "module evaluation"; @@ -155,10 +169,11 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 2, Export( "RouteKind", - ): 1, + ): 3, + Exports: 4, } ``` @@ -166,48 +181,61 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +var RouteKind; +export { RouteKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; import { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 0 }; -export { RouteKind }; +(function(RouteKind) { + RouteKind["PAGES"] = "PAGES"; + RouteKind["PAGES_API"] = "PAGES_API"; + RouteKind["APP_PAGE"] = "APP_PAGE"; + RouteKind["APP_ROUTE"] = "APP_ROUTE"; +})(RouteKind || (RouteKind = {})); ``` ## Part 2 ```js -var RouteKind; -export { RouteKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; +"module evaluation"; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { RouteKind } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 2 + __turbopack_part__: 0 +}; +export { RouteKind }; + +``` +## Part 4 +```js +export { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export RouteKind" }; -(function(RouteKind) { - RouteKind["PAGES"] = "PAGES"; - RouteKind["PAGES_API"] = "PAGES_API"; - RouteKind["APP_PAGE"] = "APP_PAGE"; - RouteKind["APP_ROUTE"] = "APP_ROUTE"; -})(RouteKind || (RouteKind = {})); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; "module evaluation"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md index ac5007085d28d..ba32ef160ce76 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `random`, `order`, `shared` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `shared`, `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `shared`, `b` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -214,46 +217,52 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; - N4["Items: [ItemId(0, VarDeclarator(0))]"]; - N5["Items: [ItemId(1, Normal)]"]; - N6["Items: [ItemId(2, VarDeclarator(0))]"]; - N7["Items: [ItemId(3, VarDeclarator(0))]"]; + N0["Items: [ItemId(0, VarDeclarator(0))]"]; + N1["Items: [ItemId(1, Normal)]"]; + N2["Items: [ItemId(2, VarDeclarator(0))]"]; + N3["Items: [ItemId(3, VarDeclarator(0))]"]; + N4["Items: [ItemId(5, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("a", #2), "a"))]"]; + N6["Items: [ItemId(6, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("b", #2), "b"))]"]; N8["Items: [ItemId(4, Normal)]"]; - N0 --> N5; - N0 --> N6; - N0 --> N8; - N1 --> N8; - N1 --> N4; - N2 --> N7; - N3 --> N7; + N9["Items: [ItemId(ModuleEvaluation)]"]; + N10["Items: [ItemId(Export(("order", #2), "order"))]"]; + N1 --> N0; + N2 --> N1; + N3 --> N2; + N3 --> N1; + N3 --> N0; + N8 --> N3; + N8 --> N0; + N8 --> N1; + N8 --> N2; + N4 --> N3; + N6 --> N4; + N6 --> N3; + N10 --> N8; + N10 --> N0; N5 --> N4; - N6 --> N5; N7 --> N6; - N7 --> N5; - N7 --> N4; - N8 --> N7; - N8 --> N4; - N8 --> N5; - N8 --> N6; + N9 --> N1; + N9 --> N2; + N9 --> N8; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 9, Export( "order", - ): 1, + ): 10, + Exports: 11, Export( "b", - ): 3, + ): 7, Export( "a", - ): 2, + ): 5, } ``` @@ -261,130 +270,187 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { a } from "__TURBOPACK_VAR__" assert { +const random = Math.random(); +export { random } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -export { b }; -const b = { - shared, - b: "bbbbbbbbbbb" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { b } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + random, + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { a }; ``` ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -const random = Math.random(); -export { random } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const b = { + shared, + b: "bbbbbbbbbbb" +}; +export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 7 ```js -import { random } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { b }; + +``` +## Part 8 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -const shared = { - random, - effect: order.push("b") +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` -## Part 8 +## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 8 }; +"module evaluation"; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { order }; + +``` +## Part 11 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 @@ -396,16 +462,17 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 9, Export( "order", - ): 1, + ): 10, + Exports: 11, Export( "b", - ): 3, + ): 7, Export( "a", - ): 2, + ): 5, } ``` @@ -413,130 +480,187 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { a } from "__TURBOPACK_VAR__" assert { +const random = Math.random(); +export { random } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -export { b }; -const b = { - shared, - b: "bbbbbbbbbbb" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { b } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + random, + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { a }; ``` ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -const random = Math.random(); -export { random } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const b = { + shared, + b: "bbbbbbbbbbb" +}; +export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 7 ```js -import { random } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { b }; + +``` +## Part 8 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -const shared = { - random, - effect: order.push("b") +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` -## Part 8 +## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 8 }; +"module evaluation"; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { order }; + +``` +## Part 11 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md index c20663c4e6941..ab65ad9fcbe22 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md @@ -66,7 +66,7 @@ const shared = { - Declares: `shared` - Reads: `value`, `value2`, `value3` -- Write: `shared` +- Write: `value`, `value2`, `value3`, `shared` ## Item 7: Stmt 6, `Normal` @@ -90,7 +90,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `shared`, `a` ## Item 9: Stmt 8, `VarDeclarator(0)` @@ -104,7 +104,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `shared`, `b` # Phase 1 ```mermaid @@ -163,7 +163,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -205,7 +208,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; ``` @@ -247,7 +253,10 @@ graph TD Item7 --> Item4; Item7 --> Item5; Item8 --> Item6; + Item8 -.-> Item7; + Item9 --> Item8; Item9 --> Item6; + Item9 -.-> Item7; Item11 --> Item8; Item12 --> Item9; Item10 --> Item1; @@ -260,48 +269,63 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(6, Normal)]"]; - N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(7, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(8, VarDeclarator(0))]"]; - N3["Items: [ItemId(0, Normal)]"]; - N4["Items: [ItemId(1, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, VarDeclarator(0))]"]; - N6["Items: [ItemId(3, Normal)]"]; - N7["Items: [ItemId(4, VarDeclarator(0))]"]; - N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N0 --> N3; - N0 --> N4; - N0 --> N5; - N0 --> N6; - N0 --> N7; - N0 --> N8; - N1 --> N8; - N2 --> N8; + N0["Items: [ItemId(0, Normal)]"]; + N1["Items: [ItemId(1, VarDeclarator(0))]"]; + N2["Items: [ItemId(2, VarDeclarator(0))]"]; + N3["Items: [ItemId(3, Normal)]"]; + N4["Items: [ItemId(4, VarDeclarator(0))]"]; + N5["Items: [ItemId(5, VarDeclarator(0))]"]; + N6["Items: [ItemId(6, Normal)]"]; + N7["Items: [ItemId(ModuleEvaluation)]"]; + N8["Items: [ItemId(7, VarDeclarator(0))]"]; + N9["Items: [ItemId(Export(("a", #2), "a"))]"]; + N10["Items: [ItemId(8, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("b", #2), "b"))]"]; + N1 --> N0; + N2 --> N0; + N2 --> N1; + N3 --> N0; + N3 --> N1; + N3 --> N2; + N4 --> N0; + N4 --> N1; + N4 --> N2; N4 --> N3; - N5 --> N3; + N5 --> N1; + N5 --> N2; N5 --> N4; + N6 --> N5; + N6 --> N0; + N6 --> N1; + N6 --> N2; N6 --> N3; N6 --> N4; - N6 --> N5; + N8 --> N5; + N8 -.-> N6; + N10 --> N8; + N10 --> N5; + N10 -.-> N6; + N9 --> N8; + N11 --> N10; + N7 --> N0; + N7 --> N1; + N7 --> N2; N7 --> N3; N7 --> N4; - N7 --> N5; N7 --> N6; - N8 --> N4; - N8 --> N5; - N8 --> N7; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 7, + Exports: 12, Export( "b", - ): 2, + ): 11, Export( "a", - ): 1, + ): 9, } ``` @@ -309,70 +333,64 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -"module evaluation"; -console.log(shared); +console.log("Hello"); ``` ## Part 1 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { a } from "__TURBOPACK_VAR__" assert { +const value = externalFunction(); +export { value } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { b }; -const b = { - shared, - b: "bbbbbbbbbbb" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { b } from "__TURBOPACK_VAR__" assert { +const value2 = externalObject.propertyWithGetter; +export { value2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -console.log("Hello"); +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +externalObject.propertyWithSetter = 42; ``` ## Part 4 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; -const value = externalFunction(); -export { value } from "__TURBOPACK_VAR__" assert { +const value3 = externalFunction(); +export { value3 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -380,107 +398,192 @@ export { value } from "__TURBOPACK_VAR__" assert { ## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -const value2 = externalObject.propertyWithGetter; -export { value2 } from "__TURBOPACK_VAR__" assert { +import { value } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { value2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { value3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const shared = { + value, + value2, + value3 +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 6 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -import "__TURBOPACK_PART__" assert { +import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -externalObject.propertyWithSetter = 42; +console.log(shared); ``` ## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +"module evaluation"; + +``` +## Part 8 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -const value3 = externalFunction(); -export { value3 } from "__TURBOPACK_VAR__" assert { +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 8 +## Part 9 ```js -import { value } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; -import { value2 } from "__TURBOPACK_PART__" assert { +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { a }; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -import { value3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; -const shared = { - value, - value2, - value3 +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { shared } from "__TURBOPACK_VAR__" assert { +const b = { + shared, + b: "bbbbbbbbbbb" +}; +export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { b }; + +``` +## Part 12 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; + ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 4 }; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; "module evaluation"; -console.log(shared); ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 11, + Exports: 12, Export( "b", - ): 2, + ): 9, Export( "a", - ): 1, + ): 7, } ``` @@ -488,34 +591,106 @@ console.log(shared); # Modules (prod) ## Part 0 ```js +console.log("Hello"); + +``` +## Part 1 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 0 +}; +const value = externalFunction(); +export { value } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; + +``` +## Part 2 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 +}; +const value2 = externalObject.propertyWithGetter; +export { value2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; + +``` +## Part 3 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 }; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -"module evaluation"; -console.log(shared); +externalObject.propertyWithSetter = 42; ``` -## Part 1 +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const value3 = externalFunction(); +export { value3 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { value } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { value2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { value3 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const shared = { + value, + value2, + value3 +}; +export { shared } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 5 }; -export { a }; const a = { shared, a: "aaaaaaaaaaa" @@ -525,12 +700,28 @@ export { a } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 2 +## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { a }; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 5 }; -export { b }; const b = { shared, b: "bbbbbbbbbbb" @@ -540,112 +731,96 @@ export { b } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 3 -```js -console.log("Hello"); - -``` -## Part 4 +## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 8 }; -const value = externalFunction(); -export { value } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; +export { b }; ``` -## Part 5 +## Part 10 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -const value2 = externalObject.propertyWithGetter; -export { value2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; - -``` -## Part 6 -```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -import "__TURBOPACK_PART__" assert { +import { shared } from "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -externalObject.propertyWithSetter = 42; +console.log(shared); ``` -## Part 7 +## Part 11 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; -const value3 = externalFunction(); -export { value3 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +"module evaluation"; ``` -## Part 8 +## Part 12 ```js -import { value } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import { value2 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" }; -import { value3 } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -const shared = { - value, - value2, - value3 -}; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" }; ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 10 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 2 }; -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; "module evaluation"; -console.log(shared); ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md index ac5007085d28d..ba32ef160ce76 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-regression/output.md @@ -46,7 +46,7 @@ const shared = { - Declares: `shared` - Reads: `random`, `order` -- Write: `shared`, `order` +- Write: `random`, `order`, `shared` ## Item 5: Stmt 4, `Normal` @@ -71,7 +71,7 @@ export const a = { - Declares: `a` - Reads: `shared` -- Write: `a` +- Write: `shared`, `a` ## Item 7: Stmt 6, `VarDeclarator(0)` @@ -85,7 +85,7 @@ export const b = { - Declares: `b` - Reads: `shared` -- Write: `b` +- Write: `shared`, `b` # Phase 1 ```mermaid @@ -134,6 +134,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -168,6 +169,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -202,6 +204,7 @@ graph TD Item5 --> Item2; Item5 --> Item3; Item6 --> Item4; + Item7 --> Item6; Item7 --> Item4; Item9 --> Item5; Item9 --> Item1; @@ -214,46 +217,52 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("a", #2), "a")), ItemId(5, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("b", #2), "b")), ItemId(6, VarDeclarator(0))]"]; - N4["Items: [ItemId(0, VarDeclarator(0))]"]; - N5["Items: [ItemId(1, Normal)]"]; - N6["Items: [ItemId(2, VarDeclarator(0))]"]; - N7["Items: [ItemId(3, VarDeclarator(0))]"]; + N0["Items: [ItemId(0, VarDeclarator(0))]"]; + N1["Items: [ItemId(1, Normal)]"]; + N2["Items: [ItemId(2, VarDeclarator(0))]"]; + N3["Items: [ItemId(3, VarDeclarator(0))]"]; + N4["Items: [ItemId(5, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("a", #2), "a"))]"]; + N6["Items: [ItemId(6, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("b", #2), "b"))]"]; N8["Items: [ItemId(4, Normal)]"]; - N0 --> N5; - N0 --> N6; - N0 --> N8; - N1 --> N8; - N1 --> N4; - N2 --> N7; - N3 --> N7; + N9["Items: [ItemId(ModuleEvaluation)]"]; + N10["Items: [ItemId(Export(("order", #2), "order"))]"]; + N1 --> N0; + N2 --> N1; + N3 --> N2; + N3 --> N1; + N3 --> N0; + N8 --> N3; + N8 --> N0; + N8 --> N1; + N8 --> N2; + N4 --> N3; + N6 --> N4; + N6 --> N3; + N10 --> N8; + N10 --> N0; N5 --> N4; - N6 --> N5; N7 --> N6; - N7 --> N5; - N7 --> N4; - N8 --> N7; - N8 --> N4; - N8 --> N5; - N8 --> N6; + N9 --> N1; + N9 --> N2; + N9 --> N8; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 9, Export( "order", - ): 1, + ): 10, + Exports: 11, Export( "b", - ): 3, + ): 7, Export( "a", - ): 2, + ): 5, } ``` @@ -261,130 +270,187 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { a } from "__TURBOPACK_VAR__" assert { +const random = Math.random(); +export { random } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -export { b }; -const b = { - shared, - b: "bbbbbbbbbbb" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { b } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + random, + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { a }; ``` ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -const random = Math.random(); -export { random } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const b = { + shared, + b: "bbbbbbbbbbb" +}; +export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 7 ```js -import { random } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { b }; + +``` +## Part 8 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -const shared = { - random, - effect: order.push("b") +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` -## Part 8 +## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 8 }; +"module evaluation"; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { order }; + +``` +## Part 11 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 @@ -396,16 +462,17 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 9, Export( "order", - ): 1, + ): 10, + Exports: 11, Export( "b", - ): 3, + ): 7, Export( "a", - ): 2, + ): 5, } ``` @@ -413,130 +480,187 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -export { a }; -const a = { - shared, - a: "aaaaaaaaaaa" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { a } from "__TURBOPACK_VAR__" assert { +const random = Math.random(); +export { random } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -export { b }; -const b = { - shared, - b: "bbbbbbbbbbb" +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { b } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { random } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + random, + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const a = { + shared, + a: "aaaaaaaaaaa" +}; +export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { a }; ``` ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 4 }; -const random = Math.random(); -export { random } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +const b = { + shared, + b: "bbbbbbbbbbb" +}; +export { b } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 7 ```js -import { random } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +export { b }; + +``` +## Part 8 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -const shared = { - random, - effect: order.push("b") +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` -## Part 8 +## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 1 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 8 }; +"module evaluation"; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { order }; + +``` +## Part 11 +```js +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" +}; +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md index c734bad84fb88..61ba2ddeabda5 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md @@ -79,21 +79,26 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("a", #2), "a")), ItemId(0, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("b", #2), "b")), ItemId(1, VarDeclarator(0))]"]; + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(Export(("b", #2), "b"))]"]; + N2["Items: [ItemId(0, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("a", #2), "a"))]"]; + N4["Items: [ItemId(ModuleEvaluation)]"]; + N3 --> N2; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "b", - ): 2, + ): 1, Export( "a", - ): 1, + ): 3, } ``` @@ -101,24 +106,54 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; +const b = "b"; +export { b } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { a as a }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { b as b }; + +``` +## Part 2 +```js const a = "a"; export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { b as b }; -const b = "b"; -export { b } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { a as a }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" }; ``` @@ -131,13 +166,14 @@ export { b } from "__TURBOPACK_VAR__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 4, + Exports: 5, Export( "b", - ): 2, + ): 1, Export( "a", - ): 1, + ): 3, } ``` @@ -145,24 +181,54 @@ export { b } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -"module evaluation"; +const b = "b"; +export { b } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -export { a as a }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { b as b }; + +``` +## Part 2 +```js const a = "a"; export { a } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 2 +## Part 3 ```js -export { b as b }; -const b = "b"; -export { b } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { a as a }; + +``` +## Part 4 +```js +"module evaluation"; + +``` +## Part 5 +```js +export { b } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export b" +}; +export { a } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export a" }; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md index bd41e8eaf0706..154c5d08b08ab 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple/output.md @@ -118,24 +118,31 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("DOG", #2), "DOG")), ItemId(2, VarDeclarator(0))]"]; - N2["Items: [ItemId(Export(("CHIMERA", #2), "CHIMERA")), ItemId(1, VarDeclarator(0)), ItemId(3, VarDeclarator(0))]"]; - N3["Items: [ItemId(0, VarDeclarator(0))]"]; - N1 --> N3; - N2 --> N3; + N0["Items: [ItemId(1, VarDeclarator(0))]"]; + N1["Items: [ItemId(0, VarDeclarator(0))]"]; + N2["Items: [ItemId(3, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("CHIMERA", #2), "CHIMERA"))]"]; + N4["Items: [ItemId(2, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("DOG", #2), "DOG"))]"]; + N6["Items: [ItemId(ModuleEvaluation)]"]; + N4 --> N1; + N2 --> N0; + N2 --> N1; + N5 --> N4; + N3 --> N2; ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "DOG", - ): 1, + ModuleEvaluation: 6, + Exports: 7, Export( "CHIMERA", - ): 2, + ): 3, + Export( + "DOG", + ): 5, } ``` @@ -143,32 +150,35 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; +const cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { DOG }; -const DOG = dog; -export { DOG } from "__TURBOPACK_VAR__" assert { +const dog = "dog"; +export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; -export { CHIMERA }; -const cat = "cat"; const CHIMERA = cat + dog; -export { cat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { CHIMERA } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -176,11 +186,54 @@ export { CHIMERA } from "__TURBOPACK_VAR__" assert { ``` ## Part 3 ```js -const dog = "dog"; -export { dog } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { CHIMERA }; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const DOG = dog; +export { DOG } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { DOG }; + +``` +## Part 6 +```js +"module evaluation"; + +``` +## Part 7 +```js +export { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export CHIMERA" +}; +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; + ``` ## Merged (module eval) ```js @@ -191,13 +244,14 @@ export { dog } from "__TURBOPACK_VAR__" assert { ``` { - ModuleEvaluation: 0, - Export( - "DOG", - ): 1, + ModuleEvaluation: 6, + Exports: 7, Export( "CHIMERA", - ): 2, + ): 3, + Export( + "DOG", + ): 5, } ``` @@ -205,32 +259,35 @@ export { dog } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js -"module evaluation"; +const cat = "cat"; +export { cat } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 1 ```js -import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 -}; -export { DOG }; -const DOG = dog; -export { DOG } from "__TURBOPACK_VAR__" assert { +const dog = "dog"; +export { dog } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 2 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { cat } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import { dog } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 1 }; -export { CHIMERA }; -const cat = "cat"; const CHIMERA = cat + dog; -export { cat } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { CHIMERA } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -238,11 +295,54 @@ export { CHIMERA } from "__TURBOPACK_VAR__" assert { ``` ## Part 3 ```js -const dog = "dog"; -export { dog } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { CHIMERA }; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { dog } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const DOG = dog; +export { DOG } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { DOG }; + +``` +## Part 6 +```js +"module evaluation"; + +``` +## Part 7 +```js +export { CHIMERA } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export CHIMERA" +}; +export { DOG } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export DOG" +}; + ``` ## Merged (module eval) ```js diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md index 7b1d2a8064a9b..7d58120819b36 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md @@ -266,7 +266,7 @@ export const routeModule = new PagesRouteModule({ - Declares: `routeModule` - Reads: `PagesRouteModule`, `RouteKind`, `App`, `Document`, `userland` -- Write: `routeModule`, `RouteKind` +- Write: `RouteKind`, `App`, `Document`, `userland`, `routeModule` # Phase 1 ```mermaid @@ -438,6 +438,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -551,6 +563,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -664,6 +688,18 @@ graph TD Item24 --> Item11; Item24 --> Item10; Item24 --> Item12; + Item24 -.-> Item13; + Item24 -.-> Item14; + Item24 -.-> Item15; + Item24 -.-> Item16; + Item24 -.-> Item17; + Item24 -.-> Item18; + Item24 -.-> Item19; + Item24 -.-> Item20; + Item24 -.-> Item21; + Item24 -.-> Item22; + Item24 -.-> Item23; + Item26 --> Item13; Item27 --> Item14; Item28 --> Item15; Item29 --> Item16; @@ -682,113 +718,168 @@ graph TD Item25 --> Item5; Item25 --> Item6; Item25 --> Item13; - Item26 --> Item13; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; - N2["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(7, VarDeclarator(0))]"]; - N3["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(8, VarDeclarator(0))]"]; - N4["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(9, VarDeclarator(0))]"]; - N5["Items: [ItemId(Export(("config", #2), "config")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(10, VarDeclarator(0))]"]; - N6["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(11, VarDeclarator(0))]"]; - N7["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(12, VarDeclarator(0))]"]; - N8["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(13, VarDeclarator(0))]"]; - N9["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(14, VarDeclarator(0))]"]; - N10["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(15, VarDeclarator(0))]"]; - N11["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps")), ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(16, VarDeclarator(0))]"]; - N12["Items: [ItemId(Export(("routeModule", #2), "routeModule")), ItemId(0, ImportBinding(0)), ItemId(1, ImportBinding(0)), ItemId(3, ImportBinding(0)), ItemId(4, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(17, VarDeclarator(0))]"]; - N13["Items: [ItemId(0, ImportOfModule)]"]; - N14["Items: [ItemId(1, ImportOfModule)]"]; - N15["Items: [ItemId(2, ImportOfModule)]"]; - N16["Items: [ItemId(3, ImportOfModule)]"]; - N17["Items: [ItemId(4, ImportOfModule)]"]; - N18["Items: [ItemId(5, ImportOfModule)]"]; - N19["Items: [ItemId(2, ImportBinding(0)), ItemId(5, ImportBinding(0)), ItemId(6, Normal)]"]; - N0 --> N13; - N0 --> N14; - N0 --> N15; - N0 --> N16; - N0 --> N17; - N0 --> N18; - N0 --> N19; - N1 --> N19; - N2 --> N19; - N3 --> N19; - N4 --> N19; - N5 --> N19; - N6 --> N19; - N7 --> N19; - N8 --> N19; - N9 --> N19; - N10 --> N19; - N11 --> N19; - N12 --> N19; - N14 --> N13; - N15 --> N13; - N15 --> N14; - N16 --> N13; - N16 --> N14; - N16 --> N15; - N17 --> N13; - N17 --> N14; - N17 --> N15; - N17 --> N16; - N18 --> N13; - N18 --> N14; - N18 --> N15; - N18 --> N16; - N18 --> N17; - N19 --> N13; - N19 --> N14; - N19 --> N15; - N19 --> N16; - N19 --> N17; + N0["Items: [ItemId(3, ImportBinding(0))]"]; + N1["Items: [ItemId(4, ImportBinding(0))]"]; + N2["Items: [ItemId(1, ImportBinding(0))]"]; + N3["Items: [ItemId(0, ImportBinding(0))]"]; + N4["Items: [ItemId(5, ImportBinding(0))]"]; + N5["Items: [ItemId(2, ImportBinding(0))]"]; + N6["Items: [ItemId(16, VarDeclarator(0))]"]; + N7["Items: [ItemId(Export(("unstable_getServerSideProps", #2), "unstable_getServerSideProps"))]"]; + N8["Items: [ItemId(15, VarDeclarator(0))]"]; + N9["Items: [ItemId(Export(("unstable_getServerProps", #2), "unstable_getServerProps"))]"]; + N10["Items: [ItemId(14, VarDeclarator(0))]"]; + N11["Items: [ItemId(Export(("unstable_getStaticParams", #2), "unstable_getStaticParams"))]"]; + N12["Items: [ItemId(13, VarDeclarator(0))]"]; + N13["Items: [ItemId(Export(("unstable_getStaticPaths", #2), "unstable_getStaticPaths"))]"]; + N14["Items: [ItemId(12, VarDeclarator(0))]"]; + N15["Items: [ItemId(Export(("unstable_getStaticProps", #2), "unstable_getStaticProps"))]"]; + N16["Items: [ItemId(11, VarDeclarator(0))]"]; + N17["Items: [ItemId(Export(("reportWebVitals", #2), "reportWebVitals"))]"]; + N18["Items: [ItemId(10, VarDeclarator(0))]"]; + N19["Items: [ItemId(Export(("config", #2), "config"))]"]; + N20["Items: [ItemId(9, VarDeclarator(0))]"]; + N21["Items: [ItemId(Export(("getServerSideProps", #2), "getServerSideProps"))]"]; + N22["Items: [ItemId(8, VarDeclarator(0))]"]; + N23["Items: [ItemId(Export(("getStaticPaths", #2), "getStaticPaths"))]"]; + N24["Items: [ItemId(7, VarDeclarator(0))]"]; + N25["Items: [ItemId(Export(("getStaticProps", #2), "getStaticProps"))]"]; + N26["Items: [ItemId(0, ImportOfModule)]"]; + N27["Items: [ItemId(1, ImportOfModule)]"]; + N28["Items: [ItemId(2, ImportOfModule)]"]; + N29["Items: [ItemId(3, ImportOfModule)]"]; + N30["Items: [ItemId(4, ImportOfModule)]"]; + N31["Items: [ItemId(5, ImportOfModule)]"]; + N32["Items: [ItemId(6, Normal)]"]; + N33["Items: [ItemId(ModuleEvaluation)]"]; + N34["Items: [ItemId(Export(("__TURBOPACK__default__export__", #3), "default"))]"]; + N35["Items: [ItemId(17, VarDeclarator(0))]"]; + N36["Items: [ItemId(Export(("routeModule", #2), "routeModule"))]"]; + N27 --> N26; + N28 --> N26; + N28 --> N27; + N29 --> N26; + N29 --> N27; + N29 --> N28; + N30 --> N26; + N30 --> N27; + N30 --> N28; + N30 --> N29; + N31 --> N26; + N31 --> N27; + N31 --> N28; + N31 --> N29; + N31 --> N30; + N32 --> N5; + N32 --> N4; + N32 --> N26; + N32 --> N27; + N32 --> N28; + N32 --> N29; + N32 --> N30; + N32 --> N31; + N24 --> N5; + N24 --> N4; + N22 --> N5; + N22 --> N4; + N20 --> N5; + N20 --> N4; + N18 --> N5; + N18 --> N4; + N16 --> N5; + N16 --> N4; + N14 --> N5; + N14 --> N4; + N12 --> N5; + N12 --> N4; + N10 --> N5; + N10 --> N4; + N8 --> N5; + N8 --> N4; + N6 --> N5; + N6 --> N4; + N35 --> N3; + N35 --> N2; + N35 --> N1; + N35 --> N0; + N35 --> N4; + N35 -.-> N32; + N35 -.-> N24; + N35 -.-> N22; + N35 -.-> N20; + N35 -.-> N18; + N35 -.-> N16; + N35 -.-> N14; + N35 -.-> N12; + N35 -.-> N10; + N35 -.-> N8; + N35 -.-> N6; + N34 --> N32; + N25 --> N24; + N23 --> N22; + N21 --> N20; N19 --> N18; + N17 --> N16; + N15 --> N14; + N13 --> N12; + N11 --> N10; + N9 --> N8; + N7 --> N6; + N36 --> N35; + N33 --> N26; + N33 --> N27; + N33 --> N28; + N33 --> N29; + N33 --> N30; + N33 --> N31; + N33 --> N32; ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "unstable_getStaticPaths", - ): 8, Export( "unstable_getServerSideProps", - ): 11, + ): 7, + ModuleEvaluation: 33, Export( - "reportWebVitals", - ): 6, + "default", + ): 34, Export( "unstable_getServerProps", - ): 10, + ): 9, + Export( + "reportWebVitals", + ): 17, Export( "routeModule", - ): 12, + ): 36, Export( - "getStaticProps", - ): 2, + "unstable_getStaticParams", + ): 11, Export( "config", - ): 5, + ): 19, Export( - "unstable_getStaticParams", - ): 9, + "getStaticProps", + ): 25, Export( "unstable_getStaticProps", - ): 7, - Export( - "default", - ): 1, + ): 15, + Exports: 37, Export( - "getStaticPaths", - ): 3, + "unstable_getStaticPaths", + ): 13, Export( "getServerSideProps", - ): 4, + ): 21, + Export( + "getStaticPaths", + ): 23, } ``` @@ -796,134 +887,68 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import Document from 'VAR_MODULE_DOCUMENT'; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import App from 'VAR_MODULE_APP'; +export { App } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { __TURBOPACK__default__export__ as default }; ``` ## Part 2 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { +import { RouteKind } from '../../server/future/route-kind'; +export { RouteKind } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { +import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; +export { PagesRouteModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 4 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { getServerSideProps }; -import { hoist } from './helpers'; import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; export { userland } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 5 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { config }; import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); export { hoist } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { config } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` ## Part 6 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 5 }; -export { reportWebVitals }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -931,39 +956,30 @@ export { reportWebVitals } from "__TURBOPACK_VAR__" assert { ## Part 7 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 6 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 }; +export { unstable_getServerSideProps }; ``` ## Part 8 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 5 }; -export { unstable_getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -971,39 +987,30 @@ export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { ## Part 9 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getStaticParams }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 8 }; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; +export { unstable_getServerProps }; ``` ## Part 10 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 5 }; -export { unstable_getServerProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -1011,199 +1018,538 @@ export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { ## Part 11 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 10 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { unstable_getStaticParams }; ``` ## Part 12 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { routeModule }; -import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; -import { RouteKind } from '../../server/future/route-kind'; -import Document from 'VAR_MODULE_DOCUMENT'; -import App from 'VAR_MODULE_APP'; -import * as userland from 'VAR_USERLAND'; -const routeModule = new PagesRouteModule({ - definition: { - kind: RouteKind.PAGES, - page: 'VAR_DEFINITION_PAGE', - pathname: 'VAR_DEFINITION_PATHNAME', - bundlePath: '', - filename: '' - }, - components: { - App, - Document - }, - userland -}); -export { PagesRouteModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { RouteKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 5 }; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { App } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { routeModule } from "__TURBOPACK_VAR__" assert { +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 13 ```js -import '../../server/future/route-modules/pages/module.compiled'; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { unstable_getStaticPaths }; ``` ## Part 14 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -import '../../server/future/route-kind'; ``` ## Part 15 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 14 }; -import "__TURBOPACK_PART__" assert { +import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { __turbopack_part__: 14 }; -import './helpers'; +export { unstable_getStaticProps }; ``` ## Part 16 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 4 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -import 'VAR_MODULE_DOCUMENT'; ``` ## Part 17 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 16 }; -import "__TURBOPACK_PART__" assert { +import { reportWebVitals } from "__TURBOPACK_PART__" assert { __turbopack_part__: 16 }; -import 'VAR_MODULE_APP'; +export { reportWebVitals }; ``` ## Part 18 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const config = hoist(userland, 'config'); +export { config } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 19 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 }; +export { config }; + +``` +## Part 20 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 21 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +export { getServerSideProps }; + +``` +## Part 22 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 23 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +export { getStaticPaths }; + +``` +## Part 24 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getStaticProps = hoist(userland, 'getStaticProps'); +export { getStaticProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 25 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +export { getStaticProps }; + +``` +## Part 26 +```js +import '../../server/future/route-modules/pages/module.compiled'; + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import '../../server/future/route-kind'; + +``` +## Part 28 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import './helpers'; + +``` +## Part 29 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import 'VAR_MODULE_DOCUMENT'; + +``` +## Part 30 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import 'VAR_MODULE_APP'; + +``` +## Part 31 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 30 }; import 'VAR_USERLAND'; ``` -## Part 19 +## Part 32 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 26 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 27 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; const __TURBOPACK__default__export__ = hoist(userland, 'default'); -export { hoist } from "__TURBOPACK_VAR__" assert { +export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 33 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; -export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 27 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +"module evaluation"; + +``` +## Part 34 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 35 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import { PagesRouteModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { App } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { Document } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const routeModule = new PagesRouteModule({ + definition: { + kind: RouteKind.PAGES, + page: 'VAR_DEFINITION_PAGE', + pathname: 'VAR_DEFINITION_PATHNAME', + bundlePath: '', + filename: '' + }, + components: { + App, + Document + }, + userland +}); +export { routeModule } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 36 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +import { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 35 +}; +export { routeModule }; + +``` +## Part 37 +```js +export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerSideProps" +}; +export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerProps" +}; +export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticParams" +}; +export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticPaths" +}; +export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticProps" +}; +export { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export reportWebVitals" +}; +export { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export config" +}; +export { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getServerSideProps" +}; +export { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticPaths" +}; +export { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticProps" +}; +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; + ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 26 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 27 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 30 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 + __turbopack_part__: 31 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 32 }; "module evaluation"; @@ -1212,43 +1558,44 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, - Export( - "unstable_getStaticPaths", - ): 8, Export( "unstable_getServerSideProps", - ): 11, + ): 9, Export( - "reportWebVitals", - ): 6, + "default", + ): 35, + ModuleEvaluation: 36, Export( "unstable_getServerProps", - ): 10, + ): 11, + Export( + "reportWebVitals", + ): 19, Export( "routeModule", - ): 12, + ): 6, Export( - "getStaticProps", - ): 2, + "unstable_getStaticParams", + ): 13, Export( "config", - ): 5, + ): 21, Export( - "unstable_getStaticParams", - ): 9, + "getStaticProps", + ): 27, Export( "unstable_getStaticProps", - ): 7, - Export( - "default", - ): 1, + ): 17, + Exports: 37, Export( - "getStaticPaths", - ): 3, + "unstable_getStaticPaths", + ): 15, Export( "getServerSideProps", - ): 4, + ): 23, + Export( + "getStaticPaths", + ): 25, } ``` @@ -1256,414 +1603,636 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js +import Document from 'VAR_MODULE_DOCUMENT'; +export { Document } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import App from 'VAR_MODULE_APP'; +export { App } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { RouteKind } from '../../server/future/route-kind'; +export { RouteKind } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; +export { PagesRouteModule } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import * as userland from 'VAR_USERLAND'; +export { userland } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 5 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 3 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 4 +}; +import { PagesRouteModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { RouteKind } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { App } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { Document } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +const routeModule = new PagesRouteModule({ + definition: { + kind: RouteKind.PAGES, + page: 'VAR_DEFINITION_PAGE', + pathname: 'VAR_DEFINITION_PATHNAME', + bundlePath: '', + filename: '' + }, + components: { + App, + Document + }, + userland +}); +export { routeModule } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 6 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 + __turbopack_part__: 5 +}; +import { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +export { routeModule }; + +``` +## Part 7 +```js +import { hoist } from './helpers'; +export { hoist } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); +export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` -## Part 1 +## Part 9 ```js -import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; -export { __TURBOPACK__default__export__ as default }; +import { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +export { unstable_getServerSideProps }; ``` -## Part 2 +## Part 10 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticProps = hoist(userland, 'getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); +export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { userland } from "__TURBOPACK_VAR__" assert { + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +import { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 +}; +export { unstable_getServerProps }; + +``` +## Part 12 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); +export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 13 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +export { unstable_getStaticParams }; + +``` +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); +export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 15 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 }; +export { unstable_getStaticPaths }; ``` -## Part 3 +## Part 16 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getStaticPaths = hoist(userland, 'getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { getStaticPaths } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); +export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 17 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const getServerSideProps = hoist(userland, 'getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 16 }; -export { getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 }; +export { unstable_getStaticProps }; ``` -## Part 5 +## Part 18 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { config }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const config = hoist(userland, 'config'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { config } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const reportWebVitals = hoist(userland, 'reportWebVitals'); +export { reportWebVitals } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 6 +## Part 19 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 18 +}; +import { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 18 }; export { reportWebVitals }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const reportWebVitals = hoist(userland, 'reportWebVitals'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 20 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { reportWebVitals } from "__TURBOPACK_VAR__" assert { +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const config = hoist(userland, 'config'); +export { config } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 21 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getStaticProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticProps = hoist(userland, 'unstable_getStaticProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 20 }; -export { unstable_getStaticProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 20 }; +export { config }; ``` -## Part 8 +## Part 22 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { unstable_getStaticPaths }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticPaths = hoist(userland, 'unstable_getStaticPaths'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { unstable_getStaticPaths } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getServerSideProps = hoist(userland, 'getServerSideProps'); +export { getServerSideProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 9 +## Part 23 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getStaticParams }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getStaticParams = hoist(userland, 'unstable_getStaticParams'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 22 }; -export { unstable_getStaticParams } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 22 }; +export { getServerSideProps }; ``` -## Part 10 +## Part 24 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { unstable_getServerProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerProps = hoist(userland, 'unstable_getServerProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { unstable_getServerProps } from "__TURBOPACK_VAR__" assert { +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const getStaticPaths = hoist(userland, 'getStaticPaths'); +export { getStaticPaths } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 11 +## Part 25 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 -}; -export { unstable_getServerSideProps }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const unstable_getServerSideProps = hoist(userland, 'unstable_getServerSideProps'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 24 }; -export { unstable_getServerSideProps } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 24 }; +export { getStaticPaths }; ``` -## Part 12 +## Part 26 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 7 }; -export { routeModule }; -import { PagesRouteModule } from '../../server/future/route-modules/pages/module.compiled'; -import { RouteKind } from '../../server/future/route-kind'; -import Document from 'VAR_MODULE_DOCUMENT'; -import App from 'VAR_MODULE_APP'; -import * as userland from 'VAR_USERLAND'; -const routeModule = new PagesRouteModule({ - definition: { - kind: RouteKind.PAGES, - page: 'VAR_DEFINITION_PAGE', - pathname: 'VAR_DEFINITION_PATHNAME', - bundlePath: '', - filename: '' - }, - components: { - App, - Document - }, - userland -}); -export { PagesRouteModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { RouteKind } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; -export { Document } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; -export { App } from "__TURBOPACK_VAR__" assert { +const getStaticProps = hoist(userland, 'getStaticProps'); +export { getStaticProps } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 27 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; -export { routeModule } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 26 }; +export { getStaticProps }; ``` -## Part 13 +## Part 28 ```js import '../../server/future/route-modules/pages/module.compiled'; ``` -## Part 14 +## Part 29 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 28 }; import '../../server/future/route-kind'; ``` -## Part 15 +## Part 30 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 29 }; import './helpers'; ``` -## Part 16 +## Part 31 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 30 }; import 'VAR_MODULE_DOCUMENT'; ``` -## Part 17 +## Part 32 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 30 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 31 }; import 'VAR_MODULE_APP'; ``` -## Part 18 +## Part 33 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 30 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 31 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 32 }; import 'VAR_USERLAND'; ``` -## Part 19 +## Part 34 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 28 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 30 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 + __turbopack_part__: 31 }; -import { hoist } from './helpers'; -import * as userland from 'VAR_USERLAND'; -const __TURBOPACK__default__export__ = hoist(userland, 'default'); -export { hoist } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 }; -export { userland } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import { hoist } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; +import { userland } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +const __TURBOPACK__default__export__ = hoist(userland, 'default'); export { __TURBOPACK__default__export__ } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; +``` +## Part 35 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import { __TURBOPACK__default__export__ } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +export { __TURBOPACK__default__export__ as default }; + +``` +## Part 36 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 34 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 33 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 32 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 31 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 30 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 29 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 28 +}; +"module evaluation"; + +``` +## Part 37 +```js +export { routeModule } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export routeModule" +}; +export { unstable_getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerSideProps" +}; +export { unstable_getServerProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getServerProps" +}; +export { unstable_getStaticParams } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticParams" +}; +export { unstable_getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticPaths" +}; +export { unstable_getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export unstable_getStaticProps" +}; +export { reportWebVitals } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export reportWebVitals" +}; +export { config } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export config" +}; +export { getServerSideProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getServerSideProps" +}; +export { getStaticPaths } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticPaths" +}; +export { getStaticProps } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export getStaticProps" +}; +export { default } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export default" +}; + ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 13 + __turbopack_part__: 34 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 14 + __turbopack_part__: 33 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 15 + __turbopack_part__: 32 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 16 + __turbopack_part__: 31 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 17 + __turbopack_part__: 30 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 18 + __turbopack_part__: 29 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 19 + __turbopack_part__: 28 }; "module evaluation"; diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md index 867b54c937d69..21c3aef7db07b 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/test-config-1/output.md @@ -274,11 +274,14 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; ``` # Phase 4 ```mermaid @@ -331,68 +334,92 @@ graph TD Item18 --> Item13; Item11 --> Item2; Item11 --> Item8; + Item11 --> Item3; Item12 --> Item11; Item12 --> Item8; + Item12 --> Item3; Item13 -.-> Item4; Item13 -.-> Item7; Item13 -.-> Item15; + Item13 --> Item3; Item14 --> Item1; Item14 --> Item9; ``` # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, ImportOfModule), ItemId(0, ImportBinding(0)), ItemId(7, Normal)]"]; - N1["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; - N2["Items: [ItemId(Export(("foo", #2), "foo"))]"]; - N3["Items: [ItemId(Export(("external1", #2), "external1")), ItemId(10, Normal)]"]; - N4["Items: [ItemId(Export(("external2", #2), "external2")), ItemId(11, Normal)]"]; - N5["Items: [ItemId(1, VarDeclarator(0))]"]; - N6["Items: [ItemId(2, VarDeclarator(0))]"]; - N7["Items: [ItemId(3, VarDeclarator(0)), ItemId(4, Normal)]"]; - N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N9["Items: [ItemId(6, Normal)]"]; - N10["Items: [ItemId(0, ImportBinding(0)), ItemId(9, Normal)]"]; - N0 --> N8; - N0 --> N10; - N0 --> N9; - N0 --> N6; - N1 --> N9; - N1 --> N5; - N2 --> N6; - N3 --> N10; - N3 --> N9; - N4 --> N6; - N4 --> N8; - N4 --> N1; - N6 --> N5; - N7 --> N5; + N0["Items: [ItemId(0, ImportBinding(0))]"]; + N1["Items: [ItemId(0, ImportOfModule)]"]; + N2["Items: [ItemId(3, VarDeclarator(0))]"]; + N3["Items: [ItemId(1, VarDeclarator(0))]"]; + N4["Items: [ItemId(2, VarDeclarator(0))]"]; + N5["Items: [ItemId(Export(("foo", #2), "foo"))]"]; + N6["Items: [ItemId(4, Normal)]"]; + N7["Items: [ItemId(5, VarDeclarator(0))]"]; + N8["Items: [ItemId(6, Normal)]"]; + N9["Items: [ItemId(9, Normal)]"]; + N10["Items: [ItemId(10, Normal)]"]; + N11["Items: [ItemId(Export(("external1", #2), "external1"))]"]; + N12["Items: [ItemId(Export(("foobar", #2), "foobar"))]"]; + N13["Items: [ItemId(11, Normal)]"]; + N14["Items: [ItemId(Export(("external2", #2), "external2"))]"]; + N15["Items: [ItemId(7, Normal)]"]; + N16["Items: [ItemId(ModuleEvaluation)]"]; + N17["Items: [ItemId(8, Normal)]"]; + N4 --> N3; + N6 --> N2; + N6 --> N3; + N6 -.-> N4; N7 --> N6; - N8 --> N7; - N8 --> N5; - N9 --> N7; - N9 --> N5; - N9 --> N6; + N7 --> N3; + N8 --> N6; + N8 --> N3; + N8 -.-> N4; + N8 -.-> N7; + N15 --> N7; + N15 --> N1; + N15 -.-> N0; + N15 -.-> N8; + N15 -.-> N4; + N15 -.-> N9; + N17 --> N7; + N17 -.-> N15; + N12 --> N8; + N12 --> N3; + N5 --> N4; + N11 --> N10; + N14 --> N13; + N9 --> N0; N9 --> N8; + N9 --> N3; N10 --> N9; + N10 --> N8; + N10 --> N3; + N13 -.-> N4; + N13 -.-> N7; + N13 -.-> N12; + N13 --> N3; + N16 --> N1; + N16 --> N15; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 16, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 5, Export( "foobar", - ): 1, + ): 12, Export( "external2", - ): 4, + ): 14, } ``` @@ -400,22 +427,7 @@ graph TD # Modules (dev) ## Part 0 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -"module evaluation"; -import "module"; import { upper } from "module"; -console.log(foobarCopy); export { upper } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -423,182 +435,314 @@ export { upper } from "__TURBOPACK_VAR__" assert { ``` ## Part 1 ```js +import "module"; + +``` +## Part 2 +```js +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 +}; +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -export { foobar }; ``` -## Part 2 +## Part 5 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import { foo } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 4 }; export { foo }; ``` -## Part 3 +## Part 6 ```js -import { internal } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 3 }; -export { external1 }; -function external1() { - return internal() + foobar; -} -export { external1 } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +foobar += bar; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 4 +## Part 8 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +foobar += "foo"; + +``` +## Part 9 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 1 + __turbopack_part__: 3 }; -export { external2 }; -function external2() { - foobar += "."; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +function internal() { + return upper(foobar); } -export { external2 } from "__TURBOPACK_VAR__" assert { +export { internal } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 10 ```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { internal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +function external1() { + return internal() + foobar; +} +export { external1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 6 +## Part 11 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { external1 }; ``` -## Part 7 +## Part 12 ```js -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 }; +export { foobar }; ``` -## Part 8 +## Part 13 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -let foobarCopy = foobar; -export { foobarCopy } from "__TURBOPACK_VAR__" assert { +function external2() { + foobar += "."; +} +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 9 +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 13 +}; +export { external2 }; + +``` +## Part 15 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 0 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -foobar += "foo"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +console.log(foobarCopy); ``` -## Part 10 +## Part 16 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 -}; -import { upper } from "module"; -function internal() { - return upper(foobar); -} -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 1 }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 15 }; +"module evaluation"; ``` -## Merged (module eval) +## Part 17 ```js -import { foobarCopy } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 10 + __turbopack_part__: 15 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +foobarCopy += "Unused"; + +``` +## Part 18 +```js +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" }; +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; + +``` +## Merged (module eval) +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 15 }; -import "module"; -import { upper } from "module"; "module evaluation"; -console.log(foobarCopy); -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 15, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 17, Export( "foobar", - ): 1, + ): 8, Export( "external2", - ): 4, + ): 5, } ``` @@ -606,144 +750,289 @@ export { upper } from "__TURBOPACK_VAR__" assert { # Modules (prod) ## Part 0 ```js +import { upper } from "module"; +export { upper } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import "module"; + +``` +## Part 2 +```js +const bar = "bar"; +export { bar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +let foobar = "foo"; +export { foobar } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 3 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -"module evaluation"; -import "module"; -let foobarCopy = foobar; -console.log(foobarCopy); -export { foobarCopy } from "__TURBOPACK_VAR__" assert { +function external2() { + foobar += "."; +} +export { external2 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 1 +## Part 5 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 4 +}; +import { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { external2 }; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { bar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -export { foobar }; +foobar += bar; ``` -## Part 2 +## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -export { foo }; -const foo = foobar; -export { foo } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +foobar += "foo"; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 }; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { foobar }; ``` -## Part 3 +## Part 9 ```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 7 }; -export { external1 }; -import { upper } from "module"; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { upper } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; function internal() { return upper(foobar); } +export { internal } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 10 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { internal } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; function external1() { return internal() + foobar; } -export { upper } from "__TURBOPACK_VAR__" assert { +export { external1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + +``` +## Part 11 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; -export { external1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 10 }; +export { external1 }; ``` -## Part 4 +## Part 12 ```js -export { external2 }; -function external2() { - foobar += "."; -} -export { external2 } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +let foobarCopy = foobar; +export { foobarCopy } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 5 +## Part 13 ```js -let foobar = "foo"; -export { foobar } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 }; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +foobarCopy += "Unused"; ``` -## Part 6 +## Part 14 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import { foobarCopy } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 12 +}; +console.log(foobarCopy); + +``` +## Part 15 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 14 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +"module evaluation"; + +``` +## Part 16 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 3 }; -const bar = "bar"; -foobar += bar; -export { bar } from "__TURBOPACK_VAR__" assert { +const foo = foobar; +export { foo } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` -## Part 7 +## Part 17 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 16 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 16 +}; +export { foo }; + +``` +## Part 18 +```js +export { external2 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external2" +}; +export { foobar } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foobar" +}; +export { external1 } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export external1" +}; +export { foo } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export foo" }; -foobar += "foo"; ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 14 }; -import { foobar } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 }; -import "module"; "module evaluation"; -let foobarCopy = foobar; -console.log(foobarCopy); -export { foobarCopy } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 15, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 17, Export( "foobar", - ): 1, + ): 8, Export( "external2", - ): 4, + ): 5, } ``` @@ -751,44 +1040,29 @@ export { foobarCopy } from "__TURBOPACK_VAR__" assert { ## Merged (external1) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 10 }; -import { upper } from "module"; export { external1 }; -function internal() { - return upper(foobar); -} -function external1() { - return internal() + foobar; -} -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { external1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 15, Export( "external1", - ): 3, + ): 11, + Exports: 18, Export( "foo", - ): 2, + ): 17, Export( "foobar", - ): 1, + ): 8, Export( "external2", - ): 4, + ): 5, } ``` @@ -796,31 +1070,12 @@ export { external1 } from "__TURBOPACK_VAR__" assert { ## Merged (external1,external2) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import { upper } from "module"; -export { external1 }; -function internal() { - return upper(foobar); -} -function external1() { - return internal() + foobar; -} -export { upper } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; -export { internal } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true + __turbopack_part__: 10 }; -export { external1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 }; +export { external1 }; export { external2 }; -function external2() { - foobar += "."; -} -export { external2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md index 2324a75bfe17d..b0379dd7c18db 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md @@ -102,25 +102,30 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation), ItemId(0, Normal)]"]; - N1["Items: [ItemId(Export(("effects", #2), "effects"))]"]; - N2["Items: [ItemId(Export(("effect", #2), "effect")), ItemId(2, Normal)]"]; - N3["Items: [ItemId(1, VarDeclarator(0))]"]; - N1 --> N3; - N2 --> N3; - N2 --> N1; + N0["Items: [ItemId(0, Normal)]"]; + N1["Items: [ItemId(ModuleEvaluation)]"]; + N2["Items: [ItemId(1, VarDeclarator(0))]"]; + N3["Items: [ItemId(Export(("effects", #2), "effects"))]"]; + N4["Items: [ItemId(2, Normal)]"]; + N5["Items: [ItemId(Export(("effect", #2), "effect"))]"]; + N3 --> N2; + N5 --> N4; + N4 --> N2; + N4 -.-> N3; + N1 --> N0; ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "effects", - ): 1, + ModuleEvaluation: 1, Export( "effect", - ): 2, + ): 5, + Exports: 6, + Export( + "effects", + ): 3, } ``` @@ -128,27 +133,47 @@ graph TD # Modules (dev) ## Part 0 ```js -"module evaluation"; await Promise.resolve(); ``` ## Part 1 ```js -import { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { effects }; +"module evaluation"; ``` ## Part 2 ```js +const effects = []; +export { effects } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 2 }; +export { effects }; + +``` +## Part 4 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 1 + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 }; -export { effect }; function effect(name) { effects.push(name); } @@ -157,31 +182,47 @@ export { effect } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 3 +## Part 5 ```js -const effects = []; -export { effects } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +export { effect }; + +``` +## Part 6 +```js +export { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effects" +}; +export { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effect" }; ``` ## Merged (module eval) ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; -await Promise.resolve(); ``` # Entrypoints ``` { - ModuleEvaluation: 0, - Export( - "effects", - ): 1, + ModuleEvaluation: 1, Export( "effect", - ): 2, + ): 4, + Exports: 6, + Export( + "effects", + ): 5, } ``` @@ -189,24 +230,33 @@ await Promise.resolve(); # Modules (prod) ## Part 0 ```js -"module evaluation"; await Promise.resolve(); ``` ## Part 1 ```js -import { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { effects }; +"module evaluation"; ``` ## Part 2 ```js +const effects = []; +export { effects } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { effects } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 3 + __turbopack_part__: 2 }; -export { effect }; function effect(name) { effects.push(name); } @@ -215,17 +265,43 @@ export { effect } from "__TURBOPACK_VAR__" assert { }; ``` -## Part 3 +## Part 4 ```js -const effects = []; -export { effects } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { effect }; + +``` +## Part 5 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +export { effects }; + +``` +## Part 6 +```js +export { effect } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effect" +}; +export { effects } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export effects" }; ``` ## Merged (module eval) ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; "module evaluation"; -await Promise.resolve(); ``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js new file mode 100644 index 0000000000000..fd7505a005999 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/input.js @@ -0,0 +1,10 @@ +import { NextResponse } from 'next/server' +import { ClientComponent } from '../../ClientComponent' +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent' + +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent, + }) +} diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md new file mode 100644 index 0000000000000..8026566746197 --- /dev/null +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/typeof-1/output.md @@ -0,0 +1,467 @@ +# Items + +Count: 9 + +## Item 1: Stmt 0, `ImportOfModule` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Side effects + +## Item 2: Stmt 0, `ImportBinding(0)` + +```js +import { NextResponse } from 'next/server'; + +``` + +- Hoisted +- Declares: `NextResponse` + +## Item 3: Stmt 1, `ImportOfModule` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 4: Stmt 1, `ImportBinding(0)` + +```js +import { ClientComponent } from '../../ClientComponent'; + +``` + +- Hoisted +- Declares: `ClientComponent` + +## Item 5: Stmt 2, `ImportOfModule` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Side effects + +## Item 6: Stmt 2, `ImportBinding(0)` + +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; + +``` + +- Hoisted +- Declares: `MyModuleClientComponent` + +## Item 7: Stmt 3, `Normal` + +```js +export function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} + +``` + +- Hoisted +- Declares: `GET` +- Reads (eventual): `NextResponse`, `ClientComponent`, `MyModuleClientComponent` +- Write: `GET` +- Write (eventual): `NextResponse` + +# Phase 1 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; +``` +# Phase 2 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; +``` +# Phase 3 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; +``` +# Phase 4 +```mermaid +graph TD + Item1; + Item4; + Item2; + Item5; + Item3; + Item6; + Item7; + Item8; + Item8["ModuleEvaluation"]; + Item9; + Item9["export GET"]; + Item2 --> Item1; + Item3 --> Item1; + Item3 --> Item2; + Item9 --> Item7; + Item7 --> Item4; + Item7 --> Item5; + Item7 --> Item6; + Item8 --> Item1; + Item8 --> Item2; + Item8 --> Item3; +``` +# Final +```mermaid +graph TD + N0["Items: [ItemId(2, ImportBinding(0))]"]; + N1["Items: [ItemId(1, ImportBinding(0))]"]; + N2["Items: [ItemId(0, ImportBinding(0))]"]; + N3["Items: [ItemId(3, Normal)]"]; + N4["Items: [ItemId(Export(("GET", #2), "GET"))]"]; + N5["Items: [ItemId(0, ImportOfModule)]"]; + N6["Items: [ItemId(1, ImportOfModule)]"]; + N7["Items: [ItemId(2, ImportOfModule)]"]; + N8["Items: [ItemId(ModuleEvaluation)]"]; + N6 --> N5; + N7 --> N5; + N7 --> N6; + N4 --> N3; + N3 --> N2; + N3 --> N1; + N3 --> N0; + N8 --> N5; + N8 --> N6; + N8 --> N7; +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 8, + Exports: 9, + Export( + "GET", + ): 4, +} +``` + + +# Modules (dev) +## Part 0 +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { ClientComponent } from '../../ClientComponent'; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextResponse } from 'next/server'; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { MyModuleClientComponent } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { ClientComponent } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { GET }; + +``` +## Part 5 +```js +import 'next/server'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import '../../ClientComponent'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +"module evaluation"; + +``` +## Part 9 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +"module evaluation"; + +``` +# Entrypoints + +``` +{ + ModuleEvaluation: 8, + Exports: 9, + Export( + "GET", + ): 4, +} +``` + + +# Modules (prod) +## Part 0 +```js +import { MyModuleClientComponent } from 'my-module/MyModuleClientComponent'; +export { MyModuleClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 1 +```js +import { ClientComponent } from '../../ClientComponent'; +export { ClientComponent } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 2 +```js +import { NextResponse } from 'next/server'; +export { NextResponse } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 3 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { MyModuleClientComponent } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { NextResponse } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import { ClientComponent } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +function GET() { + return NextResponse.json({ + clientComponent: typeof ClientComponent, + myModuleClientComponent: typeof MyModuleClientComponent + }); +} +export { GET } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; + +``` +## Part 4 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +import { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 3 +}; +export { GET }; + +``` +## Part 5 +```js +import 'next/server'; + +``` +## Part 6 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import '../../ClientComponent'; + +``` +## Part 7 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import 'my-module/MyModuleClientComponent'; + +``` +## Part 8 +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +"module evaluation"; + +``` +## Part 9 +```js +export { GET } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export GET" +}; + +``` +## Merged (module eval) +```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 7 +}; +"module evaluation"; + +``` diff --git a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md index 052eb476d8e5f..e10ee1c106434 100644 --- a/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md +++ b/crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md @@ -71,7 +71,7 @@ export const shared = { - Declares: `shared` - Reads: `order` -- Write: `shared`, `order` +- Write: `order`, `shared` ## Item 7: Stmt 6, `Normal` @@ -171,6 +171,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; ``` # Phase 4 @@ -207,6 +208,7 @@ graph TD Item10 --> Item2; Item11 --> Item6; Item2 --> Item7; + Item2 --> Item1; Item2 -.-> Item9; Item8 --> Item3; Item8 --> Item4; @@ -216,48 +218,52 @@ graph TD # Final ```mermaid graph TD - N0["Items: [ItemId(ModuleEvaluation)]"]; - N1["Items: [ItemId(Export(("order", #2), "order"))]"]; - N2["Items: [ItemId(Export(("func", #2), "func")), ItemId(1, Normal)]"]; + N0["Items: [ItemId(0, VarDeclarator(0))]"]; + N1["Items: [ItemId(2, Normal)]"]; + N2["Items: [ItemId(5, VarDeclarator(0))]"]; N3["Items: [ItemId(Export(("shared", #2), "shared"))]"]; - N4["Items: [ItemId(0, VarDeclarator(0))]"]; - N5["Items: [ItemId(2, Normal)]"]; - N6["Items: [ItemId(3, VarDeclarator(0))]"]; - N7["Items: [ItemId(4, VarDeclarator(0))]"]; - N8["Items: [ItemId(5, VarDeclarator(0))]"]; - N9["Items: [ItemId(6, Normal)]"]; - N0 --> N5; - N0 --> N6; - N0 --> N7; - N0 --> N9; - N1 --> N9; - N1 --> N4; - N2 --> N9; - N2 --> N1; - N3 --> N8; + N4["Items: [ItemId(3, VarDeclarator(0))]"]; + N5["Items: [ItemId(4, VarDeclarator(0))]"]; + N6["Items: [ItemId(6, Normal)]"]; + N7["Items: [ItemId(ModuleEvaluation)]"]; + N8["Items: [ItemId(Export(("order", #2), "order"))]"]; + N9["Items: [ItemId(1, Normal)]"]; + N10["Items: [ItemId(Export(("func", #2), "func"))]"]; + N1 --> N0; + N4 --> N1; + N5 --> N1; N5 --> N4; + N2 --> N1; + N2 --> N0; + N6 --> N2; + N6 --> N0; + N6 --> N1; + N6 --> N4; N6 --> N5; + N8 --> N6; + N8 --> N0; + N10 --> N9; + N3 --> N2; + N9 --> N6; + N9 --> N0; + N9 -.-> N8; + N7 --> N1; + N7 --> N4; N7 --> N5; N7 --> N6; - N8 --> N5; - N8 --> N4; - N9 --> N8; - N9 --> N4; - N9 --> N5; - N9 --> N6; - N9 --> N7; ``` # Entrypoints ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 7, Export( "order", - ): 1, + ): 8, + Exports: 11, Export( "func", - ): 2, + ): 10, Export( "shared", ): 3, @@ -268,147 +274,191 @@ graph TD # Modules (dev) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 1 + __turbopack_part__: 0 }; -export { func }; -function func() { - order.push("d"); -} -export { func } from "__TURBOPACK_VAR__" assert { +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 2 }; export { shared }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const x1 = externalFunction(); +export { x1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +const x2 = externalFunction(); +export { x2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 6 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -const x1 = externalFunction(); -export { x1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` ## Part 7 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; -const x2 = externalFunction(); -export { x2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true -}; +"module evaluation"; ``` ## Part 8 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 6 }; -const shared = { - effect: order.push("b") +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { shared } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +export { order }; ``` ## Part 9 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 6 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +function func() { + order.push("d"); +} +export { func } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 9 }; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 +import { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 9 +}; +export { func }; + +``` +## Part 11 +```js +export { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export shared" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" +}; +export { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export func" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 5 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 6 }; "module evaluation"; @@ -417,13 +467,14 @@ import "__TURBOPACK_PART__" assert { ``` { - ModuleEvaluation: 0, + ModuleEvaluation: 7, Export( "order", - ): 1, + ): 10, + Exports: 11, Export( "func", - ): 2, + ): 9, Export( "shared", ): 3, @@ -434,107 +485,133 @@ import "__TURBOPACK_PART__" assert { # Modules (prod) ## Part 0 ```js -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 +const order = []; +export { order } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true }; -"module evaluation"; ``` ## Part 1 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 0 }; import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 + __turbopack_part__: 0 }; -export { order }; +order.push("a"); ``` ## Part 2 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 1 }; -export { func }; -function func() { - order.push("d"); -} -export { func } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +const shared = { + effect: order.push("b") +}; +export { shared } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 3 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; import { shared } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 8 + __turbopack_part__: 2 }; export { shared }; ``` ## Part 4 ```js -const order = []; -export { order } from "__TURBOPACK_VAR__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +const x1 = externalFunction(); +export { x1 } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; ``` ## Part 5 ```js -import { order } from "__TURBOPACK_PART__" assert { +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { __turbopack_part__: 4 }; -order.push("a"); +const x2 = externalFunction(); +export { x2 } from "__TURBOPACK_VAR__" assert { + __turbopack_var__: true +}; ``` ## Part 6 ```js +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 2 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 1 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; import "__TURBOPACK_PART__" assert { __turbopack_part__: 5 }; -const x1 = externalFunction(); -export { x1 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; +order.push("c"); ``` ## Part 7 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; -const x2 = externalFunction(); -export { x2 } from "__TURBOPACK_VAR__" assert { - __turbopack_var__: true +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 4 +}; +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 5 }; +"module evaluation"; ``` ## Part 8 ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 +import "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -const shared = { - effect: order.push("b") +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 }; -export { shared } from "__TURBOPACK_VAR__" assert { +function func() { + order.push("d"); +} +export { func } from "__TURBOPACK_VAR__" assert { __turbopack_var__: true }; @@ -544,34 +621,52 @@ export { shared } from "__TURBOPACK_VAR__" assert { import "__TURBOPACK_PART__" assert { __turbopack_part__: 8 }; -import { order } from "__TURBOPACK_PART__" assert { - __turbopack_part__: 4 -}; -import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 +import { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 8 }; +export { func }; + +``` +## Part 10 +```js import "__TURBOPACK_PART__" assert { __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 0 +}; +import { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: 0 +}; +export { order }; + +``` +## Part 11 +```js +export { shared } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export shared" +}; +export { func } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export func" +}; +export { order } from "__TURBOPACK_PART__" assert { + __turbopack_part__: "export order" }; -order.push("c"); ``` ## Merged (module eval) ```js import "__TURBOPACK_PART__" assert { - __turbopack_part__: 5 + __turbopack_part__: 6 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 6 + __turbopack_part__: 1 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 7 + __turbopack_part__: 4 }; import "__TURBOPACK_PART__" assert { - __turbopack_part__: 9 + __turbopack_part__: 5 }; "module evaluation"; diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js index 6c7bcdb73703e..b092f891ef1d2 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js @@ -4,7 +4,7 @@ __turbopack_export_value__((__turbopack_import__) => { return Promise.all([ - "output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js" + "output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js" ].map((chunk) => __turbopack_load__(chunk))).then(() => { return __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); }); diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js similarity index 57% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js index b496ad7226a0b..8823e0a199229 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,73 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,54 +125,98 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "dogRef": [ - ()=>dogRef, - (v)=>dogRef = v - ], "getDog": [ ()=>getDog, (v)=>getDog = v - ], - "setDog": [ - ()=>setDog, - (v)=>setDog = v ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; function getDog() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "setDog": [ + ()=>setDog, + (v)=>setDog = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; function setDog(newDog) { - __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] = newDog; + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] = newDog; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": [ + ()=>dogRef, + (v)=>dogRef = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +; +; +; const dogRef = { - initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"], - get: getDog, - set: setDog + initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"], + get: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__["getDog"], + set: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["setDog"] }; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__["dogRef"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -139,19 +225,35 @@ __turbopack_esm__({ (v)=>getChimera = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["getChimera"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -160,11 +262,24 @@ __turbopack_esm__({ (v)=>initialCat = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"]; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["initialCat"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$dynamic$2d$import$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"]; ; })()), @@ -207,4 +322,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js.map similarity index 50% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js.map index 8771340104287..10f307cc6f109 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_05eac0.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_f28c6f.js.map @@ -4,26 +4,42 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,qOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,qOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,qOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, - {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,qOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,qOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,qOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 113, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 126, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,qOAAA,CAAA,MAAG;AACZ"}}, + {"offset": {"line": 155, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,SAAS,OAAO,MAAM;IACpB,qOAAA,CAAA,MAAG,GAAG;AACR"}}, + {"offset": {"line": 174, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBO,MAAM,SAAS;IACpB,SAAS,qOAAA,CAAA,MAAG;IACZ,KAAK,sOAAA,CAAA,SAAM;IACX,KAAK,qOAAA,CAAA,SAAM;AACb"}}, + {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 208, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 216, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,qOAAA,CAAA,MAAG,GAAG,qOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 240, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 245, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,qOAAA,CAAA,MAAG"}}, + {"offset": {"line": 270, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 275, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 283, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 288, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 304, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 309, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 320, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js similarity index 52% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js index e67f15fb3ad19..6a1dbbb6d5274 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,42 +42,98 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; "module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; ; }.call(this) }), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -92,33 +150,45 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ "__TURBOPACK__reexport__cat__": [ ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__["cat"], (v)=>$expr = v - ], - "fakeCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__["cat"] + ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "fakeCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["__TURBOPACK__reexport__cat__"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -130,13 +200,34 @@ __turbopack_esm__({ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__fakeCat$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; -"module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__fakeCat$3e$__["fakeCat"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__["fakeCat"]); })()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +"module evaluation"; + +}.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -149,4 +240,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js.map \ No newline at end of file +//# sourceMappingURL=crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js.map similarity index 50% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js.map index 5e1bd6a7257af..ca90b74fbc272 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_3d3809._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_35ea42._.js.map @@ -4,24 +4,40 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 70, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 75, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 80, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 88, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 93, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 118, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 123, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js"],"sourcesContent":["import { fakeCat } from \"./module\";\n\n\nconsole.log(fakeCat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAGA,QAAQ,GAAG,CAAC,oOAAA,CAAA,UAAO"}}, - {"offset": {"line": 137, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 142, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 147, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 120, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 125, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 129, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 133, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 138, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 146, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 159, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 164, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 180, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 188, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 193, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 204, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js"],"sourcesContent":["import { fakeCat } from \"./module\";\n\n\nconsole.log(fakeCat)\n"],"names":[],"mappings":";;;;;;;AAGA,QAAQ,GAAG,CAAC,qOAAA,CAAA,UAAO"}}, + {"offset": {"line": 217, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 228, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 233, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 238, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map deleted file mode 100644 index 20adfc3eda1b6..0000000000000 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": 3, - "sources": [], - "sections": [ - {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, - {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 70, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 75, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 80, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 88, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 93, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 100, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 105, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, - {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 144, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 165, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 177, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 198, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 219, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 234, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAG,CAAC,GAAG"}}, - {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] -} \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js similarity index 54% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js index d6d4fa4d32efa..594727e08542f 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,42 +42,98 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; "module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; ; }.call(this) }), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -92,54 +150,98 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "dogRef": [ - ()=>dogRef, - (v)=>dogRef = v - ], "getDog": [ ()=>getDog, (v)=>getDog = v - ], - "setDog": [ - ()=>setDog, - (v)=>setDog = v ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; function getDog() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "setDog": [ + ()=>setDog, + (v)=>setDog = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; function setDog(newDog) { - __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] = newDog; + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] = newDog; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": [ + ()=>dogRef, + (v)=>dogRef = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +; +; +; const dogRef = { - initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"], - get: getDog, - set: setDog + initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"], + get: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__["getDog"], + set: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["setDog"] }; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__["dogRef"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -148,19 +250,35 @@ __turbopack_esm__({ (v)=>getChimera = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["getChimera"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -169,11 +287,24 @@ __turbopack_esm__({ (v)=>initialCat = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"]; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["initialCat"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"]; ; })()), @@ -198,14 +329,11 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] + "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); @@ -218,18 +346,16 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests "use strict"; __turbopack_esm__({ - "__TURBOPACK__reexport__lib__": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__, - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["__TURBOPACK__reexport__lib__"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -241,13 +367,34 @@ __turbopack_esm__({ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__lib$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; -"module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$module$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__lib$3e$__["lib"].cat); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__["lib"].cat); })()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$export$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +"module evaluation"; + +}.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -260,4 +407,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_b4b68a._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js.map new file mode 100644 index 0000000000000..ecbbd9a255864 --- /dev/null +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_c0eca6._.js.map @@ -0,0 +1,61 @@ +{ + "version": 3, + "sources": [], + "sections": [ + {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, + {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 120, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 125, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 129, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 133, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 138, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 146, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 159, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 164, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ"}}, + {"offset": {"line": 180, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 185, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR"}}, + {"offset": {"line": 199, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 204, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK,wOAAA,CAAA,SAAM;IACX,KAAK,uOAAA,CAAA,SAAM;AACb"}}, + {"offset": {"line": 228, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 233, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 241, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 246, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 265, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 270, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 278, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 283, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 295, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 300, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 308, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 313, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 329, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 334, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 342, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 347, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 355, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 360, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 371, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js"],"sourcesContent":["import {lib} from './module'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;AAEA,QAAQ,GAAG,CAAC,yOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 384, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 388, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 395, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 400, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 405, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] +} \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js.map deleted file mode 100644 index 9691baa9961b0..0000000000000 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js.map +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": 3, - "sources": [], - "sections": [ - {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, - {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,0OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,0OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,0OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js"],"sourcesContent":["import {cat as c,dogRef,initialCat,getChimera} from './lib'\n\nconsole.log(c)\n\n// TODO: Execution\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,oOAAA,CAAA,MAAC,EAEb,kBAAkB"}}, - {"offset": {"line": 111, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] -} \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js similarity index 52% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js index 545fa75044205..e9109a2fa526e 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,81 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,15 +133,16 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -103,14 +154,35 @@ __turbopack_esm__({ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; -"module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__["cat"]) // TODO: Execution + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__["c"]) // TODO: Execution +; })()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2d$all$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +"module evaluation"; + +}.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -123,4 +195,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_18bec5._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js.map similarity index 59% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js.map index a64d074b155f2..ddb9d993ba781 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_71b07f._.js.map @@ -2,32 +2,34 @@ "version": 3, "sources": [], "sections": [ - {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, + {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,uOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, - {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAI,GAAG"}}, - {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 226, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 231, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,0OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,0OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,0OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,0OAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 129, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 142, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 147, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 163, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js"],"sourcesContent":["import {cat as c,dogRef,initialCat,getChimera} from './lib'\n\nconsole.log(c)\n\n// TODO: Execution\n"],"names":[],"mappings":";;;;;;;AAEA,QAAQ,GAAG,CAAC,4OAAA,CAAA,IAAC,EAEb,kBAAkB"}}, + {"offset": {"line": 172, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 176, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 183, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 188, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 193, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js similarity index 51% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js index 4034ac6c90d3e..20403fef71608 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,81 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,15 +133,16 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -103,13 +154,34 @@ __turbopack_esm__({ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; -"module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$export__cat$3e$__["cat"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; ; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__["c"]); })()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$named$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +"module evaluation"; + +}.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -122,4 +194,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js.map \ No newline at end of file +//# sourceMappingURL=crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js.map similarity index 52% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js.map index 79904a487ff04..4860ec481e040 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_5e0b87._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_ed0d99._.js.map @@ -4,20 +4,32 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,mOAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js"],"sourcesContent":["import {cat as c} from './lib'\n\nconsole.log(c)\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,QAAQ,GAAG,CAAC,6NAAA,CAAA,MAAC"}}, - {"offset": {"line": 110, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 115, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 120, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,mOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,mOAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 129, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 142, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 147, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 158, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 163, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js"],"sourcesContent":["import {cat as c} from './lib'\n\nconsole.log(c)\n"],"names":[],"mappings":";;;;;;;AAEA,QAAQ,GAAG,CAAC,qOAAA,CAAA,IAAC"}}, + {"offset": {"line": 171, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 175, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 187, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 192, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js similarity index 55% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js index 281bddcb7f575..36d4578916199 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,81 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,54 +133,98 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "dogRef": [ - ()=>dogRef, - (v)=>dogRef = v - ], "getDog": [ ()=>getDog, (v)=>getDog = v - ], - "setDog": [ - ()=>setDog, - (v)=>setDog = v ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; function getDog() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "setDog": [ + ()=>setDog, + (v)=>setDog = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; function setDog(newDog) { - __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] = newDog; + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] = newDog; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": [ + ()=>dogRef, + (v)=>dogRef = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +; +; +; const dogRef = { - initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"], - get: getDog, - set: setDog + initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"], + get: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__["getDog"], + set: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["setDog"] }; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__["dogRef"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -139,19 +233,35 @@ __turbopack_esm__({ (v)=>getChimera = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["getChimera"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -160,11 +270,24 @@ __turbopack_esm__({ (v)=>initialCat = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"]; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["initialCat"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"]; ; })()), @@ -189,14 +312,11 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["cat"], - "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["dogRef"], - "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["getChimera"], - "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__["initialCat"] + "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$exports$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); @@ -205,22 +325,30 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; -__turbopack_esm__({ - "lib": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ -}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js [test] (ecmascript) "); +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; -"module evaluation"; ; ; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$facade$3e$__.cat); ; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__1$3e$__["lib"].cat); })()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$namespace$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +"module evaluation"; + +}.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; @@ -233,4 +361,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_ee0515._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js.map new file mode 100644 index 0000000000000..ef61345235fd5 --- /dev/null +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_351ad1._.js.map @@ -0,0 +1,53 @@ +{ + "version": 3, + "sources": [], + "sections": [ + {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, + {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,uOAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 129, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 142, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 147, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,uOAAA,CAAA,MAAG;AACZ"}}, + {"offset": {"line": 163, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,SAAS,OAAO,MAAM;IACpB,uOAAA,CAAA,MAAG,GAAG;AACR"}}, + {"offset": {"line": 182, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 187, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBO,MAAM,SAAS;IACpB,SAAS,uOAAA,CAAA,MAAG;IACZ,KAAK,wOAAA,CAAA,SAAM;IACX,KAAK,uOAAA,CAAA,SAAM;AACb"}}, + {"offset": {"line": 211, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 216, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 224, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 229, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,uOAAA,CAAA,MAAG,GAAG,uOAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 248, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 261, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 266, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,uOAAA,CAAA,MAAG"}}, + {"offset": {"line": 278, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 283, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 291, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 296, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 312, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 317, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 325, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 330, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js"],"sourcesContent":["import * as lib from './lib'\n\nconsole.log(lib.cat)\n"],"names":[],"mappings":";;;;;;;AAEA,QAAQ,GAAG,CAAC,yOAAA,CAAA,MAAG,CAAC,GAAG"}}, + {"offset": {"line": 338, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 342, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 349, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 354, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 359, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] +} \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js similarity index 55% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js index 4f32ba94027e7..b7576d6613cb1 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,39 +42,87 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; "module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$module__evaluation$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$import$2d$side$2d$effect$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; ; +"module evaluation"; }.call(this) }), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -87,4 +137,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js.map \ No newline at end of file +//# sourceMappingURL=79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js.map similarity index 53% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js.map index 54fb8ae3668c6..296bed71af197 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4952cd._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_cdc49f._.js.map @@ -4,16 +4,24 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,4OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,4OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,4OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 70, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 75, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 80, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 85, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,4OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,4OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,4OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,4OAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 112, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 116, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 120, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 125, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js similarity index 58% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js index b829c74cc07a9..0907b252734b2 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,73 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,54 +125,98 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "dogRef": [ - ()=>dogRef, - (v)=>dogRef = v - ], "getDog": [ ()=>getDog, (v)=>getDog = v - ], - "setDog": [ - ()=>setDog, - (v)=>setDog = v ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; function getDog() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "setDog": [ + ()=>setDog, + (v)=>setDog = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; function setDog(newDog) { - __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] = newDog; + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] = newDog; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": [ + ()=>dogRef, + (v)=>dogRef = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +; +; +; const dogRef = { - initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"], - get: getDog, - set: setDog + initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"], + get: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__["getDog"], + set: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["setDog"] }; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__["dogRef"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -139,19 +225,35 @@ __turbopack_esm__({ (v)=>getChimera = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["getChimera"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -160,11 +262,24 @@ __turbopack_esm__({ (v)=>initialCat = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"]; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["initialCat"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$require$2d$side$2d$effect$2f$input$2f$lib$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"]; ; })()), @@ -212,4 +327,4 @@ const { cat } = __turbopack_require__("[project]/crates/turbopack-tests/tests/sn }.call(this) }), }]); -//# sourceMappingURL=a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map \ No newline at end of file +//# sourceMappingURL=a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js.map similarity index 51% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js.map index 729da17d345fd..e4fc85da8365f 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_fa7732._.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_6b5862._.js.map @@ -4,28 +4,44 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,6OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,6OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,6OAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, - {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 209, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, - {"offset": {"line": 210, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,6OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,6OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,6OAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 113, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 126, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,6OAAA,CAAA,MAAG;AACZ"}}, + {"offset": {"line": 155, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,SAAS,OAAO,MAAM;IACpB,6OAAA,CAAA,MAAG,GAAG;AACR"}}, + {"offset": {"line": 174, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBO,MAAM,SAAS;IACpB,SAAS,6OAAA,CAAA,MAAG;IACZ,KAAK,8OAAA,CAAA,SAAM;IACX,KAAK,6OAAA,CAAA,SAAM;AACb"}}, + {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 208, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 216, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,6OAAA,CAAA,MAAG,GAAG,6OAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 240, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 245, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,6OAAA,CAAA,MAAG"}}, + {"offset": {"line": 270, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 275, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 283, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 288, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 304, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 309, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 320, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 324, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js"],"sourcesContent":["const {cat} = require('./lib')\n"],"names":[],"mappings":"AAAA,MAAM,EAAC,GAAG,EAAC"}}, + {"offset": {"line": 325, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js similarity index 57% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js index 00dd5c50b44f6..9744f84fd5537 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js @@ -1,6 +1,6 @@ -(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js", { +(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push(["output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js", { -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -17,10 +17,11 @@ let dog = "dog"; "use strict"; __turbopack_esm__({}); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -28,11 +29,12 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), "[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { @@ -40,33 +42,73 @@ __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$ __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] += "!"; +; +__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] += "!"; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__6$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__7$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({}); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; ; -"module evaluation"; -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); -console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]); +; +console.log(__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]); })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (function({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname, m: module, e: exports, t: require }) { !function() { + +__turbopack_esm__({}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__16$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__15$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__14$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +"module evaluation"; + +}.call(this) }), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -83,54 +125,98 @@ let cat = "cat"; "use strict"; __turbopack_esm__({ - "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + "cat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; +; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ - "dogRef": [ - ()=>dogRef, - (v)=>dogRef = v - ], "getDog": [ ()=>getDog, (v)=>getDog = v - ], - "setDog": [ - ()=>setDog, - (v)=>setDog = v ] }); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; function getDog() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"]; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "setDog": [ + ()=>setDog, + (v)=>setDog = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; function setDog(newDog) { - __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"] = newDog; + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"] = newDog; } +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": [ + ()=>dogRef, + (v)=>dogRef = v + ] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; +; +; +; +; const dogRef = { - initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["dog"], - get: getDog, - set: setDog + initial: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"], + get: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__11$3e$__["getDog"], + set: __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__5$3e$__["setDog"] }; ; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "dogRef": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__["dogRef"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__12$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; ; ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -139,19 +225,35 @@ __turbopack_esm__({ (v)=>getChimera = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__8$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; ; +; +; function getChimera() { - return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"] + dog; + return __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"] + __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__4$3e$__["dog"]; } ; })()), -"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "getChimera": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["getChimera"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { "use strict"; __turbopack_esm__({ @@ -160,11 +262,24 @@ __turbopack_esm__({ (v)=>initialCat = v ] }); -var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); +"__TURBOPACK__ecmascript__hoisting__location__"; +; +; +const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__0$3e$__["cat"]; +; + +})()), +"[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) ": (({ r: __turbopack_require__, f: __turbopack_module_context__, i: __turbopack_import__, s: __turbopack_esm__, v: __turbopack_export_value__, n: __turbopack_export_namespace__, c: __turbopack_cache__, M: __turbopack_modules__, l: __turbopack_load__, j: __turbopack_dynamic__, P: __turbopack_resolve_absolute_path__, U: __turbopack_relative_url__, R: __turbopack_resolve_module_id_path__, g: global, __dirname }) => (() => { +"use strict"; + +__turbopack_esm__({ + "initialCat": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__["initialCat"] +}); +var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__2$3e$__ = __turbopack_import__("[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js [test] (ecmascript) "); "__TURBOPACK__ecmascript__hoisting__location__"; ; ; -const initialCat = __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests$2f$tests$2f$snapshot$2f$basic$2d$tree$2d$shake$2f$tree$2d$shake$2d$test$2d$1$2f$input$2f$index$2e$js__$5b$test$5d$__$28$ecmascript$29$__$3c$internal__part__9$3e$__["cat"]; ; })()), @@ -207,4 +322,4 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$crates$2f$turbopack$2d$tests })()), }]); -//# sourceMappingURL=a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map \ No newline at end of file +//# sourceMappingURL=a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js.map \ No newline at end of file diff --git a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js.map similarity index 50% rename from crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map rename to crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js.map index 21f0e7a600376..ab349beb6ceb4 100644 --- a/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2951af.js.map +++ b/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_87c735.js.map @@ -4,26 +4,42 @@ "sections": [ {"offset": {"line": 5, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAAI,MAAM"}}, {"offset": {"line": 13, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;AAEA,gPAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 23, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 28, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAUA,gPAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 35, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 40, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AAkBA,gPAAA,CAAA,MAAG,IAAI"}}, - {"offset": {"line": 47, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 52, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG;AAQf,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 66, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 71, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, - {"offset": {"line": 79, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 84, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 91, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 96, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ;AAMA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR;AAMO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK;IACL,KAAK;AACP"}}, - {"offset": {"line": 130, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 135, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG;AACf"}}, - {"offset": {"line": 151, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 156, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, - {"offset": {"line": 168, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 173, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 189, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, - {"offset": {"line": 194, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 205, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;AAEA,gPAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 24, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 29, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAUA,gPAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 37, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 42, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,gPAAA,CAAA,MAAG,IAAI"}}, + {"offset": {"line": 50, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 55, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;AAIA,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 63, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 68, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;AAYA,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 78, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 83, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBA,QAAQ,GAAG,CAAC,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 95, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 99, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 108, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 113, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;AA4BO,IAAI,MAAM"}}, + {"offset": {"line": 121, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 126, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 134, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 139, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMA,SAAS;IACP,OAAO,gPAAA,CAAA,MAAG;AACZ"}}, + {"offset": {"line": 155, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 160, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,SAAS,OAAO,MAAM;IACpB,gPAAA,CAAA,MAAG,GAAG;AACR"}}, + {"offset": {"line": 174, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 179, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBO,MAAM,SAAS;IACpB,SAAS,gPAAA,CAAA,MAAG;IACZ,KAAK,iPAAA,CAAA,SAAM;IACX,KAAK,gPAAA,CAAA,SAAM;AACb"}}, + {"offset": {"line": 203, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 208, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 216, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 221, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCO,SAAS;IACd,OAAO,gPAAA,CAAA,MAAG,GAAG,gPAAA,CAAA,MAAG;AAClB"}}, + {"offset": {"line": 240, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 245, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 253, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 258, "column": 0}, "map": {"version":3,"sources":["turbopack://[project]/crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js"],"sourcesContent":["let dog = \"dog\";\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction getDog() {\n return dog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nfunction setDog(newDog) {\n dog = newDog;\n}\n\ndog += \"!\";\n\nconsole.log(dog);\n\nexport const dogRef = {\n initial: dog,\n get: getDog,\n set: setDog,\n};\n\nexport let cat = \"cat\";\n\nexport const initialCat = cat;\n\nexport function getChimera() {\n return cat + dog;\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,aAAa,gPAAA,CAAA,MAAG"}}, + {"offset": {"line": 270, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 275, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 283, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 288, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 304, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}, + {"offset": {"line": 309, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, + {"offset": {"line": 320, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file diff --git a/crates/turbopack-wasm/src/module_asset.rs b/crates/turbopack-wasm/src/module_asset.rs index c357e7abaf597..da3381b6923e4 100644 --- a/crates/turbopack-wasm/src/module_asset.rs +++ b/crates/turbopack-wasm/src/module_asset.rs @@ -19,7 +19,6 @@ use turbopack_ecmascript::{ EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, references::async_module::OptionAsyncModule, - EcmascriptModuleAsset, }; use crate::{ @@ -62,24 +61,43 @@ impl WebAssemblyModuleAsset { } #[turbo_tasks::function] - async fn loader(&self) -> Result> { - let query = &*self.source.ident().query().await?; + async fn loader_as_module(self: Vc) -> Result>> { + let this = self.await?; + let query = &*this.source.ident().query().await?; let loader_source = if query == "?module" { - compiling_loader_source(self.source) + compiling_loader_source(this.source) } else { - instantiating_loader_source(self.source) + instantiating_loader_source(this.source) }; - let module = self.asset_context.process( + let module = this.asset_context.process( loader_source, Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(self.source, self.asset_context)), + "WASM_PATH".into() => Vc::upcast(RawWebAssemblyModuleAsset::new(this.source, this.asset_context)), }))), ).module(); + Ok(module) + } + #[turbo_tasks::function] + async fn loader_as_resolve_origin(self: Vc) -> Result>> { + let module = self.loader_as_module(); + + let Some(esm_asset) = Vc::try_resolve_sidecast::>(module).await? + else { + bail!("WASM loader was not processed into an EcmascriptModuleAsset"); + }; + + Ok(esm_asset) + } + + #[turbo_tasks::function] + async fn loader(self: Vc) -> Result>> { + let module = self.loader_as_module(); + let Some(esm_asset) = - Vc::try_resolve_downcast_type::(module).await? + Vc::try_resolve_sidecast::>(module).await? else { bail!("WASM loader was not processed into an EcmascriptModuleAsset"); }; @@ -156,7 +174,7 @@ impl ResolveOrigin for WebAssemblyModuleAsset { #[turbo_tasks::function] fn get_inner_asset(self: Vc, request: Vc) -> Vc { - self.loader().get_inner_asset(request) + self.loader_as_resolve_origin().get_inner_asset(request) } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index 3eedd7243df0b..d6c6e1ed313cb 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -78,12 +78,14 @@ impl ModuleOptions { execution_context, ref rules, esm_url_rewrite_behavior, + special_exports, import_externals, ignore_dynamic_requests, use_swc_css, ref enable_typeof_window_inlining, .. } = *module_options_context.await?; + let special_exports = special_exports.unwrap_or_default(); if !rules.is_empty() { let path_value = path.await?; @@ -122,6 +124,7 @@ impl ModuleOptions { tree_shaking_mode, url_rewrite_behavior: esm_url_rewrite_behavior, import_externals, + special_exports, ignore_dynamic_requests, refresh, ..Default::default() diff --git a/crates/turbopack/src/module_options/module_options_context.rs b/crates/turbopack/src/module_options/module_options_context.rs index 0b4121f69cc6a..5e1ddf7cbff72 100644 --- a/crates/turbopack/src/module_options/module_options_context.rs +++ b/crates/turbopack/src/module_options/module_options_context.rs @@ -141,6 +141,7 @@ pub struct ModuleOptionsContext { pub placeholder_for_future_extensions: (), pub tree_shaking_mode: Option, pub esm_url_rewrite_behavior: Option, + pub special_exports: Option>>, /// References to externals from ESM imports should use `import()` and make /// async modules. pub import_externals: bool, From 4b34a316262d43a37f787a913535eb9ae1c15312 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 25 Jul 2024 17:32:08 +0200 Subject: [PATCH 62/73] GC auto increase memory limit on inefficient GC (#8687) ### Description When GC is inefficient and can't collect enough memory, increase the provided memory limit automatically. We rather want to consume more memory than requested then crashing or hanging the compilation due to GC. --- crates/turbo-tasks-memory/src/gc.rs | 87 +++++++++------- .../turbo-tasks-memory/src/memory_backend.rs | 98 ++++++++++++++----- crates/turbo-tasks-memory/src/task.rs | 5 +- 3 files changed, 131 insertions(+), 59 deletions(-) diff --git a/crates/turbo-tasks-memory/src/gc.rs b/crates/turbo-tasks-memory/src/gc.rs index 96c7be4800cd9..fe3e70e82b34a 100644 --- a/crates/turbo-tasks-memory/src/gc.rs +++ b/crates/turbo-tasks-memory/src/gc.rs @@ -72,18 +72,24 @@ const MAX_TASKS_PER_OLD_GENERATION: usize = 200_000; const PERCENTAGE_TO_COLLECT: usize = 30; const TASK_BASE_MEMORY_USAGE: usize = 1_000; const TASK_BASE_COMPUTE_DURATION_IN_MICROS: u64 = 1_000; -pub const PERCENTAGE_TARGET_MEMORY: usize = 88; -pub const PERCENTAGE_IDLE_TARGET_MEMORY: usize = 75; +pub const PERCENTAGE_MIN_TARGET_MEMORY: usize = 70; +pub const PERCENTAGE_MAX_TARGET_MEMORY: usize = 75; +pub const PERCENTAGE_MIN_IDLE_TARGET_MEMORY: usize = 55; +pub const PERCENTAGE_MAX_IDLE_TARGET_MEMORY: usize = 60; +pub const MAX_GC_STEPS: usize = 100; struct OldGeneration { tasks: Vec, generation: NonZeroU32, } +#[derive(Default)] struct ProcessGenerationResult { + old_generations: usize, priority: Option, content_dropped_count: usize, unloaded_count: usize, + already_unloaded_count: usize, } struct ProcessDeactivationsResult { @@ -222,22 +228,22 @@ impl GcQueue { &self, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> ProcessGenerationResult { - let old_generation = { + ) -> Option { + let old_generation_info = { let guard = &mut self.generations.lock(); - guard.pop_back() + let len = guard.len(); + guard.pop_back().map(|g| (g, len)) }; - let Some(OldGeneration { - mut tasks, - generation, - }) = old_generation + let Some(( + OldGeneration { + mut tasks, + generation, + }, + old_generations, + )) = old_generation_info else { // No old generation to process - return ProcessGenerationResult { - priority: None, - content_dropped_count: 0, - unloaded_count: 0, - }; + return None; }; // Check all tasks for the correct generation let mut indices = Vec::with_capacity(tasks.len()); @@ -256,11 +262,10 @@ impl GcQueue { if indices.is_empty() { // No valid tasks in old generation to process - return ProcessGenerationResult { - priority: None, - content_dropped_count: 0, - unloaded_count: 0, - }; + return Some(ProcessGenerationResult { + old_generations, + ..ProcessGenerationResult::default() + }); } // Sorting based on sort_by_cached_key from std lib @@ -316,6 +321,7 @@ impl GcQueue { // GC the tasks let mut content_dropped_count = 0; let mut unloaded_count = 0; + let mut already_unloaded_count = 0; for task in tasks[..tasks_to_collect].iter() { backend.with_task(*task, |task| { match task.run_gc(generation, self, backend, turbo_tasks) { @@ -327,26 +333,31 @@ impl GcQueue { GcResult::Unloaded => { unloaded_count += 1; } + GcResult::AlreadyUnloaded => { + already_unloaded_count += 1; + } } }); } - ProcessGenerationResult { + Some(ProcessGenerationResult { + old_generations, priority: Some(max_priority), content_dropped_count, unloaded_count, - } + already_unloaded_count, + }) } - /// Run garbage collection on the queue. + /// Run garbage collection on the queue. Returns true, if some progress has + /// been made. Returns the number of old generations. pub fn run_gc( &self, backend: &MemoryBackend, turbo_tasks: &dyn TurboTasksBackendApi, - ) -> Option<(GcPriority, usize)> { + ) -> Option { let span = tracing::trace_span!( - parent: None, - "garbage collection", + "garbage collection step", priority = Empty, deactivations_count = Empty, content_dropped_count = Empty, @@ -359,21 +370,27 @@ impl GcQueue { count: deactivations_count, } = self.process_deactivations(backend, turbo_tasks); - let ProcessGenerationResult { + if let Some(ProcessGenerationResult { + old_generations, priority, content_dropped_count, unloaded_count, - } = self.process_old_generation(backend, turbo_tasks); + already_unloaded_count, + }) = self.process_old_generation(backend, turbo_tasks) + { + span.record("deactivations_count", deactivations_count); + span.record("content_dropped_count", content_dropped_count); + span.record("unloaded_count", unloaded_count); + span.record("already_unloaded_count", already_unloaded_count); + if let Some(priority) = &priority { + span.record("priority", debug(priority)); + } else { + span.record("priority", ""); + } - span.record("deactivations_count", deactivations_count); - span.record("content_dropped_count", content_dropped_count); - span.record("unloaded_count", unloaded_count); - if let Some(priority) = &priority { - span.record("priority", debug(priority)); + Some(old_generations) } else { - span.record("priority", ""); + (deactivations_count > 0).then_some(0) } - - priority.map(|p| (p, content_dropped_count)) } } diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index 09086a41b9ec4..6992f861044ea 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -6,7 +6,7 @@ use std::{ num::NonZeroU32, pin::Pin, sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, }, time::Duration, @@ -31,7 +31,10 @@ use turbo_tasks::{ use crate::{ edges_set::{TaskEdge, TaskEdgesSet}, - gc::{GcQueue, PERCENTAGE_IDLE_TARGET_MEMORY, PERCENTAGE_TARGET_MEMORY}, + gc::{ + GcQueue, MAX_GC_STEPS, PERCENTAGE_MAX_IDLE_TARGET_MEMORY, PERCENTAGE_MAX_TARGET_MEMORY, + PERCENTAGE_MIN_IDLE_TARGET_MEMORY, PERCENTAGE_MIN_TARGET_MEMORY, + }, output::Output, task::{ReadCellError, Task, DEPENDENCIES_TO_TRACK}, task_statistics::TaskStatisticsApi, @@ -47,7 +50,7 @@ pub struct MemoryBackend { backend_job_id_factory: IdFactoryWithReuse, task_cache: DashMap>, TaskId, BuildHasherDefault>, - memory_limit: usize, + memory_limit: AtomicUsize, gc_queue: Option, idle_gc_active: AtomicBool, task_statistics: TaskStatisticsApi, @@ -70,7 +73,7 @@ impl MemoryBackend { (std::thread::available_parallelism().map_or(1, usize::from) * 32) .next_power_of_two(), ), - memory_limit, + memory_limit: AtomicUsize::new(memory_limit), gc_queue: (memory_limit != usize::MAX).then(GcQueue::new), idle_gc_active: AtomicBool::new(false), task_statistics: TaskStatisticsApi::default(), @@ -141,27 +144,78 @@ impl MemoryBackend { ) -> bool { if let Some(gc_queue) = &self.gc_queue { let mut did_something = false; - loop { - let mem_limit = self.memory_limit; - - let usage = turbo_tasks_malloc::TurboMalloc::memory_usage(); - let target = if idle { - mem_limit * PERCENTAGE_IDLE_TARGET_MEMORY / 100 + let mut remaining_generations = 0; + let mut mem_limit = self.memory_limit.load(Ordering::Relaxed); + let mut span = None; + 'outer: loop { + let mut collected_generations = 0; + let (min, max) = if idle { + ( + mem_limit * PERCENTAGE_MIN_IDLE_TARGET_MEMORY / 100, + mem_limit * PERCENTAGE_MAX_IDLE_TARGET_MEMORY / 100, + ) } else { - mem_limit * PERCENTAGE_TARGET_MEMORY / 100 + ( + mem_limit * PERCENTAGE_MIN_TARGET_MEMORY / 100, + mem_limit * PERCENTAGE_MAX_TARGET_MEMORY / 100, + ) }; - if usage < target { - return did_something; - } - - let collected = gc_queue.run_gc(self, turbo_tasks); - - // Collecting less than 100 tasks is not worth it - if !collected.map_or(false, |(_, count)| count > 100) { - return true; + let mut target = max; + let mut counter = 0; + loop { + let usage = turbo_tasks_malloc::TurboMalloc::memory_usage(); + if usage < target { + return did_something; + } + target = min; + if span.is_none() { + span = + Some(tracing::trace_span!(parent: None, "garbage collection", usage)); + } + + let progress = gc_queue.run_gc(self, turbo_tasks); + + if progress.is_some() { + did_something = true; + } + + if let Some(g) = progress { + remaining_generations = g; + if g > 0 { + collected_generations += 1; + } + } + + counter += 1; + if counter > MAX_GC_STEPS + || collected_generations > remaining_generations + || progress.is_none() + { + let new_mem_limit = mem_limit * 4 / 3; + if self + .memory_limit + .compare_exchange( + mem_limit, + new_mem_limit, + Ordering::Relaxed, + Ordering::Relaxed, + ) + .is_ok() + { + println!( + "Ineffective GC, increasing memory limit {} MB -> {} MB", + mem_limit / 1024 / 1024, + new_mem_limit / 1024 / 1024 + ); + mem_limit = new_mem_limit; + } else { + mem_limit = self.memory_limit.load(Ordering::Relaxed); + } + continue 'outer; + } + + did_something = true; } - - did_something = true; } } false diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index 1ce0059807706..3e7408a2db211 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -455,6 +455,7 @@ pub enum GcResult { /// from the graph and only makes sense when the task isn't currently /// active. Unloaded, + AlreadyUnloaded, } pub enum ReadCellError { @@ -1818,9 +1819,9 @@ impl Task { } TaskMetaStateWriteGuard::Partial(mut state) => { state.aggregation_node.shrink_to_fit(); - GcResult::Unloaded + GcResult::AlreadyUnloaded } - TaskMetaStateWriteGuard::Unloaded(_) => GcResult::Unloaded, + TaskMetaStateWriteGuard::Unloaded(_) => GcResult::AlreadyUnloaded, TaskMetaStateWriteGuard::TemporaryFiller => unreachable!(), } } From 310b69bd11dec6540c2e224489fc7c5748533abf Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Thu, 25 Jul 2024 12:28:42 -0500 Subject: [PATCH 63/73] fix: close stdin for non-interactive tasks (#8838) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Fixes #8281 With this PR we now close `stdin` for any task that is not marked as `"interactive": true` or `"persistent": true`. **Explanation** The `del-cli dbschema/edgeql-js dbschema/interfaces.*` part of `dram:codegen` task waits for user input if `stdin` isn't closed even if it isn't hooked up to a TTY: ``` dram:codegen: Checking the generated query builder into version control dram:codegen: is not recommended. Would you like to create a .gitignore file to ignore dram:codegen: the query builder directory? [y/n] (leave blank for "y") ``` This caused the task to never exit since there was no user to answer the prompt. The prompt was never surfaced as GH Action runs have logs grouped together by default and they are not flushed if a run is interrupted before it finishes. **How We Got Here** - We discovered that we were unintentionally letting starting child processes with inherited `stdin`. We disabled this in https://github.com/vercel/turbo/pull/7034 and shifted to never opening `stdin` for some child processes. - We started opening `stdin` for persistent tasks in https://github.com/vercel/turbo/pull/7196 as starting without `stdin` caused issues for some tools e.g. vite - https://github.com/vercel/turbo/pull/7767 changed behavior so *all* tasks started with `stdin`, but only some would receive input. We forgot to update the closing logic to close `stdin` for the tasks that shouldn't have it. **Future Work** We should invest time into fixing #6514 so that this prompt would have been seen on the CI runs. Seeing the prompt would've made the issue obvious. ### Testing Instructions Verify that running `vite` server with streamed logs doesn't crash: ``` [0 olszewski@chriss-mbp] /tmp/vite-test $ TURBO_UI=0 turbo_dev dev WARNING No locally installed `turbo` found. Using version: 2.0.10-canary.0. • Packages in scope: @repo/eslint-config, @repo/typescript-config, @repo/ui, docs, web • Running dev in 5 packages • Remote caching disabled web:dev: cache bypass, force executing d3eae62c93d9ce57 docs:dev: cache bypass, force executing c838417f19c48cfb docs:dev: docs:dev: > docs@0.0.0 dev /private/tmp/vite-test/apps/docs docs:dev: > vite --clearScreen false docs:dev: web:dev: web:dev: > web@0.0.0 dev /private/tmp/vite-test/apps/web web:dev: > vite --clearScreen false web:dev: web:dev: web:dev: VITE v5.1.4 ready in 81 ms web:dev: web:dev: ➜ Local: http://localhost:5173/ web:dev: ➜ Network: use --host to expose web:dev: ➜ press h + enter to show help docs:dev: Port 5173 is in use, trying another one... docs:dev: docs:dev: VITE v5.1.4 ready in 88 ms docs:dev: docs:dev: ➜ Local: http://localhost:5174/ docs:dev: ➜ Network: use --host to expose docs:dev: ➜ press h + enter to show help ``` Huge kudos to @jakubmazanec for remaining active on the issue while we figure this out. --- crates/turborepo-lib/src/task_graph/visitor.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/turborepo-lib/src/task_graph/visitor.rs b/crates/turborepo-lib/src/task_graph/visitor.rs index 3852edf766f63..605a392ba254c 100644 --- a/crates/turborepo-lib/src/task_graph/visitor.rs +++ b/crates/turborepo-lib/src/task_graph/visitor.rs @@ -952,6 +952,13 @@ impl ExecContext { } } + // Even if user does not have the TUI and cannot interact with a task, we keep + // stdin open for persistent tasks as some programs will shut down if stdin is + // closed. + if !self.takes_input { + process.stdin(); + } + let mut stdout_writer = self .task_cache .output_writer(prefixed_ui.task_writer()) From edb1f8f509605f0a6cf05f3529d8198ec66cdba1 Mon Sep 17 00:00:00 2001 From: Thomas Knickman Date: Thu, 25 Jul 2024 13:48:57 -0400 Subject: [PATCH 64/73] fix(docs): update old config (#8839) ### Description Pipeline > tasks ### Testing Instructions --- docs/repo-docs/guides/tools/storybook.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/repo-docs/guides/tools/storybook.mdx b/docs/repo-docs/guides/tools/storybook.mdx index f8aca67045fa3..22d22925fc972 100644 --- a/docs/repo-docs/guides/tools/storybook.mdx +++ b/docs/repo-docs/guides/tools/storybook.mdx @@ -334,7 +334,7 @@ Additionally, create a [Package Configuration](/repo/docs/reference/package-conf ```json title="./apps/storybook/turbo.json" { "extends": ["//"], - "pipeline": { + "tasks": { "build:storybook": { "dependsOn": ["^build:storybook"], "outputs": ["storybook-static/**"] From 4d035375008e6f2708bb292d3e9247dfdaab15a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:26:26 -0500 Subject: [PATCH 65/73] release(turborepo): 2.0.10-canary.1 (#8840) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index a784a70c2579b..639b22932ffb5 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index c88fcc5bf3ff2..829b76018f1b4 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index a0c843da09f36..01f75dfc64f30 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index 25837051718e3..fa78555e506a5 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index f16cceb8d67ee..b618bd8ba849c 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index a12a3dc6587ba..f081f93866863 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index 471f98d85d601..3df1710497599 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index eb12fcb98dc07..d03370f420e5b 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index 40c76562afeb7..430199edb296f 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.10-canary.0", + "version": "2.0.10-canary.1", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.10-canary.0", - "turbo-darwin-arm64": "2.0.10-canary.0", - "turbo-linux-64": "2.0.10-canary.0", - "turbo-linux-arm64": "2.0.10-canary.0", - "turbo-windows-64": "2.0.10-canary.0", - "turbo-windows-arm64": "2.0.10-canary.0" + "turbo-darwin-64": "2.0.10-canary.1", + "turbo-darwin-arm64": "2.0.10-canary.1", + "turbo-linux-64": "2.0.10-canary.1", + "turbo-linux-arm64": "2.0.10-canary.1", + "turbo-windows-64": "2.0.10-canary.1", + "turbo-windows-arm64": "2.0.10-canary.1" } } diff --git a/version.txt b/version.txt index 553a517e940ac..3d25e143b24ae 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.10-canary.0 +2.0.10-canary.1 canary From a812571f932d42969f4595a3ac3f8737a2ea3d87 Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Thu, 25 Jul 2024 11:43:20 -0700 Subject: [PATCH 66/73] Reduce macro usage in turbo-tasks-testing (#8832) ## What? Replaces the `turbo_tasks_testing::run!` macro with a `run` function that requires an opaque registration argument generated by the `register!` macro. ## Why? A few reasons: - `cargo fmt` doesn't work inside macros (with the exception of function-like macros), so our tests weren't getting autoformatted. - When a test fails, it was hard to know what line it failed on, because the failure is attributed to the first line of the macro usage. ## Related Changes - This also changes many (though not all) `.await?`s into `.await.unwrap()`s. The reason for this is similar: it's easier to attribute the line that causes a panic than the line that returns an error. I left some tests alone as there were more `?`s than I felt like changing. - `register!()` now takes an optional list of other register functions to call. The tests in `turbo-tasks-fetch` use this. ## Testing Instructions ``` cargo nextest run ``` --- Cargo.lock | 7 +- crates/turbo-tasks-fetch/Cargo.toml | 2 - crates/turbo-tasks-fetch/tests/fetch.rs | 142 ++++++++++-------- crates/turbo-tasks-macros-tests/Cargo.toml | 5 +- .../tests/task_input.rs | 16 +- .../tests/value_debug.rs | 15 +- crates/turbo-tasks-memory/Cargo.toml | 1 - crates/turbo-tasks-memory/tests/all_in_one.rs | 20 ++- crates/turbo-tasks-memory/tests/call_types.rs | 25 ++- .../turbo-tasks-memory/tests/collectibles.rs | 57 ++++--- crates/turbo-tasks-memory/tests/debug.rs | 117 ++++++++++----- .../tests/dirty_in_progress.rs | 18 ++- .../turbo-tasks-memory/tests/emptied_cells.rs | 34 +++-- .../turbo-tasks-memory/tests/read_ref_cell.rs | 19 ++- crates/turbo-tasks-memory/tests/recompute.rs | 18 ++- .../tests/recompute_collectibles.rs | 18 ++- .../turbo-tasks-memory/tests/scope_stress.rs | 7 +- .../tests/task_statistics.rs | 6 +- .../tests/trait_ref_cell.rs | 32 +++- crates/turbo-tasks-testing/Cargo.toml | 2 +- crates/turbo-tasks-testing/src/lib.rs | 4 +- crates/turbo-tasks-testing/src/macros.rs | 26 ---- crates/turbo-tasks-testing/src/run.rs | 52 +++++++ crates/turbo-tasks/src/completion.rs | 7 +- 24 files changed, 404 insertions(+), 246 deletions(-) delete mode 100644 crates/turbo-tasks-testing/src/macros.rs create mode 100644 crates/turbo-tasks-testing/src/run.rs diff --git a/Cargo.lock b/Cargo.lock index a5581cd37e96f..a8eb89cda282a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10146,14 +10146,12 @@ version = "0.1.0" dependencies = [ "anyhow", "httpmock", - "lazy_static", "reqwest", "serde", "tokio", "turbo-tasks", "turbo-tasks-build", "turbo-tasks-fs", - "turbo-tasks-memory", "turbo-tasks-testing", "turbopack-core", ] @@ -10231,13 +10229,11 @@ name = "turbo-tasks-macros-tests" version = "0.1.0" dependencies = [ "anyhow", - "lazy_static", "serde", "tokio", "trybuild", "turbo-tasks", "turbo-tasks-build", - "turbo-tasks-memory", "turbo-tasks-testing", ] @@ -10259,7 +10255,6 @@ dependencies = [ "dashmap", "either", "indexmap 1.9.3", - "lazy_static", "loom", "num_cpus", "once_cell", @@ -10290,10 +10285,10 @@ dependencies = [ "anyhow", "auto-hash-map", "futures", - "lazy_static", "rustc-hash", "tokio", "turbo-tasks", + "turbo-tasks-memory", ] [[package]] diff --git a/crates/turbo-tasks-fetch/Cargo.toml b/crates/turbo-tasks-fetch/Cargo.toml index a26f541154e2b..59a2ed5d63df2 100644 --- a/crates/turbo-tasks-fetch/Cargo.toml +++ b/crates/turbo-tasks-fetch/Cargo.toml @@ -20,7 +20,6 @@ workspace = true [dependencies] anyhow = { workspace = true } -lazy_static = { workspace = true } reqwest = { workspace = true } serde = { workspace = true } tokio = { workspace = true } @@ -31,7 +30,6 @@ turbopack-core = { workspace = true } [dev-dependencies] httpmock = { workspace = true } tokio = { workspace = true, features = ["full"] } -turbo-tasks-memory = { workspace = true } turbo-tasks-testing = { workspace = true } [build-dependencies] diff --git a/crates/turbo-tasks-fetch/tests/fetch.rs b/crates/turbo-tasks-fetch/tests/fetch.rs index 531ad8f7ca354..12e97eede4ee2 100644 --- a/crates/turbo-tasks-fetch/tests/fetch.rs +++ b/crates/turbo-tasks-fetch/tests/fetch.rs @@ -1,143 +1,159 @@ #![cfg(test)] use turbo_tasks::Vc; -use turbo_tasks_fetch::{fetch, register, FetchErrorKind}; +use turbo_tasks_fetch::{fetch, FetchErrorKind}; use turbo_tasks_fs::{DiskFileSystem, FileSystem, FileSystemPath}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; use turbopack_core::issue::{Issue, IssueSeverity, StyledString}; -register!(); +static REGISTRATION: Registration = register!(turbo_tasks_fetch::register); #[tokio::test] async fn basic_get() { - run! { - register(); - + run(®ISTRATION, async { let server = httpmock::MockServer::start(); let resource_mock = server.mock(|when, then| { when.path("/foo.woff"); - then.status(200) - .body("responsebody"); + then.status(200).body("responsebody"); }); - - let result = &*fetch(Vc::cell(server.url("/foo.woff").into()), Vc::cell(None), Vc::cell(None)).await?; + let result = &*fetch( + Vc::cell(server.url("/foo.woff").into()), + Vc::cell(None), + Vc::cell(None), + ) + .await + .unwrap(); resource_mock.assert(); match result { Err(_) => panic!(), Ok(response) => { - let response = response.await?; + let response = response.await.unwrap(); assert_eq!(response.status, 200); - assert_eq!(*response.body.to_string().await?, "responsebody"); + assert_eq!(*response.body.to_string().await.unwrap(), "responsebody"); } } - } + }) + .await } #[tokio::test] async fn sends_user_agent() { - run! { - register(); - + run(®ISTRATION, async { let server = httpmock::MockServer::start(); let resource_mock = server.mock(|when, then| { when.path("/foo.woff").header("User-Agent", "foo"); - then.status(200) - .body("responsebody"); + then.status(200).body("responsebody"); }); - let result = &*fetch(Vc::cell(server.url("/foo.woff").into()), Vc::cell(Some("foo".into())), Vc::cell(None)).await?; + let result = &*fetch( + Vc::cell(server.url("/foo.woff").into()), + Vc::cell(Some("foo".into())), + Vc::cell(None), + ) + .await + .unwrap(); resource_mock.assert(); - let Ok(response) = result else { - panic!() - }; + let Ok(response) = result else { panic!() }; - let response = response.await?; + let response = response.await.unwrap(); assert_eq!(response.status, 200); - assert_eq!(*response.body.to_string().await?, "responsebody"); - } + assert_eq!(*response.body.to_string().await.unwrap(), "responsebody"); + }) + .await } // This is temporary behavior. // TODO: Implement invalidation that respects Cache-Control headers. #[tokio::test] async fn invalidation_does_not_invalidate() { - run! { - register(); - + run(®ISTRATION, async { let server = httpmock::MockServer::start(); let resource_mock = server.mock(|when, then| { when.path("/foo.woff").header("User-Agent", "foo"); - then.status(200) - .body("responsebody"); + then.status(200).body("responsebody"); }); let url = Vc::cell(server.url("/foo.woff").into()); let user_agent = Vc::cell(Some("foo".into())); let proxy = Vc::cell(None); - let result = &*fetch(url, user_agent, proxy).await?; + let result = &*fetch(url, user_agent, proxy).await.unwrap(); resource_mock.assert(); - let Ok(response_vc) = result else { - panic!() - }; - let response = response_vc.await?; + let Ok(response_vc) = result else { panic!() }; + let response = response_vc.await.unwrap(); assert_eq!(response.status, 200); - assert_eq!(*response.body.to_string().await?, "responsebody"); + assert_eq!(*response.body.to_string().await.unwrap(), "responsebody"); - let second_result = &*fetch(url, user_agent, proxy).await?; + let second_result = &*fetch(url, user_agent, proxy).await.unwrap(); let Ok(second_response_vc) = second_result else { panic!() }; - let second_response = second_response_vc.await?; + let second_response = second_response_vc.await.unwrap(); - // Assert that a second request is never sent -- the result is cached via turbo tasks + // Assert that a second request is never sent -- the result is cached via turbo + // tasks resource_mock.assert_hits(1); assert_eq!(response, second_response); - } + }) + .await } #[tokio::test] async fn errors_on_failed_connection() { - run! { - register(); - + run(®ISTRATION, async { let url = "https://doesnotexist/foo.woff"; - let result = &*fetch(Vc::cell(url.into()), Vc::cell(None), Vc::cell(None)).await?; + let result = &*fetch(Vc::cell(url.into()), Vc::cell(None), Vc::cell(None)).await.unwrap(); let Err(err_vc) = result else { panic!() }; - let err = &*err_vc.await?; - assert_eq!(*err.kind.await?, FetchErrorKind::Connect); - assert_eq!(*err.url.await?, url); + let err = &*err_vc.await.unwrap(); + assert_eq!(*err.kind.await.unwrap(), FetchErrorKind::Connect); + assert_eq!(*err.url.await.unwrap(), url); let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); - assert_eq!(*issue.severity().await?, IssueSeverity::Error); - assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text("There was an issue establishing a connection while requesting https://doesnotexist/foo.woff.".into())); - } + assert_eq!(*issue.severity().await.unwrap(), IssueSeverity::Error); + assert_eq!(*issue.description().await.unwrap().unwrap().await.unwrap(), StyledString::Text("There was an issue establishing a connection while requesting https://doesnotexist/foo.woff.".into())); + }) + .await } #[tokio::test] async fn errors_on_404() { - run! { - register(); - + run(®ISTRATION, async { let server = httpmock::MockServer::start(); let resource_url = server.url("/"); - let result = &*fetch(Vc::cell(resource_url.clone().into()), Vc::cell(None), Vc::cell(None)).await?; - let Err(err_vc) = result else { - panic!() - }; - let err = &*err_vc.await?; - assert!(matches!(*err.kind.await?, FetchErrorKind::Status(404))); - assert_eq!(*err.url.await?, resource_url); + let result = &*fetch( + Vc::cell(resource_url.clone().into()), + Vc::cell(None), + Vc::cell(None), + ) + .await + .unwrap(); + let Err(err_vc) = result else { panic!() }; + let err = &*err_vc.await.unwrap(); + assert!(matches!( + *err.kind.await.unwrap(), + FetchErrorKind::Status(404) + )); + assert_eq!(*err.url.await.unwrap(), resource_url); let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); - assert_eq!(*issue.severity().await?, IssueSeverity::Error); - assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text(format!("Received response with status 404 when requesting {}", &resource_url).into())); - } + assert_eq!(*issue.severity().await.unwrap(), IssueSeverity::Error); + assert_eq!( + *issue.description().await.unwrap().unwrap().await.unwrap(), + StyledString::Text( + format!( + "Received response with status 404 when requesting {}", + &resource_url + ) + .into() + ) + ); + }) + .await } fn get_issue_context() -> Vc { diff --git a/crates/turbo-tasks-macros-tests/Cargo.toml b/crates/turbo-tasks-macros-tests/Cargo.toml index cf8988291657c..d52804b5d68d1 100644 --- a/crates/turbo-tasks-macros-tests/Cargo.toml +++ b/crates/turbo-tasks-macros-tests/Cargo.toml @@ -9,12 +9,9 @@ edition = "2021" anyhow = { workspace = true } serde = { workspace = true } tokio = { workspace = true } +trybuild = { version = "1.0.97" } turbo-tasks = { workspace = true } -turbo-tasks-memory = { workspace = true } turbo-tasks-testing = { workspace = true } -# TODO: turbo-tasks-testing uses a macro that requires us to depend on lazy-static. -lazy_static = { workspace = true } -trybuild = { version = "1.0.97" } [build-dependencies] turbo-tasks-build = { workspace = true } diff --git a/crates/turbo-tasks-macros-tests/tests/task_input.rs b/crates/turbo-tasks-macros-tests/tests/task_input.rs index fa516a8180ae5..143592a2514d3 100644 --- a/crates/turbo-tasks-macros-tests/tests/task_input.rs +++ b/crates/turbo-tasks-macros-tests/tests/task_input.rs @@ -3,10 +3,10 @@ //! macro and the `#[turbo_tasks::function]` macro. use serde::{Deserialize, Serialize}; -use turbo_tasks::{Completion, TaskInput, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks::{Completion, ReadRef, TaskInput, Vc}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[derive(Clone, TaskInput, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] struct OneUnnamedField(u32); @@ -19,7 +19,11 @@ async fn one_unnamed_field(input: OneUnnamedField) -> Vc { #[tokio::test] async fn tests() { - run! { - one_unnamed_field(OneUnnamedField(42)).await?; - } + run(®ISTRATION, async { + assert!(ReadRef::ptr_eq( + &one_unnamed_field(OneUnnamedField(42)).await.unwrap(), + &Completion::immutable().await.unwrap(), + )) + }) + .await } diff --git a/crates/turbo-tasks-macros-tests/tests/value_debug.rs b/crates/turbo-tasks-macros-tests/tests/value_debug.rs index 0bbb7c2a0d165..317912a60e075 100644 --- a/crates/turbo-tasks-macros-tests/tests/value_debug.rs +++ b/crates/turbo-tasks-macros-tests/tests/value_debug.rs @@ -1,7 +1,7 @@ use turbo_tasks::debug::ValueDebugFormat; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn ignored_indexes() { @@ -17,11 +17,16 @@ async fn ignored_indexes() { i32, ); - run! { + run(®ISTRATION, async { let input = IgnoredIndexes(-1, 2, -3); - let debug = input.value_debug_format(usize::MAX).try_to_string().await?; + let debug = input + .value_debug_format(usize::MAX) + .try_to_string() + .await + .unwrap(); assert!(!debug.contains("-1")); assert!(debug.contains('2')); assert!(!debug.contains("-3")); - } + }) + .await; } diff --git a/crates/turbo-tasks-memory/Cargo.toml b/crates/turbo-tasks-memory/Cargo.toml index 1ab1dcef38085..37be735ce7de6 100644 --- a/crates/turbo-tasks-memory/Cargo.toml +++ b/crates/turbo-tasks-memory/Cargo.toml @@ -36,7 +36,6 @@ turbo-tasks-malloc = { workspace = true, default-features = false } [dev-dependencies] criterion = { workspace = true, features = ["async_tokio"] } -lazy_static = { workspace = true } loom = "0.7.2" rand = { workspace = true, features = ["small_rng"] } regex = { workspace = true } diff --git a/crates/turbo-tasks-memory/tests/all_in_one.rs b/crates/turbo-tasks-memory/tests/all_in_one.rs index b588f2bfe4930..b58ea58964bff 100644 --- a/crates/turbo-tasks-memory/tests/all_in_one.rs +++ b/crates/turbo-tasks-memory/tests/all_in_one.rs @@ -3,13 +3,13 @@ use anyhow::{anyhow, bail, Result}; use indexmap::{IndexMap, IndexSet}; use turbo_tasks::{debug::ValueDebug, RcStr, Value, ValueToString, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn all_in_one() { - run! { + run(®ISTRATION, async { let a: Vc = Vc::cell(4242); assert_eq!(*a.await?, 4242); @@ -43,7 +43,13 @@ async fn all_in_one() { let b_erased: Vc> = Vc::upcast(b); let c_erased: Vc> = a_erased.add(b_erased); - assert_eq!(*Vc::try_resolve_downcast_type::(c_erased).await?.unwrap().await?, 42); + assert_eq!( + *Vc::try_resolve_downcast_type::(c_erased) + .await? + .unwrap() + .await?, + 42 + ); let b_erased_other: Vc> = Vc::upcast(Vc::::cell(10)); let c_erased_invalid: Vc> = a_erased.add(b_erased_other); @@ -103,7 +109,11 @@ async fn all_in_one() { assert_eq!(*map.is_empty().await?, true); assert_eq!(&*map.await?, &IndexMap::, Vc>::default()); assert_eq!(map.dbg().await?.to_string(), "{}"); - } + + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value(transparent, serialization = "auto_for_input")] diff --git a/crates/turbo-tasks-memory/tests/call_types.rs b/crates/turbo-tasks-memory/tests/call_types.rs index c5e2d7f3168ea..6870d396e64f1 100644 --- a/crates/turbo-tasks-memory/tests/call_types.rs +++ b/crates/turbo-tasks-memory/tests/call_types.rs @@ -2,20 +2,23 @@ use anyhow::Result; use turbo_tasks::Vc; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn functions() { - run! { + run(®ISTRATION, async { assert_eq!(*fn_plain().await?, 42); assert_eq!(*fn_arg(43).await?, 43); assert_eq!(*fn_vc_arg(Vc::cell(44)).await?, 44); assert_eq!(*async_fn_plain().await?, 42); assert_eq!(*async_fn_arg(43).await?, 43); assert_eq!(*async_fn_vc_arg(Vc::cell(44)).await?, 44); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::function] @@ -50,7 +53,7 @@ async fn async_fn_vc_arg(n: Vc) -> Result> { #[tokio::test] async fn methods() { - run! { + run(®ISTRATION, async { assert_eq!(*Value::static_method().await?, 42); assert_eq!(*Value::async_static_method().await?, 42); @@ -59,7 +62,10 @@ async fn methods() { assert_eq!(*value.async_method().await?, 43); assert_eq!(*value.vc_method().await?, 42); assert_eq!(*value.async_vc_method().await?, 43); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value] @@ -100,7 +106,7 @@ impl Value { #[tokio::test] async fn trait_methods() { - run! { + run(®ISTRATION, async { assert_eq!(*Value::static_trait_method().await?, 42); assert_eq!(*Value::async_static_trait_method().await?, 42); @@ -127,7 +133,10 @@ async fn trait_methods() { assert_eq!(*trait_value.async_trait_method().await?, 43); assert_eq!(*trait_value.default_trait_method().await?, 42); assert_eq!(*trait_value.default_async_trait_method().await?, 42); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::function] diff --git a/crates/turbo-tasks-memory/tests/collectibles.rs b/crates/turbo-tasks-memory/tests/collectibles.rs index 779b20246c20e..2bf0b392117ab 100644 --- a/crates/turbo-tasks-memory/tests/collectibles.rs +++ b/crates/turbo-tasks-memory/tests/collectibles.rs @@ -6,12 +6,13 @@ use anyhow::Result; use auto_hash_map::AutoSet; use tokio::time::sleep; use turbo_tasks::{emit, CollectiblesSource, RcStr, ValueToString, Vc}; -use turbo_tasks_testing::{register, run}; -register!(); +use turbo_tasks_testing::{register, run, Registration}; + +static REGISTRATION: Registration = register!(); #[tokio::test] async fn transitive_emitting() { - run! { + run(®ISTRATION, async { let result = my_transitive_emitting_function("".into(), "".into()); result.strongly_consistent().await?; let list = result.peek_collectibles::>(); @@ -21,12 +22,15 @@ async fn transitive_emitting() { assert!(expected.remove(collectible.to_string().await?.as_str())) } assert_eq!(result.await?.0, 0); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[tokio::test] async fn transitive_emitting_indirect() { - run! { + run(®ISTRATION, async { let result = my_transitive_emitting_function("".into(), "".into()); let collectibles = my_transitive_emitting_function_collectibles("".into(), "".into()); let list = collectibles.strongly_consistent().await?; @@ -36,12 +40,15 @@ async fn transitive_emitting_indirect() { assert!(expected.remove(collectible.to_string().await?.as_str())) } assert_eq!(result.await?.0, 0); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[tokio::test] async fn multi_emitting() { - run! { + run(®ISTRATION, async { let result = my_multi_emitting_function(); result.strongly_consistent().await?; let list = result.peek_collectibles::>(); @@ -51,24 +58,30 @@ async fn multi_emitting() { assert!(expected.remove(collectible.to_string().await?.as_str())) } assert_eq!(result.await?.0, 0); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[tokio::test] async fn taking_collectibles() { - run! { + run(®ISTRATION, async { let result = my_collecting_function(); let list = result.take_collectibles::>(); // my_collecting_function already processed the collectibles so the list should // be empty assert!(list.is_empty()); assert_eq!(result.await?.0, 0); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[tokio::test] async fn taking_collectibles_extra_layer() { - run! { + run(®ISTRATION, async { let result = my_collecting_function_indirect(); result.strongly_consistent().await?; let list = result.take_collectibles::>(); @@ -76,12 +89,15 @@ async fn taking_collectibles_extra_layer() { // be empty assert!(list.is_empty()); assert_eq!(result.await?.0, 0); - } + anyhow::Ok(()) + }) + .await + .unwrap() } #[tokio::test] async fn taking_collectibles_parallel() { - run! { + run(®ISTRATION, async { let result = my_transitive_emitting_function("".into(), "a".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); @@ -94,24 +110,31 @@ async fn taking_collectibles_parallel() { assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "1".into()); + let result = + my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "1".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "2".into()); + let result = + my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "2".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".into(), "c".into(), "3".into()); + let result = + my_transitive_emitting_function_with_child_scope("".into(), "c".into(), "3".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - } + + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value(transparent)] diff --git a/crates/turbo-tasks-memory/tests/debug.rs b/crates/turbo-tasks-memory/tests/debug.rs index ecc2c1c6e4d11..579b84025d1a8 100644 --- a/crates/turbo-tasks-memory/tests/debug.rs +++ b/crates/turbo-tasks-memory/tests/debug.rs @@ -3,97 +3,134 @@ use std::sync::Mutex; use turbo_tasks::{debug::ValueDebug, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn primitive_debug() { - run! { + run(®ISTRATION, async { let a: Vc = Vc::cell(42); - assert_eq!(format!("{:?}", a.dbg().await?), "42"); - } + assert_eq!(format!("{:?}", a.dbg().await.unwrap()), "42"); + }) + .await } #[tokio::test] async fn transparent_debug() { - run! { + run(®ISTRATION, async { let a: Vc = Transparent(42).cell(); - assert_eq!(format!("{:?}", a.dbg().await?), "42"); - } + assert_eq!(format!("{:?}", a.dbg().await.unwrap()), "42"); + }) + .await } #[tokio::test] async fn enum_none_debug() { - run! { + run(®ISTRATION, async { let a: Vc = Enum::None.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), "Enum::None"); - } + assert_eq!(format!("{:?}", a.dbg().await.unwrap()), "Enum::None"); + }) + .await } #[tokio::test] async fn enum_transparent_debug() { - run! { + run(®ISTRATION, async { let a: Vc = Enum::Transparent(Transparent(42).cell()).cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"Enum::Transparent( + assert_eq!( + format!("{:?}", a.dbg().await.unwrap()), + r#"Enum::Transparent( 42, -)"#); - } +)"# + ); + }) + .await } #[tokio::test] async fn enum_inner_vc_debug() { - run! { + run(®ISTRATION, async { let a: Vc = Enum::Enum(Enum::None.cell()).cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"Enum::Enum( + assert_eq!( + format!("{:?}", a.dbg().await.unwrap()), + r#"Enum::Enum( Enum::None, -)"#); - } +)"# + ); + }) + .await } #[tokio::test] async fn struct_unit_debug() { - run! { + run(®ISTRATION, async { let a: Vc = StructUnit.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), "StructUnit"); - } + assert_eq!(format!("{:?}", a.dbg().await.unwrap()), "StructUnit"); + }) + .await } #[tokio::test] async fn struct_transparent_debug() { - run! { - let a: Vc = StructWithTransparent { transparent: Transparent(42).cell() }.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"StructWithTransparent { + run(®ISTRATION, async { + let a: Vc = StructWithTransparent { + transparent: Transparent(42).cell(), + } + .cell(); + assert_eq!( + format!("{:?}", a.dbg().await.unwrap()), + r#"StructWithTransparent { transparent: 42, -}"#); - } +}"# + ); + }) + .await } #[tokio::test] async fn struct_vec_debug() { - run! { + run(®ISTRATION, async { let a: Vc = StructWithVec { vec: vec![] }.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"StructWithVec { + assert_eq!( + format!("{:?}", a.dbg().await.unwrap()), + r#"StructWithVec { vec: [], -}"#); - - let b: Vc = StructWithVec { vec: vec![Transparent(42).cell()] }.cell(); - assert_eq!(format!("{:?}", b.dbg().await?), r#"StructWithVec { +}"# + ); + + let b: Vc = StructWithVec { + vec: vec![Transparent(42).cell()], + } + .cell(); + assert_eq!( + format!("{:?}", b.dbg().await.unwrap()), + r#"StructWithVec { vec: [ 42, ], -}"#); - } +}"# + ); + }) + .await } #[tokio::test] async fn struct_ignore_debug() { - run! { - let a: Vc = StructWithIgnore { dont_ignore: 42, ignore: Mutex::new(()) }.cell(); - assert_eq!(format!("{:?}", a.dbg().await?), r#"StructWithIgnore { + run(®ISTRATION, async { + let a: Vc = StructWithIgnore { + dont_ignore: 42, + ignore: Mutex::new(()), + } + .cell(); + assert_eq!( + format!("{:?}", a.dbg().await.unwrap()), + r#"StructWithIgnore { dont_ignore: 42, -}"#); - } +}"# + ); + }) + .await } #[turbo_tasks::value(transparent, shared)] diff --git a/crates/turbo-tasks-memory/tests/dirty_in_progress.rs b/crates/turbo-tasks-memory/tests/dirty_in_progress.rs index 91e0b13dd9e7f..6f67cdc0b45b5 100644 --- a/crates/turbo-tasks-memory/tests/dirty_in_progress.rs +++ b/crates/turbo-tasks-memory/tests/dirty_in_progress.rs @@ -4,13 +4,13 @@ use std::time::Duration; use anyhow::{bail, Result}; use turbo_tasks::{emit, CollectiblesSource, RcStr, State, ValueToString, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn dirty_in_progress() { - run! { + run(®ISTRATION, async { let cases = [ (1, 3, 2, 2, ""), (11, 13, 12, 42, "12"), @@ -23,20 +23,22 @@ async fn dirty_in_progress() { println!("{} -> {} -> {} = {} {}", a, b, c, value, collectible); let input = ChangingInput { state: State::new(a), - }.cell(); - let input_val = input.await?; + } + .cell(); + let input_val = input.await.unwrap(); let output = compute(input); - output.await?; + output.await.unwrap(); println!("update to {}", b); input_val.state.set(b); tokio::time::sleep(Duration::from_millis(100)).await; println!("update to {}", c); input_val.state.set(c); - let read = output.strongly_consistent().await?; + let read = output.strongly_consistent().await.unwrap(); assert_eq!(read.value, value); assert_eq!(read.collectible, collectible); } - } + }) + .await } #[turbo_tasks::value] diff --git a/crates/turbo-tasks-memory/tests/emptied_cells.rs b/crates/turbo-tasks-memory/tests/emptied_cells.rs index 7066be6d57520..326636c709b54 100644 --- a/crates/turbo-tasks-memory/tests/emptied_cells.rs +++ b/crates/turbo-tasks-memory/tests/emptied_cells.rs @@ -2,39 +2,41 @@ use anyhow::Result; use turbo_tasks::{State, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn recompute() { - run! { + run(®ISTRATION, async { let input = ChangingInput { state: State::new(1), - }.cell(); + } + .cell(); let output = compute(input); - assert_eq!(*output.await?, 1); + assert_eq!(*output.await.unwrap(), 1); println!("changing input"); - input.await?.state.set(10); - assert_eq!(*output.strongly_consistent().await?, 10); + input.await.unwrap().state.set(10); + assert_eq!(*output.strongly_consistent().await.unwrap(), 10); println!("changing input"); - input.await?.state.set(5); - assert_eq!(*output.strongly_consistent().await?, 5); + input.await.unwrap().state.set(5); + assert_eq!(*output.strongly_consistent().await.unwrap(), 5); println!("changing input"); - input.await?.state.set(20); - assert_eq!(*output.strongly_consistent().await?, 20); + input.await.unwrap().state.set(20); + assert_eq!(*output.strongly_consistent().await.unwrap(), 20); println!("changing input"); - input.await?.state.set(15); - assert_eq!(*output.strongly_consistent().await?, 15); + input.await.unwrap().state.set(15); + assert_eq!(*output.strongly_consistent().await.unwrap(), 15); println!("changing input"); - input.await?.state.set(1); - assert_eq!(*output.strongly_consistent().await?, 1); - } + input.await.unwrap().state.set(1); + assert_eq!(*output.strongly_consistent().await.unwrap(), 1); + }) + .await } #[turbo_tasks::value] diff --git a/crates/turbo-tasks-memory/tests/read_ref_cell.rs b/crates/turbo-tasks-memory/tests/read_ref_cell.rs index 5cc5210b18c31..6266d3c56fe5d 100644 --- a/crates/turbo-tasks-memory/tests/read_ref_cell.rs +++ b/crates/turbo-tasks-memory/tests/read_ref_cell.rs @@ -4,14 +4,16 @@ use std::sync::Mutex; use anyhow::Result; use turbo_tasks::{get_invalidator, Invalidator, ReadRef, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn read_ref() { - run! { - let counter = Counter::cell(Counter { value: Mutex::new((0, None))}); + run(®ISTRATION, async { + let counter = Counter::cell(Counter { + value: Mutex::new((0, None)), + }); let counter_value = counter.get_value(); @@ -28,7 +30,8 @@ async fn read_ref() { let ref_counter_value = ref_counter.get_value(); // However, `local_counter_value` will point to the value of `counter_value` - // at the time it was turned into a trait reference (just like a `ReadRef` would). + // at the time it was turned into a trait reference (just like a `ReadRef` + // would). let local_counter_value = ReadRef::cell(counter_value.await?).get_value(); counter.await?.incr(); @@ -37,7 +40,11 @@ async fn read_ref() { assert_eq!(*counter_value.strongly_consistent().await?, 2); assert_eq!(*ref_counter_value.strongly_consistent().await?, 2); assert_eq!(*local_counter_value.strongly_consistent().await?, 1); - } + + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value(transparent)] diff --git a/crates/turbo-tasks-memory/tests/recompute.rs b/crates/turbo-tasks-memory/tests/recompute.rs index 2bdb6479e1779..976efd03e66b7 100644 --- a/crates/turbo-tasks-memory/tests/recompute.rs +++ b/crates/turbo-tasks-memory/tests/recompute.rs @@ -2,19 +2,21 @@ use anyhow::Result; use turbo_tasks::{State, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn recompute() { - run! { + run(®ISTRATION, async { let input = ChangingInput { state: State::new(1), - }.cell(); + } + .cell(); let input2 = ChangingInput { state: State::new(10), - }.cell(); + } + .cell(); let output = compute(input, input2); let read = output.await?; assert_eq!(read.state_value, 1); @@ -47,7 +49,11 @@ async fn recompute() { input2.await?.state.set(30); let read = output.strongly_consistent().await?; assert_eq!(read.random_value, random_value); - } + + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value] diff --git a/crates/turbo-tasks-memory/tests/recompute_collectibles.rs b/crates/turbo-tasks-memory/tests/recompute_collectibles.rs index 7771df738fd15..07391c207a703 100644 --- a/crates/turbo-tasks-memory/tests/recompute_collectibles.rs +++ b/crates/turbo-tasks-memory/tests/recompute_collectibles.rs @@ -2,28 +2,30 @@ use anyhow::{bail, Result}; use turbo_tasks::{emit, CollectiblesSource, RcStr, State, ValueToString, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn recompute() { - run! { + run(®ISTRATION, async { let input = ChangingInput { state: State::new(1), - }.cell(); + } + .cell(); let output = compute(input, 100); - let read = output.await?; + let read = output.await.unwrap(); assert_eq!(read.value, 42); assert_eq!(read.collectible, "1"); for i in 2..100 { - input.await?.state.set(i); - let read = output.strongly_consistent().await?; + input.await.unwrap().state.set(i); + let read = output.strongly_consistent().await.unwrap(); assert_eq!(read.value, 42); assert_eq!(read.collectible, i.to_string()); } - } + }) + .await } #[turbo_tasks::value] diff --git a/crates/turbo-tasks-memory/tests/scope_stress.rs b/crates/turbo-tasks-memory/tests/scope_stress.rs index b92776b2693b5..fa5e827269815 100644 --- a/crates/turbo-tasks-memory/tests/scope_stress.rs +++ b/crates/turbo-tasks-memory/tests/scope_stress.rs @@ -3,14 +3,13 @@ use anyhow::Result; use turbo_tasks::{Completion, TryJoinIterExt, TurboTasks, Vc}; use turbo_tasks_memory::MemoryBackend; -use turbo_tasks_testing::register; +use turbo_tasks_testing::{register, Registration}; -register!(); +static REGISTRATION: Registration = register!(); -#[allow(clippy::no_effect)] // for *REGISTER #[test] fn rectangle_stress() { - *REGISTER; + REGISTRATION.ensure_registered(); let rt = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() diff --git a/crates/turbo-tasks-memory/tests/task_statistics.rs b/crates/turbo-tasks-memory/tests/task_statistics.rs index 98c1dae4e8be7..e6775812a1983 100644 --- a/crates/turbo-tasks-memory/tests/task_statistics.rs +++ b/crates/turbo-tasks-memory/tests/task_statistics.rs @@ -11,9 +11,9 @@ use regex::Regex; use serde_json::json; use turbo_tasks::{TurboTasks, Vc}; use turbo_tasks_memory::MemoryBackend; -use turbo_tasks_testing::register; +use turbo_tasks_testing::{register, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn test_simple_task() { @@ -239,7 +239,7 @@ async fn run_with_tt(func: impl FnOnce(Arc>) -> F where Fut: Future + Send + 'static, { - *REGISTER; + REGISTRATION.ensure_registered(); let tt = TurboTasks::new(MemoryBackend::default()); tt.backend().task_statistics().enable(); let fut = func(Arc::clone(&tt)); diff --git a/crates/turbo-tasks-memory/tests/trait_ref_cell.rs b/crates/turbo-tasks-memory/tests/trait_ref_cell.rs index 1de21c0b3212d..cfde0d3f4d828 100644 --- a/crates/turbo-tasks-memory/tests/trait_ref_cell.rs +++ b/crates/turbo-tasks-memory/tests/trait_ref_cell.rs @@ -4,14 +4,16 @@ use std::sync::Mutex; use anyhow::Result; use turbo_tasks::{get_invalidator, IntoTraitRef, Invalidator, TraitRef, Vc}; -use turbo_tasks_testing::{register, run}; +use turbo_tasks_testing::{register, run, Registration}; -register!(); +static REGISTRATION: Registration = register!(); #[tokio::test] async fn trait_ref() { - run! { - let counter = Counter::cell(Counter { value: Mutex::new((0, None))}); + run(®ISTRATION, async { + let counter = Counter::cell(Counter { + value: Mutex::new((0, None)), + }); let counter_value = counter.get_value(); @@ -24,12 +26,22 @@ async fn trait_ref() { assert_eq!(*counter_value.strongly_consistent().await?, 1); // `ref_counter` will still point to the same `counter` instance as `counter`. - let ref_counter = TraitRef::cell(Vc::upcast::>(counter).into_trait_ref().await?); + let ref_counter = TraitRef::cell( + Vc::upcast::>(counter) + .into_trait_ref() + .await?, + ); let ref_counter_value = ref_counter.get_value(); // However, `local_counter_value` will point to the value of `counter_value` - // at the time it was turned into a trait reference (just like a `ReadRef` would). - let local_counter_value = TraitRef::cell(Vc::upcast::>(counter_value).into_trait_ref().await?).get_value(); + // at the time it was turned into a trait reference (just like a `ReadRef` + // would). + let local_counter_value = TraitRef::cell( + Vc::upcast::>(counter_value) + .into_trait_ref() + .await?, + ) + .get_value(); counter.await?.incr(); @@ -37,7 +49,11 @@ async fn trait_ref() { assert_eq!(*counter_value.strongly_consistent().await?, 2); assert_eq!(*ref_counter_value.strongly_consistent().await?, 2); assert_eq!(*local_counter_value.strongly_consistent().await?, 1); - } + + anyhow::Ok(()) + }) + .await + .unwrap() } #[turbo_tasks::value(transparent)] diff --git a/crates/turbo-tasks-testing/Cargo.toml b/crates/turbo-tasks-testing/Cargo.toml index 71f1f31d9c6fc..30de612015616 100644 --- a/crates/turbo-tasks-testing/Cargo.toml +++ b/crates/turbo-tasks-testing/Cargo.toml @@ -16,7 +16,7 @@ workspace = true anyhow = { workspace = true } auto-hash-map = { workspace = true } futures = { workspace = true } -lazy_static = { workspace = true } rustc-hash = { workspace = true } tokio = { workspace = true } turbo-tasks = { workspace = true } +turbo-tasks-memory = { workspace = true } diff --git a/crates/turbo-tasks-testing/src/lib.rs b/crates/turbo-tasks-testing/src/lib.rs index f61c04d673ab7..a3845d24b1e85 100644 --- a/crates/turbo-tasks-testing/src/lib.rs +++ b/crates/turbo-tasks-testing/src/lib.rs @@ -1,7 +1,7 @@ //! Testing utilities and macros for turbo-tasks and applications based on it. -mod macros; pub mod retry; +mod run; use std::{ borrow::Cow, @@ -24,6 +24,8 @@ use turbo_tasks::{ TurboTasksCallApi, }; +pub use crate::run::{run, Registration}; + enum Task { Spawned(Event), Finished(Result), diff --git a/crates/turbo-tasks-testing/src/macros.rs b/crates/turbo-tasks-testing/src/macros.rs deleted file mode 100644 index 5665e80b9c5eb..0000000000000 --- a/crates/turbo-tasks-testing/src/macros.rs +++ /dev/null @@ -1,26 +0,0 @@ -#[macro_export] -macro_rules! register { - () => { - lazy_static::lazy_static! { - static ref REGISTER: () = { - turbo_tasks::register(); - include!(concat!(env!("OUT_DIR"), "/register_test_", module_path!(), ".rs")); - }; - } - }; -} - -#[macro_export] -macro_rules! run { - ($($stmt:tt)+) => {{ - use turbo_tasks::TurboTasks; - use turbo_tasks_memory::MemoryBackend; - *REGISTER; - let tt = TurboTasks::new(MemoryBackend::default()); - tt.run_once(async { - $($stmt)+ - Ok(()) - }) - .await.unwrap(); - }}; -} diff --git a/crates/turbo-tasks-testing/src/run.rs b/crates/turbo-tasks-testing/src/run.rs new file mode 100644 index 0000000000000..7b101049af59b --- /dev/null +++ b/crates/turbo-tasks-testing/src/run.rs @@ -0,0 +1,52 @@ +use std::{future::Future, sync::OnceLock}; + +use turbo_tasks::{trace::TraceRawVcs, TurboTasks}; +use turbo_tasks_memory::MemoryBackend; + +pub struct Registration { + execution_lock: OnceLock<()>, + func: fn(), +} + +impl Registration { + #[doc(hidden)] + pub const fn new(func: fn()) -> Self { + Registration { + execution_lock: OnceLock::new(), + func, + } + } + + /// Called by [`run`]. You can call this manually if you're not using + /// [`run`] (e.g. because you're using a customized `turbo_tasks` + /// implementation or tokio runtime). + pub fn ensure_registered(&self) { + self.execution_lock.get_or_init(self.func); + } +} + +#[macro_export] +macro_rules! register { + ($($other_register_fns:expr),* $(,)?) => {{ + fn register_impl() { + $($other_register_fns();)* + turbo_tasks::register(); + include!(concat!( + env!("OUT_DIR"), + "/register_test_", + module_path!(), + ".rs", + )); + } + turbo_tasks_testing::Registration::new(register_impl) + }}; +} + +pub async fn run(registration: &Registration, fut: impl Future + Send + 'static) -> T +where + T: TraceRawVcs + Send + 'static, +{ + registration.ensure_registered(); + let tt = TurboTasks::new(MemoryBackend::default()); + tt.run_once(async move { Ok(fut.await) }).await.unwrap() +} diff --git a/crates/turbo-tasks/src/completion.rs b/crates/turbo-tasks/src/completion.rs index 865074b012192..cbd7501a7fab0 100644 --- a/crates/turbo-tasks/src/completion.rs +++ b/crates/turbo-tasks/src/completion.rs @@ -4,9 +4,12 @@ use crate::{self as turbo_tasks, RawVc, TryJoinIterExt, Vc}; /// to have a concrete reference that can be awaited. /// It will invalidate the awaiting task everytime the referenced /// task has been executed. -/// Note: PartialEq is not implement since it doesn't make sense to compare -/// Completion this way. You probably want to use [`ReadRef::ptr_eq`] instead. +/// +/// Note: [`PartialEq`] is not implemented since it doesn't make sense to +/// compare `Completion` this way. You probably want to use [`ReadRef::ptr_eq`] +/// instead. #[turbo_tasks::value(cell = "new", eq = "manual")] +#[derive(Debug)] pub struct Completion; #[turbo_tasks::value_impl] From 40a331fe0655db7ab714cc5d0f90c7f024f69345 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Thu, 25 Jul 2024 15:30:30 -0400 Subject: [PATCH 67/73] chore(turborepo): print the turbo version on start up (#8841) ### Description I realized that we don't ever print the version of turborepo that's running. This could be helpful for users and also for our testing. ### Testing Instructions --- crates/turborepo-lib/src/cli/mod.rs | 9 ++++++++- turborepo-tests/helpers/setup.sh | 1 + turborepo-tests/helpers/setup_integration_test.sh | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/turborepo-lib/src/cli/mod.rs b/crates/turborepo-lib/src/cli/mod.rs index e804c4ee09c7d..f02a04217390e 100644 --- a/crates/turborepo-lib/src/cli/mod.rs +++ b/crates/turborepo-lib/src/cli/mod.rs @@ -21,7 +21,7 @@ use turborepo_telemetry::{ }, init_telemetry, track_usage, TelemetryHandle, }; -use turborepo_ui::UI; +use turborepo_ui::{GREY, UI}; use crate::{ cli::error::print_potential_tasks, @@ -991,6 +991,13 @@ pub async fn run( } } + let should_print_version = env::var("TURBO_PRINT_VERSION_DISABLED") + .map_or(true, |disable| !matches!(disable.as_str(), "1" | "true")); + + if should_print_version { + eprintln!("{}\n", GREY.apply_to(format!("turbo {}", get_version()))); + } + // If there is no command, we set the command to `Command::Run` with // `self.parsed_args.run_args` as arguments. let mut command = if let Some(command) = mem::take(&mut cli_args.command) { diff --git a/turborepo-tests/helpers/setup.sh b/turborepo-tests/helpers/setup.sh index c8580cd5ac7cb..b732eb2744261 100755 --- a/turborepo-tests/helpers/setup.sh +++ b/turborepo-tests/helpers/setup.sh @@ -13,4 +13,5 @@ fi export TURBO_TELEMETRY_MESSAGE_DISABLED=1 export TURBO_GLOBAL_WARNING_DISABLED=1 export TURBO_DOWNLOAD_LOCAL_ENABLED=0 +export TURBO_PRINT_VERSION_DISABLED=1 TURBO=${MONOREPO_ROOT_DIR}/target/debug/turbo${EXT} diff --git a/turborepo-tests/helpers/setup_integration_test.sh b/turborepo-tests/helpers/setup_integration_test.sh index 84d682ebd525b..c7c6fd806bdda 100755 --- a/turborepo-tests/helpers/setup_integration_test.sh +++ b/turborepo-tests/helpers/setup_integration_test.sh @@ -37,6 +37,7 @@ fi export TURBO_TELEMETRY_MESSAGE_DISABLED=1 export TURBO_GLOBAL_WARNING_DISABLED=1 +export TURBO_PRINT_VERSION_DISABLED=1 export TURBO=${MONOREPO_ROOT_DIR}/target/debug/turbo${EXT} # Undo the set -eo pipefail at the top of this script From 2f9763bb1a0e653f8075ccde4c06af2cbb811b80 Mon Sep 17 00:00:00 2001 From: Nicholas Yang Date: Thu, 25 Jul 2024 15:54:15 -0400 Subject: [PATCH 68/73] chore(turborepo): add docs entry for `TURBO_PRINT_VERSION_DISABLED` var (#8842) --- docs/repo-docs/reference/system-environment-variables.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/repo-docs/reference/system-environment-variables.mdx b/docs/repo-docs/reference/system-environment-variables.mdx index d4d3b9717914b..2ebb267f09ba7 100644 --- a/docs/repo-docs/reference/system-environment-variables.mdx +++ b/docs/repo-docs/reference/system-environment-variables.mdx @@ -19,6 +19,7 @@ System environment variables are always overridden by flag values provided direc | `TURBO_DOWNLOAD_LOCAL_ENABLED` | Enables global `turbo` to install the correct local version if one is not found. | | `TURBO_FORCE` | Always force all tasks to run in full, opting out of all caching. | | `TURBO_GLOBAL_WARNING_DISABLED` | Disable warning when global `turbo` cannot find a local version to use. | +| `TURBO_PRINT_VERSION_DISABLED` | Disable printing the version of `turbo` that is being executed. | | `TURBO_LOG_ORDER` | Set the [log order](/repo/docs/reference/run#--log-order-option). Allowed values are `grouped` and `default`. | | `TURBO_LOGIN` | Set the URL used to log in to [Remote Cache](/repo/docs/core-concepts/remote-caching). | | `TURBO_NO_UPDATE_NOTIFIER` | Remove the update notifier that appears when a new version of `turbo` is available. You can also use `NO_UPDATE_NOTIFIER` per ecosystem convention. | From 242285838ea6fece9ac7c915a60547cf22ba5d13 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Thu, 25 Jul 2024 17:41:42 -0500 Subject: [PATCH 69/73] Update turbo-orchestrator.yml rules (#8844) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 😢 --- .github/turbo-orchestrator.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/turbo-orchestrator.yml b/.github/turbo-orchestrator.yml index fda47420cf68d..41a121d5082d9 100644 --- a/.github/turbo-orchestrator.yml +++ b/.github/turbo-orchestrator.yml @@ -44,12 +44,12 @@ labeler: isPRAuthorMatch: "^(arlyon|bgw|ForsakenHarmony|kdy1|LichuAcu|mischnic|padmaia|sokra|wbinnssmith)$" - label: "created-by: turborepo" when: - isPRAuthorMatch: "^(anthonyshew|dimitropoulos|tknickman|mehulkar|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" + isPRAuthorMatch: "^(anthonyshew|dimitropoulos|tknickman|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" # needs: triage when not any of the turbopack or turborepo team - label: "needs: triage" when: - isNotPRAuthorMatch: "^(arlyon|bgw|ForsakenHarmony|kdy1|LichuAcu|mischnic|padmaia|sokra|wbinnssmith|anthonyshew|dimitropoulos|tknickman|mehulkar|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" + isNotPRAuthorMatch: "^(arlyon|bgw|ForsakenHarmony|kdy1|LichuAcu|mischnic|padmaia|sokra|wbinnssmith|anthonyshew|dimitropoulos|tknickman|chris-olszewski|NicholasLYang|Zertsov|paulogdm|codybrouwers)$" # areas - label: "area: ci" From b356f7011ca1ea7915f626844a8f26919375d74f Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 26 Jul 2024 12:27:16 -0500 Subject: [PATCH 70/73] chore(auth): catch forbidden cache access error (#8853) ### Description Catch 403 HTTP requests and understand them as meaning this token doesn't have cache access. This will cause the token to be ignored and the login flow will continue. ### Testing Instructions Inspecting result of sending cache status request with bad token. Result is a `ReqwestError` with a 403 status code, not an `UnknownStatus`. --- crates/turborepo-auth/src/auth/login.rs | 4 +++- crates/turborepo-auth/src/lib.rs | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/turborepo-auth/src/auth/login.rs b/crates/turborepo-auth/src/auth/login.rs index 8ba766cdd6f10..dba7d7c1533c6 100644 --- a/crates/turborepo-auth/src/auth/login.rs +++ b/crates/turborepo-auth/src/auth/login.rs @@ -3,7 +3,7 @@ use std::sync::Arc; pub use error::Error; use reqwest::Url; use tokio::sync::OnceCell; -use tracing::warn; +use tracing::{debug, warn}; use turborepo_api_client::{CacheClient, Client, TokenClient}; use turborepo_ui::{start_spinner, BOLD, UI}; @@ -49,6 +49,7 @@ pub async fn login( // Check if passed in token exists first. if !force { if let Some(token) = existing_token { + debug!("found existing turbo token"); let token = Token::existing(token.into()); if token .is_valid( @@ -64,6 +65,7 @@ pub async fn login( // The extraction can return an error, but we don't want to fail the login if // the token is not found. if let Ok(Some(token)) = extract_vercel_token() { + debug!("found existing Vercel token"); let token = Token::existing(token); if token .is_valid( diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index 1959e68ce2d3c..9d0000476da5b 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -200,6 +200,12 @@ impl Token { turborepo_api_client::Error::UnknownStatus { code, .. } if code == "forbidden" => { Ok(false) } + // If the entire request fails with 403 also return false + turborepo_api_client::Error::ReqwestError(e) + if e.status() == Some(reqwest::StatusCode::FORBIDDEN) => + { + Ok(false) + } _ => Err(e.into()), }, } From 9cb7083dd1257b3cfcb0eb9884872285ca263e6c Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Fri, 26 Jul 2024 14:08:21 -0500 Subject: [PATCH 71/73] chore(telemetry): remove unused codepath field (#8855) The turbo version shuold be enough in telemetry now to know what people are using, since both paths aren't supported in very many versions. --- crates/turborepo-lib/src/cli/mod.rs | 1 - crates/turborepo-telemetry/src/events/command.rs | 13 ------------- 2 files changed, 14 deletions(-) diff --git a/crates/turborepo-lib/src/cli/mod.rs b/crates/turborepo-lib/src/cli/mod.rs index f02a04217390e..0db5d24d995d8 100644 --- a/crates/turborepo-lib/src/cli/mod.rs +++ b/crates/turborepo-lib/src/cli/mod.rs @@ -1257,7 +1257,6 @@ pub async fn run( } run_args.track(&event); - event.track_run_code_path(CodePath::Rust); let exit_code = run::run(base, event).await.inspect(|code| { if *code != 0 { error!("run failed: command exited ({code})"); diff --git a/crates/turborepo-telemetry/src/events/command.rs b/crates/turborepo-telemetry/src/events/command.rs index f010dbe22a8e8..6442bf72369d7 100644 --- a/crates/turborepo-telemetry/src/events/command.rs +++ b/crates/turborepo-telemetry/src/events/command.rs @@ -126,19 +126,6 @@ impl CommandEventBuilder { self } - // run - pub fn track_run_code_path(&self, path: CodePath) -> &Self { - self.track(Event { - key: "binary".to_string(), - value: match path { - CodePath::Go => "go".to_string(), - CodePath::Rust => "rust".to_string(), - }, - is_sensitive: EventType::NonSensitive, - }); - self - } - // login pub fn track_login_method(&self, method: LoginMethod) -> &Self { self.track(Event { From 234791a88d33bf139e8f9fc02f71161e88b8dd15 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 26 Jul 2024 14:36:46 -0500 Subject: [PATCH 72/73] chore(schema): update schema with dangerouslyDisablePackageManagerCheck (#8856) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Update schema with config added in https://github.com/vercel/turbo/pull/8738 ### Testing Instructions 👀 and `turbo check-types` --- packages/turbo-types/src/types/config.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/turbo-types/src/types/config.ts b/packages/turbo-types/src/types/config.ts index ef78331b76395..e908766a71d11 100644 --- a/packages/turbo-types/src/types/config.ts +++ b/packages/turbo-types/src/types/config.ts @@ -56,7 +56,11 @@ export interface WorkspaceSchema extends BaseSchema { export type LegacyWorkspaceSchema = WorkspaceSchema & LegacyBaseSchema; -export type WorkspaceSchemaV1 = Omit & BaseSchemaV1; +export type WorkspaceSchemaV1 = Omit< + WorkspaceSchema, + "tasks" | "dangerouslyDisablePackageManagerCheck" +> & + BaseSchemaV1; export interface RootSchema extends BaseSchema { /** @@ -127,6 +131,16 @@ export interface RootSchema extends BaseSchema { * @defaultValue `"stream"` */ ui?: UI; + + /** + * Disable check for `packageManager` in root `package.json` + * + * This is highly discouraged as it leaves `turbo` dependent on system + * configuration to infer the correct package manager. + * + * Some turbo features are disabled if this is set to true. + */ + dangerouslyDisablePackageManagerCheck?: boolean; } export type LegacyRootSchema = RootSchema & LegacyBaseSchema; From d86f0761441b17afbdc23d97fc12bd4b68ef7dda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 16:20:25 -0500 Subject: [PATCH 73/73] release(turborepo): 2.0.10-canary.2 (#8857) Co-authored-by: Turbobot --- packages/create-turbo/package.json | 2 +- packages/eslint-config-turbo/package.json | 2 +- packages/eslint-plugin-turbo/package.json | 2 +- packages/turbo-codemod/package.json | 2 +- packages/turbo-gen/package.json | 2 +- packages/turbo-ignore/package.json | 2 +- packages/turbo-types/package.json | 2 +- packages/turbo-workspaces/package.json | 2 +- packages/turbo/package.json | 14 +++++++------- version.txt | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/create-turbo/package.json b/packages/create-turbo/package.json index 639b22932ffb5..ccedbf3fcd74f 100644 --- a/packages/create-turbo/package.json +++ b/packages/create-turbo/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Create a new Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/eslint-config-turbo/package.json b/packages/eslint-config-turbo/package.json index 829b76018f1b4..3a90dee51c0f1 100644 --- a/packages/eslint-config-turbo/package.json +++ b/packages/eslint-config-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-turbo", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "ESLint config for Turborepo", "repository": { "type": "git", diff --git a/packages/eslint-plugin-turbo/package.json b/packages/eslint-plugin-turbo/package.json index 01f75dfc64f30..362470d69755b 100644 --- a/packages/eslint-plugin-turbo/package.json +++ b/packages/eslint-plugin-turbo/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-turbo", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "ESLint plugin for Turborepo", "keywords": [ "turbo", diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json index fa78555e506a5..0d93c26624aa6 100644 --- a/packages/turbo-codemod/package.json +++ b/packages/turbo-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/codemod", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-gen/package.json b/packages/turbo-gen/package.json index b618bd8ba849c..fa2a15850b866 100644 --- a/packages/turbo-gen/package.json +++ b/packages/turbo-gen/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/gen", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Extend a Turborepo", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-ignore/package.json b/packages/turbo-ignore/package.json index f081f93866863..e92b0bba7d189 100644 --- a/packages/turbo-ignore/package.json +++ b/packages/turbo-ignore/package.json @@ -1,6 +1,6 @@ { "name": "turbo-ignore", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "", "homepage": "https://turbo.build/repo", "keywords": [], diff --git a/packages/turbo-types/package.json b/packages/turbo-types/package.json index 3df1710497599..824e3502f4c59 100644 --- a/packages/turbo-types/package.json +++ b/packages/turbo-types/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/types", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Turborepo types", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo-workspaces/package.json b/packages/turbo-workspaces/package.json index d03370f420e5b..087c98e16c1ae 100644 --- a/packages/turbo-workspaces/package.json +++ b/packages/turbo-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@turbo/workspaces", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Tools for working with package managers", "homepage": "https://turbo.build/repo", "license": "MIT", diff --git a/packages/turbo/package.json b/packages/turbo/package.json index 430199edb296f..c12d9ec7ce88c 100644 --- a/packages/turbo/package.json +++ b/packages/turbo/package.json @@ -1,6 +1,6 @@ { "name": "turbo", - "version": "2.0.10-canary.1", + "version": "2.0.10-canary.2", "description": "Turborepo is a high-performance build system for JavaScript and TypeScript codebases.", "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", @@ -17,11 +17,11 @@ "bin" ], "optionalDependencies": { - "turbo-darwin-64": "2.0.10-canary.1", - "turbo-darwin-arm64": "2.0.10-canary.1", - "turbo-linux-64": "2.0.10-canary.1", - "turbo-linux-arm64": "2.0.10-canary.1", - "turbo-windows-64": "2.0.10-canary.1", - "turbo-windows-arm64": "2.0.10-canary.1" + "turbo-darwin-64": "2.0.10-canary.2", + "turbo-darwin-arm64": "2.0.10-canary.2", + "turbo-linux-64": "2.0.10-canary.2", + "turbo-linux-arm64": "2.0.10-canary.2", + "turbo-windows-64": "2.0.10-canary.2", + "turbo-windows-arm64": "2.0.10-canary.2" } } diff --git a/version.txt b/version.txt index 3d25e143b24ae..5ab33d855c601 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -2.0.10-canary.1 +2.0.10-canary.2 canary