Skip to content

Commit

Permalink
Merge 34aafc8 into 1bdeea1
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra authored Nov 27, 2023
2 parents 1bdeea1 + 34aafc8 commit eb330ba
Showing 46 changed files with 655 additions and 195 deletions.
26 changes: 18 additions & 8 deletions crates/node-file-trace/src/lib.rs
Original file line number Diff line number Diff line change
@@ -213,10 +213,15 @@ async fn add_glob_results(
for entry in result.results.values() {
if let DirectoryEntry::File(path) = entry {
let source = Vc::upcast(FileSource::new(*path));
list.push(asset_context.process(
source,
Value::new(turbopack_core::reference_type::ReferenceType::Undefined),
));
if let Some(module) = *asset_context
.process(
source,
Value::new(turbopack_core::reference_type::ReferenceType::Undefined),
)
.await?
{
list.push(module);
}
}
}
for result in result.inner.values() {
@@ -259,10 +264,15 @@ async fn input_to_modules(
for input in input {
if exact {
let source = Vc::upcast(FileSource::new(root.join(input)));
list.push(asset_context.process(
source,
Value::new(turbopack_core::reference_type::ReferenceType::Undefined),
));
if let Some(module) = *asset_context
.process(
source,
Value::new(turbopack_core::reference_type::ReferenceType::Undefined),
)
.await?
{
list.push(module);
}
} else {
let glob = Glob::new(input);
add_glob_results(asset_context, root.read_glob(glob, false), &mut list).await?;
2 changes: 2 additions & 0 deletions crates/turbopack-cli/src/contexts.rs
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ use turbo_tasks::{Value, Vc};
use turbo_tasks_fs::{FileSystem, FileSystemPath};
use turbopack::{
condition::ContextCondition,
ecmascript::TreeShakingMode,
module_options::{CustomEcmascriptTransformPlugins, JsxTransformOptions, ModuleOptionsContext},
resolve_options_context::ResolveOptionsContext,
ModuleAssetContext,
@@ -99,6 +100,7 @@ async fn get_client_module_options_context(
let module_options_context = ModuleOptionsContext {
preset_env_versions: Some(env),
execution_context: Some(execution_context),
tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly),
..Default::default()
};

13 changes: 9 additions & 4 deletions crates/turbopack-core/src/chunk/evaluate.rs
Original file line number Diff line number Diff line change
@@ -41,10 +41,15 @@ async fn to_evaluatable(
asset: Vc<Box<dyn Source>>,
asset_context: Vc<Box<dyn AssetContext>>,
) -> Result<Vc<Box<dyn EvaluatableAsset>>> {
let asset = asset_context.process(
asset,
Value::new(ReferenceType::Entry(EntryReferenceSubType::Runtime)),
);
let Some(asset) = *asset_context
.process(
asset,
Value::new(ReferenceType::Entry(EntryReferenceSubType::Runtime)),
)
.await?
else {
bail!("{} is not a valid entry", asset.ident().to_string().await?)
};
let Some(entry) = Vc::try_resolve_downcast::<Box<dyn EvaluatableAsset>>(asset).await? else {
bail!(
"{} is not a valid evaluated entry",
19 changes: 17 additions & 2 deletions crates/turbopack-core/src/context.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ use turbo_tasks_fs::FileSystemPath;

use crate::{
compile_time_info::CompileTimeInfo,
module::Module,
module::OptionModule,
reference_type::ReferenceType,
resolve::{options::ResolveOptions, parse::Request, ModuleResolveResult, ResolveResult},
source::Source,
@@ -14,29 +14,44 @@ use crate::{
/// type (e. g. from FileSource to ModuleAsset).
#[turbo_tasks::value_trait]
pub trait AssetContext {
/// Gets the compile time info of the asset context.
fn compile_time_info(self: Vc<Self>) -> Vc<CompileTimeInfo>;

/// Gets the layer of the asset context.
fn layer(self: Vc<Self>) -> Vc<String>;

/// Gets the resolve options for a given path.
fn resolve_options(
self: Vc<Self>,
origin_path: Vc<FileSystemPath>,
reference_type: Value<ReferenceType>,
) -> Vc<ResolveOptions>;

/// Resolves an request to an [ModuleResolveResult].
fn resolve_asset(
self: Vc<Self>,
origin_path: Vc<FileSystemPath>,
request: Vc<Request>,
resolve_options: Vc<ResolveOptions>,
reference_type: Value<ReferenceType>,
) -> Vc<ModuleResolveResult>;

/// Process a source into a module. This might return None, if this should
/// lead to no module at all, e. g. in cases where side effect free module
/// is imported for its side effects.
fn process(
self: Vc<Self>,
asset: Vc<Box<dyn Source>>,
reference_type: Value<ReferenceType>,
) -> Vc<Box<dyn Module>>;
) -> Vc<OptionModule>;

/// Process an [ResolveResult] into an [ModuleResolveResult].
fn process_resolve_result(
self: Vc<Self>,
result: Vc<ResolveResult>,
reference_type: Value<ReferenceType>,
) -> Vc<ModuleResolveResult>;

/// Gets a new AssetContext with the transition applied.
fn with_transition(self: Vc<Self>, transition: String) -> Vc<Box<dyn AssetContext>>;
}
2 changes: 2 additions & 0 deletions crates/turbopack-core/src/reference_type.rs
Original file line number Diff line number Diff line change
@@ -36,6 +36,8 @@ pub enum CommonJsReferenceSubType {
#[derive(Debug, Default, Clone, PartialOrd, Ord, Hash)]
pub enum EcmaScriptModulesReferenceSubType {
ImportPart(Vc<ModulePart>),
Import,
DynamicImport,
Custom(u8),
#[default]
Undefined,
12 changes: 7 additions & 5 deletions crates/turbopack-core/src/resolve/mod.rs
Original file line number Diff line number Diff line change
@@ -499,7 +499,7 @@ impl ResolveResult {
) -> Result<ModuleResolveResult>
where
A: Fn(Vc<Box<dyn Source>>) -> AF,
AF: Future<Output = Result<Vc<Box<dyn Module>>>>,
AF: Future<Output = Result<Option<Vc<Box<dyn Module>>>>>,
R: Fn(Vc<Box<dyn Source>>) -> RF,
RF: Future<Output = Result<Vc<Box<dyn ModuleReference>>>>,
{
@@ -512,9 +512,11 @@ impl ResolveResult {
let asset_fn = &source_fn;
async move {
Ok(match item {
ResolveResultItem::Source(source) => {
ModuleResolveResultItem::Module(Vc::upcast(asset_fn(source).await?))
}
ResolveResultItem::Source(source) => asset_fn(source)
.await?
.map_or(ModuleResolveResultItem::Ignore, |m| {
ModuleResolveResultItem::Module(Vc::upcast(m))
}),
ResolveResultItem::OriginalReferenceExternal => {
ModuleResolveResultItem::OriginalReferenceExternal
}
@@ -550,7 +552,7 @@ impl ResolveResult {
Ok(
self.await?
.map_module(
|asset| async move { Ok(Vc::upcast(RawModule::new(asset))) },
|asset| async move { Ok(Some(Vc::upcast(RawModule::new(asset)))) },
|source| async move {
Ok(Vc::upcast(AffectingResolvingAssetReference::new(source)))
},
16 changes: 10 additions & 6 deletions crates/turbopack-css/src/global_asset.rs
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ use turbopack_core::{
chunk::PassthroughModule,
context::AssetContext,
ident::AssetIdent,
module::Module,
module::{Module, OptionModule},
reference::ModuleReferences,
reference_type::{CssReferenceSubType, ReferenceType},
source::Source,
@@ -35,7 +35,7 @@ impl GlobalCssAsset {
#[turbo_tasks::value_impl]
impl GlobalCssAsset {
#[turbo_tasks::function]
async fn inner(self: Vc<Self>) -> Result<Vc<Box<dyn Module>>> {
async fn inner(self: Vc<Self>) -> Result<Vc<OptionModule>> {
let this = self.await?;
// The underlying CSS is processed through an internal CSS reference.
// This can then be picked up by other rules to treat CSS assets in
@@ -59,10 +59,14 @@ impl Module for GlobalCssAsset {
}

#[turbo_tasks::function]
fn references(self: Vc<Self>) -> Vc<ModuleReferences> {
Vc::cell(vec![Vc::upcast(InternalCssAssetReference::new(
self.inner(),
))])
async fn references(self: Vc<Self>) -> Result<Vc<ModuleReferences>> {
Ok(Vc::cell(
self.inner()
.await?
.map(|inner| Vc::upcast(InternalCssAssetReference::new(inner)))
.into_iter()
.collect(),
))
}
}

25 changes: 16 additions & 9 deletions crates/turbopack-css/src/module_asset.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::{fmt::Write, iter::once, sync::Arc};
use std::{fmt::Write, sync::Arc};

use anyhow::{bail, Context, Result};
use indexmap::IndexMap;
@@ -13,7 +13,7 @@ use turbopack_core::{
context::AssetContext,
ident::AssetIdent,
issue::{Issue, IssueExt, IssueSeverity, OptionStyledString, StyledString},
module::Module,
module::{Module, OptionModule},
reference::{ModuleReference, ModuleReferences},
reference_type::{CssReferenceSubType, ReferenceType},
resolve::{origin::ResolveOrigin, parse::Request},
@@ -76,7 +76,11 @@ impl Module for ModuleCssAsset {
// This affects the order in which the resulting CSS chunks will be loaded:
// later references are processed first in the post-order traversal of the
// reference tree, and as such they will be loaded first in the resulting HTML.
let references = once(Vc::upcast(InternalCssAssetReference::new(self.inner())))
let references = self
.inner()
.await?
.into_iter()
.map(|&inner| Vc::upcast(InternalCssAssetReference::new(inner)))
.chain(self.module_references().await?.iter().copied())
.collect();

@@ -139,7 +143,7 @@ struct ModuleCssClasses(IndexMap<String, Vec<ModuleCssClass>>);
#[turbo_tasks::value_impl]
impl ModuleCssAsset {
#[turbo_tasks::function]
async fn inner(self: Vc<Self>) -> Result<Vc<Box<dyn Module>>> {
async fn inner(self: Vc<Self>) -> Result<Vc<OptionModule>> {
let this = self.await?;
Ok(this.asset_context.process(
this.source,
@@ -149,11 +153,14 @@ impl ModuleCssAsset {

#[turbo_tasks::function]
async fn classes(self: Vc<Self>) -> Result<Vc<ModuleCssClasses>> {
let inner = self.inner();

let Some(inner) = Vc::try_resolve_sidecast::<Box<dyn ProcessCss>>(inner).await? else {
bail!("inner asset should be CSS processable");
};
let inner = self
.inner()
.await?
.context("inner asset should be CSS processable")?;

let inner = Vc::try_resolve_sidecast::<Box<dyn ProcessCss>>(inner)
.await?
.context("inner asset should be CSS processable")?;

let result = inner.get_css_with_placeholder().await?;
let mut classes = IndexMap::default();
2 changes: 2 additions & 0 deletions crates/turbopack-ecmascript-runtime/src/asset_context.rs
Original file line number Diff line number Diff line change
@@ -6,11 +6,13 @@ use turbopack::{
use turbopack_core::{
compile_time_info::CompileTimeInfo, context::AssetContext, environment::Environment,
};
use turbopack_ecmascript::TreeShakingMode;

/// Returns the runtime asset context to use to process runtime code assets.
pub fn get_runtime_asset_context(environment: Vc<Environment>) -> Vc<Box<dyn AssetContext>> {
let module_options_context = ModuleOptionsContext {
enable_typescript_transform: Some(TypescriptTransformOptions::default().cell()),
tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly),
..Default::default()
}
.cell();
29 changes: 24 additions & 5 deletions crates/turbopack-ecmascript/src/lib.rs
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@ use parse::{parse, ParseResult};
use path_visitor::ApplyVisitors;
use references::esm::UrlRewriteBehavior;
pub use references::{AnalyzeEcmascriptModuleResult, TURBOPACK_HELPER};
use serde::{Deserialize, Serialize};
pub use static_code::StaticEcmascriptCode;
use swc_core::{
common::GLOBALS,
@@ -84,14 +85,32 @@ pub enum SpecifiedModuleType {
EcmaScript,
}

#[derive(
PartialOrd,
Ord,
PartialEq,
Eq,
Hash,
Debug,
Clone,
Copy,
Default,
Serialize,
Deserialize,
TraceRawVcs,
)]
#[serde(rename_all = "kebab-case")]
pub enum TreeShakingMode {
#[default]
ModuleFragments,
ReexportsOnly,
}

#[turbo_tasks::value(serialization = "auto_for_input")]
#[derive(PartialOrd, Ord, Hash, Debug, Default, Copy, Clone)]
pub struct EcmascriptOptions {
/// module is split into smaller module parts which can be selectively
/// imported
pub split_into_parts: bool,
/// imports will import parts of modules
pub import_parts: bool,
/// variant of tree shaking to use
pub tree_shaking_mode: Option<TreeShakingMode>,
/// module is forced to a specific type (happens e. g. for .cjs and .mjs)
pub specified_module_type: SpecifiedModuleType,
/// Determines how to treat `new URL(...)` rewrites.
2 changes: 1 addition & 1 deletion crates/turbopack-ecmascript/src/references/esm/base.rs
Original file line number Diff line number Diff line change
@@ -160,7 +160,7 @@ impl ModuleReference for EsmAssetReference {
async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
let ty = Value::new(match &self.export_name {
Some(part) => EcmaScriptModulesReferenceSubType::ImportPart(*part),
None => EcmaScriptModulesReferenceSubType::Undefined,
None => EcmaScriptModulesReferenceSubType::Import,
});

Ok(esm_resolve(
2 changes: 1 addition & 1 deletion crates/turbopack-ecmascript/src/references/esm/dynamic.rs
Original file line number Diff line number Diff line change
@@ -102,7 +102,7 @@ impl CodeGenerateable for EsmAsyncAssetReference {
esm_resolve(
self.origin,
self.request,
Value::new(EcmaScriptModulesReferenceSubType::Undefined),
Value::new(EcmaScriptModulesReferenceSubType::DynamicImport),
try_to_severity(self.in_try),
Some(self.issue_source),
),
Loading

0 comments on commit eb330ba

Please sign in to comment.