Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: config codes organization #1618

Merged
merged 3 commits into from
Sep 27, 2024
Merged

refactor: config codes organization #1618

merged 3 commits into from
Sep 27, 2024

Conversation

xusd320
Copy link
Contributor

@xusd320 xusd320 commented Sep 27, 2024

Declare different config in individual mods.

Summary by CodeRabbit

  • 新特性

    • 引入了多个新的配置模块,增强了配置管理功能,包括开发服务器、代码分割、实验性功能等。
    • 新增了配置文件 mako.config.default.json,定义了构建工具的配置架构。
    • 改进了配置结构,增加了新的配置字段和验证功能。
  • 错误修复

    • 改进了配置解析的错误处理,增加了详细的诊断信息。
  • 文档

    • 扩展了测试套件以覆盖新配置和验证场景。

Copy link
Contributor

coderabbitai bot commented Sep 27, 2024

Walkthrough

此次更改对 config.rs 文件进行了重构,增加了多个与配置管理相关的模块和结构体。新引入的结构体和枚举涵盖了开发服务器、代码拆分、优化等多个方面,增强了配置的灵活性和可扩展性。同时,错误处理得到了改进,引入了自定义错误类型,以提供更详细的配置解析错误信息。测试套件也进行了扩展,以确保新配置和验证功能的正常工作。

Changes

文件路径 更改摘要
crates/mako/src/config.rs 重构并扩展了 Config 结构体,增加了多个新字段和模块,改进了配置文件的验证和解析。
crates/mako/src/config/analyze.rs 新增 AnalyzeConfig 结构体,支持序列化和反序列化。
crates/mako/src/config/code_splitting.rs 定义了代码拆分策略的结构体和枚举,支持多种优化选项。
crates/mako/src/config/dev_server.rs 定义了开发服务器配置的 DevServerConfig 结构体,包含主机和端口字段。
crates/mako/src/config/devtool.rs 定义了源映射生成的配置枚举 DevtoolConfig
crates/mako/src/config/duplicate_package_checker.rs 新增 DuplicatePackageCheckerConfig 结构体,包含多个布尔字段。
crates/mako/src/config/experimental.rs 新增 ExperimentalConfigDetectCircularDependence 结构体。
crates/mako/src/config/external.rs 定义了 ExternalConfig 枚举及其相关结构体,用于管理外部模块的配置。
crates/mako/src/config/generic_usize.rs 新增 GenericUsizeDefault 结构体,支持常量泛型。
crates/mako/src/config/hmr.rs 定义了 HmrConfig 结构体,支持热模块替换配置。
crates/mako/src/config/inline_css.rs 新增 InlineCssConfig 结构体,支持内联 CSS 配置。
crates/mako/src/config/macros.rs 新增宏 create_deserialize_fn,用于生成反序列化函数。
crates/mako/src/config/mako.config.default.json 新增默认配置文件,定义了构建工具的配置架构。
crates/mako/src/config/manifest.rs 定义了 ManifestConfig 结构体,用于解析配置数据。
crates/mako/src/config/minifish.rs 定义了 MinifishConfigInjectItem 结构体,支持映射和注入配置。
crates/mako/src/config/mode.rs 新增 Mode 枚举,定义开发和生产模式。
crates/mako/src/config/module_id_strategy.rs 新增 ModuleIdStrategy 枚举,定义模块 ID 策略。
crates/mako/src/config/optimization.rs 定义了 OptimizationConfig 结构体,支持优化配置。
crates/mako/src/config/output.rs 定义了 OutputConfig 结构体,管理输出设置。
crates/mako/src/config/progress.rs 定义了 ProgressConfig 结构体,支持进度配置。
crates/mako/src/config/provider.rs 新增类型别名 Providers,用于表示提供者配置。
crates/mako/src/config/px2rem.rs 定义了 Px2RemConfig 结构体,支持 CSS 像素转 rem 配置。
crates/mako/src/config/react.rs 定义了 ReactConfig 结构体和 ReactRuntimeConfig 枚举,支持 React 配置。
crates/mako/src/config/resolve.rs 定义了 ResolveConfig 结构体,支持模块解析配置。
crates/mako/src/config/rsc_client.rs 定义了 RscClientConfig 结构体,包含日志服务器组件配置。
crates/mako/src/config/rsc_server.rs 定义了 RscServerConfig 结构体,支持远程服务器配置。
crates/mako/src/config/stats.rs 定义了 StatsConfig 结构体,支持统计配置。
crates/mako/src/config/transform_import.rs 定义了 TransformImportStyle 枚举和 TransformImportConfig 结构体,支持导入转换配置。
crates/mako/src/config/tree_shaking.rs 定义了 TreeShakingStrategy 枚举,支持树摇策略配置。
crates/mako/src/config/umd.rs 新增类型别名 Umd,支持 UMD 配置。
crates/mako/src/config/watch.rs 定义了 WatchConfig 结构体,支持监视配置。
crates/mako/src/generate/chunk_pot/util.rs 修改了导入语句,改善了代码组织。
crates/mako/src/utils.rs 新增 get_pkg_name 函数,支持从路径获取包名称。

Possibly related PRs

Suggested reviewers

  • sorrycc
  • stormslowly

🐇 在草地上跳跃,欢快无比,
新配置如花,绽放光辉。
模块齐全,功能多多,
兔子欢呼,乐在其中。
让我们一起,享受这变化,
编程的乐趣,永不止步! 🌼


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

codecov bot commented Sep 27, 2024

Codecov Report

Attention: Patch coverage is 58.13008% with 206 lines in your changes missing coverage. Please review.

Project coverage is 61.96%. Comparing base (9a4c4d8) to head (89d2abd).
Report is 2 commits behind head on master.

Files with missing lines Patch % Lines
crates/mako/src/config/code_splitting.rs 0.00% 62 Missing ⚠️
crates/mako/src/config.rs 78.22% 54 Missing ⚠️
crates/mako/src/config/external.rs 8.33% 22 Missing ⚠️
crates/mako/src/config/px2rem.rs 34.61% 17 Missing ⚠️
crates/mako/src/config/minifish.rs 0.00% 9 Missing ⚠️
crates/mako/src/config/output.rs 64.00% 9 Missing ⚠️
crates/mako/src/config/transform_import.rs 0.00% 7 Missing ⚠️
crates/mako/src/config/rsc_client.rs 0.00% 6 Missing ⚠️
crates/mako/src/config/macros.rs 68.75% 5 Missing ⚠️
...rates/mako/src/config/duplicate_package_checker.rs 42.85% 4 Missing ⚠️
... and 6 more
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1618      +/-   ##
==========================================
+ Coverage   61.95%   61.96%   +0.01%     
==========================================
  Files         128      154      +26     
  Lines       15415    15412       -3     
==========================================
  Hits         9550     9550              
+ Misses       5865     5862       -3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (53)
crates/mako/src/config/analyze.rs (1)

3-4: AnalyzeConfig 结构体定义良好,但可以考虑添加文档注释。

AnalyzeConfig 结构体的定义使用了适当的派生宏,这是很好的做法。它被标记为公共的,允许从其他模块使用,这增加了灵活性。

建议:

  1. 考虑为结构体添加文档注释(///),解释其用途和潜在的使用场景。
  2. 如果这是一个占位符结构体,可以在注释中说明未来可能添加的配置选项。

示例改进:

/// 用于分析配置的结构体。
/// 
/// 目前为空,但未来可能包含如下字段:
/// - `enabled: bool` - 是否启用分析
/// - `level: AnalysisLevel` - 分析级别
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct AnalyzeConfig {}
crates/mako/src/config/umd.rs (2)

5-5: 建议为类型别名添加注释。

类型别名 Umd 的定义很简单,但建议添加一个简短的注释来解释为什么使用这个别名,以及它在项目中的用途。这将有助于其他开发者更好地理解代码。

建议添加类似以下的注释:

/// Umd 表示 UMD(Universal Module Definition)配置的字符串表示。
pub type Umd = String;

7-7: 建议为宏调用添加注释。

create_deserialize_fn! 宏的使用看起来是正确的,但建议添加一个简短的注释来解释这个宏的作用。这将有助于其他开发者更好地理解代码,特别是对于不熟悉这个宏的人来说。

建议添加类似以下的注释:

// 创建 Umd 类型的反序列化函数
create_deserialize_fn!(deserialize_umd, Umd);
crates/mako/src/config/resolve.rs (1)

5-6: 字段定义合理,但建议添加文档注释。

ResolveConfig 结构的字段定义看起来合理:

  1. alias 字段使用 Vec<(String, String)> 类型,适合表示键值对的别名映射。
  2. extensions 字段使用 Vec<String> 类型,适合存储多个文件扩展名。
  3. 两个字段都是公开的,允许直接访问,这对于配置结构来说是合适的。

建议为这两个字段添加文档注释,解释它们的具体用途和预期的数据格式。例如:

/// 别名映射,每个元素是一个 (键, 值) 对
pub alias: Vec<(String, String)>,
/// 要考虑的文件扩展名列表
pub extensions: Vec<String>,

这将有助于其他开发者更好地理解和使用这个配置结构。

crates/mako/src/config/inline_css.rs (1)

5-6: 结构体定义正确,但可以考虑添加 TODO 注释。

InlineCssConfig 结构体的定义是正确的,包括其公共可见性和派生的特性。然而,结构体目前是空的。

建议添加一个 TODO 注释,说明未来需要实现的配置选项。例如:

#[derive(Deserialize, Serialize, Debug)]
pub struct InlineCssConfig {
    // TODO: 添加内联 CSS 的配置选项
}
crates/mako/src/config/provider.rs (2)

3-6: 建议增加对类型别名用途的简要说明。

当前的注释清晰地解释了 Providers 类型的格式并提供了有用的示例。然而,添加一个简短的说明来解释这个类型别名的目的和在项目中的作用将会使代码更加易于理解。

建议在注释开头添加类似以下的说明:

// Providers 定义了一个映射,用于配置不同的提供者及其导入信息。
// 这有助于动态管理和加载各种模块或功能。

7-7: 类型别名定义正确,但可以考虑提高类型安全性。

Providers 类型别名的定义与注释中的描述相符,并且正确地声明为公共类型。这允许它在其他模块中使用,这可能是预期的行为。

然而,对于 identifierimport_sourcespecifier,全部使用 String 类型提供了灵活性,但可能不是最具类型安全的方法。

考虑使用更具体的类型来增强类型安全性。例如,可以为 identifierimport_source 创建新的类型:

pub struct Identifier(String);
pub struct ImportSource(String);
pub type Providers = HashMap<Identifier, (ImportSource, String)>;

这样可以在编译时捕获更多潜在的错误,并提高代码的可读性。

crates/mako/src/config/hrm.rs (2)

5-7: HmrConfig 结构体定义良好,但可以添加注释。

结构体的定义使用了适当的派生宏,camelCase 的重命名也与 JavaScript/TypeScript 的命名约定一致。然而,当前结构体是空的。

建议添加一个注释来解释这个空结构体的目的,例如:

/// HmrConfig 结构体用于配置热模块替换(HMR)。
/// 目前为空,将来可能会添加特定的 HMR 配置选项。
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct HmrConfig {}

9-9: 反序列化函数的创建看起来不错,但可以添加注释。

使用 create_deserialize_fn 宏来创建 deserialize_hmr 函数是一个好方法,它可以减少样板代码并保持项目的一致性。

建议在宏调用之前添加一个注释,解释生成的函数的用途,例如:

/// 创建 `deserialize_hmr` 函数,用于将 JSON 配置反序列化为 HmrConfig 实例。
create_deserialize_fn!(deserialize_hmr, HmrConfig);
crates/mako/src/config/stats.rs (1)

5-8: 建议为 modules 字段添加文档注释。

StatsConfig 结构体的定义看起来不错,派生的特性也很合适。然而,modules 字段的具体用途不是很明确。建议添加文档注释来解释这个字段的作用,例如:

pub struct StatsConfig {
    /// 是否包含模块统计信息
    pub modules: bool,
}

这将有助于其他开发者更好地理解和使用这个配置。

crates/mako/src/config/module_id_strategy.rs (1)

3-3: 派生宏和重命名使用得当,建议添加文档注释

派生的特性(Deserialize, Serialize, Clone, Copy, Debug)非常适合这个枚举的用途。为序列化重命名变体也是一个很好的做法,有助于保持 API 的一致性。

建议为枚举添加文档注释,解释每个策略的用途和影响。这将有助于其他开发者更好地理解和使用这个枚举。例如:

/// 定义模块 ID 的生成策略。
///
/// - `Hashed`: 使用哈希值作为模块 ID。
/// - `Named`: 使用模块名称作为 ID。
/// - `Numeric`: 使用数字作为模块 ID。
#[derive(Deserialize, Serialize, Clone, Copy, Debug)]
pub enum ModuleIdStrategy {
    // ... 保持现有的枚举定义不变
}

Also applies to: 5-10

crates/mako/src/config/watch.rs (2)

6-6: ignore_paths 字段定义合理。

将字段设为公共且可选是个好选择,允许灵活配置。使用 Option<Vec<String>> 类型适合表示可选的路径列表。

建议:考虑添加文档注释,说明此字段的用途和预期格式,例如是否支持通配符或正则表达式。这将提高代码的可维护性。


1-9: 总体评审总结

WatchConfig 结构体的实现总体上是良好的,使用了适当的 Rust 特性和 serde 功能。主要的改进建议如下:

  1. 为结构体和字段添加文档注释,解释它们的用途和预期用法。
  2. 澄清 node_modules_regexes 字段的命名约定,特别是序列化时使用下划线前缀的原因。
  3. 考虑统一 Rust 代码和序列化后的命名风格,以提高一致性。

这些改进将增强代码的可读性和可维护性,有助于其他开发者更好地理解和使用这个配置结构。

crates/mako/src/config/dev_server.rs (1)

5-10: 结构定义看起来不错,但可以考虑添加默认实现。

DevServerConfig 结构体的定义很好,使用了适当的字段类型和 serde 属性。然而,为了提高使用便利性,您可以考虑添加一个默认实现。

考虑添加以下默认实现:

impl Default for DevServerConfig {
    fn default() -> Self {
        Self {
            host: "localhost".to_string(),
            port: 8080,
        }
    }
}

这将为没有明确指定配置的用户提供合理的默认值。

crates/mako/src/config/progress.rs (2)

5-9: ProgressConfig 结构体定义良好

结构体的定义使用了适当的派生宏,包括 Deserialize、Serialize、Clone 和 Debug,这涵盖了常见的需求。serde 属性的使用也很正确,包括重命名和默认值的设置。

考虑将 progress_chars 字段设为私有,并提供一个公共的 getter 方法,以增强封装性。例如:

pub struct ProgressConfig {
    #[serde(rename = "progressChars", default)]
    progress_chars: String,
}

impl ProgressConfig {
    pub fn progress_chars(&self) -> &str {
        &self.progress_chars
    }
}

这样可以在未来更容易地控制对该字段的访问和修改。


11-11: 自定义宏的使用看起来不错

create_deserialize_fn! 宏的使用似乎是为 ProgressConfig 创建一个反序列化函数。这种方法可以减少样板代码,提高代码的可维护性。

建议在此行上方添加一个简短的注释,解释这个宏的目的和它创建的函数的用途。例如:

// 创建 `deserialize_progress` 函数,用于从配置中反序列化 ProgressConfig
create_deserialize_fn!(deserialize_progress, ProgressConfig);

这将有助于其他开发者更快地理解代码的意图。

crates/mako/src/config/tree_shaking.rs (1)

5-11: 枚举定义看起来不错,但可以添加一些文档。

TreeShakingStrategy 枚举的定义清晰且遵循了 Rust 的最佳实践。使用派生宏和 serde 属性也很恰当。

建议为枚举及其变体添加文档注释,以提高代码的可读性和可维护性。例如:

/// 定义树摇策略的枚举
#[derive(Deserialize, Serialize, Clone, Copy, Debug)]
pub enum TreeShakingStrategy {
    /// 基本树摇策略
    #[serde(rename = "basic")]
    Basic,
    /// 高级树摇策略
    #[serde(rename = "advanced")]
    Advanced,
}
crates/mako/src/config/optimization.rs (1)

5-10: 结构体定义看起来不错,但可以考虑添加文档注释

结构体的设计很好,使用了 Option<bool> 类型允许设置为明确的值或保持未指定状态。camelCase 的重命名与 JavaScript/TypeScript 的命名约定一致,这对于 Web 相关项目来说是合适的。

建议为结构体和每个字段添加文档注释,以解释它们的用途和可能的值。例如:

/// 优化配置选项
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct OptimizationConfig {
    /// 是否跳过模块优化
    pub skip_modules: Option<bool>,
    /// 是否连接模块
    pub concatenate_modules: Option<bool>,
}

这将提高代码的可读性和可维护性。

crates/mako/src/config/rsc_server.rs (1)

5-11: 结构定义看起来不错,但可以添加一些文档。

RscServerConfig 结构的定义是正确的,使用了适当的 derive 宏和 serde 属性。字段名称和类型看起来也很合适。然而,为了提高可维护性,建议为结构体和每个字段添加文档注释。

建议添加文档注释,例如:

/// Configuration for the RSC (React Server Components) server.
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RscServerConfig {
    /// Template for client components.
    pub client_component_tpl: String,
    /// Whether to emit CSS.
    #[serde(rename = "emitCSS")]
    pub emit_css: bool,
}
crates/mako/src/config/generic_usize.rs (3)

1-1: 结构定义看起来不错,但建议添加文档注释。

结构 GenericUsizeDefault 的定义正确使用了 Rust 的常量泛型特性。这是一个很好的设计选择,允许在编译时指定 usize 值。

建议为该结构添加文档注释,解释其用途和使用方法。例如:

/// 表示一个在编译时指定的 `usize` 值。
///
/// # 示例
///
/// ```
/// use your_crate::GenericUsizeDefault;
///
/// let value = GenericUsizeDefault::<100>::value();
/// assert_eq!(value, 100);
/// ```
pub struct GenericUsizeDefault<const U: usize>;

3-7: 实现看起来很好,但可以考虑使用 const fn

value() 方法的实现简洁明了,直接返回泛型参数 U。这是一个很好的设计,允许在运行时获取编译时指定的值。

考虑将 value() 方法声明为 const fn,这样可以在编译时求值,potentially 提高性能:

impl<const U: usize> GenericUsizeDefault<U> {
    pub const fn value() -> usize {
        U
    }
}

这个改变允许在常量上下文中使用 value() 方法,可能会带来一些性能优势。


9-17: 测试看起来不错,但可以考虑添加更多测试用例。

现有的测试正确验证了 GenericUsizeDefault 的行为,这很好。然而,只测试了一个值(100)可能不够全面。

建议添加更多测试用例,以确保在不同情况下的正确性。例如:

#[cfg(test)]
mod tests {
    use crate::config::GenericUsizeDefault;

    #[test]
    fn test_generic_usize_default() {
        assert_eq!(GenericUsizeDefault::<100>::value(), 100usize);
        assert_eq!(GenericUsizeDefault::<0>::value(), 0usize);
        assert_eq!(GenericUsizeDefault::<usize::MAX>::value(), usize::MAX);
    }
}

这些额外的测试用例可以验证边界条件(如 0 和 usize::MAX),增加测试的全面性。

crates/mako/src/config/devtool.rs (1)

1-13: 代码结构清晰,使用恰当

这段代码定义了 DevtoolConfig 枚举,用于配置源映射生成。代码结构良好,使用 serde 进行序列化和反序列化是合适的。枚举变体的注释提供了有用的说明。

建议:考虑为 DevtoolConfig 枚举添加一个默认值,以简化配置过程。

您可以通过添加 #[serde(default = "default_devtool_config")] 属性并实现相应的默认函数来实现这一点。例如:

impl Default for DevtoolConfig {
    fn default() -> Self {
        DevtoolConfig::SourceMap
    }
}

fn default_devtool_config() -> DevtoolConfig {
    DevtoolConfig::default()
}

#[derive(Deserialize, Serialize, Debug)]
#[serde(default = "default_devtool_config")]
pub enum DevtoolConfig {
    // ... 保持现有的枚举定义不变
}

这样可以在未指定配置时提供一个默认值。

crates/mako/src/config/transform_import.rs (1)

10-16: 结构体 TransformImportConfig 的实现很好,但可以考虑添加文档注释。

这个结构体的设计很好:

  1. 使用 #[serde(rename_all = "camelCase")] 确保字段名在序列化时使用驼峰命名法,这是许多配置文件格式的常见约定。
  2. library_name 字段是必需的,而 library_directorystyle 是可选的,这提供了配置的灵活性。
  3. 派生的特征(Deserialize, Serialize, Clone, 和 Debug)对于配置结构来说是合适的。

建议为结构体和每个字段添加文档注释,以提高代码的可读性和可维护性。例如:

/// 配置导入转换的结构体
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct TransformImportConfig {
    /// 库的名称
    pub library_name: String,
    /// 库的目录(可选)
    pub library_directory: Option<String>,
    /// 导入样式(可选)
    pub style: Option<TransformImportStyle>,
}
crates/mako/src/config/mode.rs (2)

4-10: Mode 枚举定义良好,但可以考虑添加文档注释

Mode 枚举的定义很好:

  • 正确地派生了必要的特征
  • 使用了 serde 重命名属性以确保正确的序列化/反序列化
  • 将枚举标记为 pub,使其可以从其他模块访问

建议为 Mode 枚举及其变体添加文档注释,以提高代码的可读性和可维护性。例如:

/// Represents the operation mode of the application.
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, ValueEnum, Clone)]
pub enum Mode {
    /// Development mode, typically used for debugging and testing.
    #[serde(rename = "development")]
    Development,
    /// Production mode, optimized for performance and stability.
    #[serde(rename = "production")]
    Production,
}

12-16: Display 特征实现简洁,但可以改进错误处理

Mode 枚举的 Display 特征实现很好:

  • 利用了 ValueEnum 特征提供的方法
  • 提供了枚举变体的字符串表示

建议改进错误处理,以避免在 to_possible_value() 返回 None 时可能发生的 panic。例如:

impl std::fmt::Display for Mode {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self.to_possible_value() {
            Some(v) => write!(f, "{}", v.get_name()),
            None => write!(f, "Unknown"),
        }
    }
}

这样可以在意外情况下优雅地处理错误,而不是导致程序崩溃。

crates/mako/src/config/manifest.rs (2)

5-14: ManifestConfig 结构体定义看起来不错,但可以考虑添加文档注释。

结构体的定义和字段的 serde 属性使用得当。为了提高代码的可读性和可维护性,建议为结构体和每个字段添加文档注释(doc comments)。

例如:

/// 配置清单的配置选项
#[derive(Deserialize, Serialize, Debug)]
pub struct ManifestConfig {
    /// 清单文件的文件名
    #[serde(
        rename(deserialize = "fileName"),
        default = "plugins::manifest::default_manifest_file_name"
    )]
    pub file_name: String,
    /// 清单文件的基础路径
    #[serde(rename(deserialize = "basePath"), default)]
    pub base_path: String,
}

这样可以更好地解释每个字段的用途和含义。


16-16: 宏的使用看起来很好,但可以考虑添加错误处理。

使用 create_deserialize_fn! 宏来创建反序列化函数是一个很好的做法,可以减少样板代码。然而,建议考虑在反序列化过程中添加错误处理逻辑。

例如,您可以修改宏或创建一个包装函数来处理可能出现的错误:

pub fn deserialize_manifest_with_validation(input: &str) -> Result<ManifestConfig, ConfigError> {
    let config = deserialize_manifest(input)?;
    // 在这里添加额外的验证逻辑
    Ok(config)
}

这样可以在配置解析失败时提供更详细的错误信息,有助于调试和错误处理。

crates/mako/src/config/duplicate_package_checker.rs (1)

15-18: 宏的使用看起来没问题,但建议添加注释。

create_deserialize_fn! 宏的使用看起来是为 DuplicatePackageCheckerConfig 创建一个名为 deserialize_check_duplicate_package 的反序列化函数。这种方法可能在项目中被广泛使用。

建议在宏调用之前添加一个简短的注释,解释这个宏的作用和生成的函数的用途。这将有助于其他开发者更快地理解代码。例如:

// 创建用于反序列化 DuplicatePackageCheckerConfig 的函数
create_deserialize_fn!(
    deserialize_check_duplicate_package,
    DuplicatePackageCheckerConfig
);
crates/mako/src/config/react.rs (2)

1-11: 结构实现良好,建议小幅改进

ReactConfig 结构的实现看起来不错。使用 Serde 进行序列化和反序列化是一个很好的选择。字段的命名和重命名符合 React 配置的预期。

不过,我建议为 ReactConfig 结构添加默认值实现。这样可以简化配置的创建,特别是当用户只需要修改部分设置时。

考虑添加 Default trait 的实现,例如:

impl Default for ReactConfig {
    fn default() -> Self {
        Self {
            pragma: "React".to_string(),
            import_source: "react".to_string(),
            runtime: ReactRuntimeConfig::Automatic,
            pragma_frag: "Fragment".to_string(),
        }
    }
}

这将允许用户使用 ReactConfig::default() 创建一个带有合理默认值的配置实例。


13-19: 枚举实现良好,建议增强错误处理

ReactRuntimeConfig 枚举的实现很好地捕捉了 React 运行时配置的两个可能选项。使用 #[serde(rename = "...")] 确保了正确的序列化,与 React 的预期值匹配。

为了增强错误处理和用户体验,我建议实现 TryFrom<String> trait。这将允许从字符串安全地转换到 ReactRuntimeConfig,同时处理无效输入。

考虑添加以下实现:

use std::convert::TryFrom;

impl TryFrom<String> for ReactRuntimeConfig {
    type Error = String;

    fn try_from(value: String) -> Result<Self, Self::Error> {
        match value.to_lowercase().as_str() {
            "automatic" => Ok(ReactRuntimeConfig::Automatic),
            "classic" => Ok(ReactRuntimeConfig::Classic),
            _ => Err(format!("Invalid React runtime config: {}", value)),
        }
    }
}

这将使得从配置文件或命令行参数解析 ReactRuntimeConfig 变得更加健壮和用户友好。

crates/mako/src/config/rsc_client.rs (3)

6-10: 结构定义良好,但缺少文档

RscClientConfig 结构体定义得当,使用了适当的 serde 属性。然而,建议为结构体和字段添加文档注释,以解释它们的用途和可能的值。

建议添加文档注释,例如:

/// 远程服务器客户端的配置
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RscClientConfig {
    /// 服务器组件的日志级别
    pub log_server_component: LogServerComponent,
}

12-18: 枚举定义完善,但需要文档

LogServerComponent 枚举的定义很好,包含了适当的派生属性和 serde 重命名。然而,建议添加文档注释来解释枚举的用途和每个变体的含义。

建议添加文档注释,例如:

/// 服务器组件的日志级别
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, ValueEnum, Clone)]
pub enum LogServerComponent {
    /// 仅记录错误
    #[serde(rename = "error")]
    Error,
    /// 忽略所有日志
    #[serde(rename = "ignore")]
    Ignore,
}

20-20: 宏使用得当,但可以添加注释

使用 create_deserialize_fn! 宏来创建 RscClientConfig 的反序列化函数是个好方法,可以减少样板代码并保持一致性。然而,为了提高可读性,建议添加一个简短的注释。

建议添加一个简短的注释,例如:

// 创建 RscClientConfig 的反序列化函数
create_deserialize_fn!(deserialize_rsc_client, RscClientConfig);
crates/mako/src/config/experimental.rs (2)

5-12: 结构定义看起来不错,建议添加文档注释。

ExperimentalConfig 结构体的定义看起来很好。使用 #[serde(rename_all = "camelCase")] 属性确保了与 JavaScript/TypeScript 命名约定的一致性,这对于跨语言互操作性很有帮助。

为了提高代码的可维护性,建议为结构体及其字段添加文档注释,解释每个字段的用途和可能的值。

建议添加类似以下的文档注释:

/// 实验性配置选项
///
/// 这个结构体包含了一些正在试验中的配置选项,可能在未来的版本中发生变化。
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ExperimentalConfig {
    /// Webpack 语法验证的目标列表
    pub webpack_syntax_validate: Vec<String>,
    /// 是否启用 require.context 支持
    pub require_context: bool,
    /// 循环依赖检测的配置
    #[serde(deserialize_with = "deserialize_detect_loop")]
    pub detect_circular_dependence: Option<DetectCircularDependence>,
}

14-19: 结构定义良好,建议添加详细文档。

DetectCircularDependence 结构体的定义看起来很好,与 ExperimentalConfig 保持了一致的命名约定。

为了提高代码的可读性和可维护性,建议添加更详细的文档注释,特别是解释 ignoresgraphviz 字段的具体用途。

建议添加类似以下的文档注释:

/// 循环依赖检测的配置选项
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct DetectCircularDependence {
    /// 在循环依赖检测中需要忽略的模块或路径列表
    pub ignores: Vec<String>,
    /// 是否生成依赖关系的 GraphViz 图表
    pub graphviz: bool,
}
crates/mako/src/config/minifish.rs (3)

8-14: MinifishConfig 结构体设计合理

结构体的设计很好地涵盖了配置的不同方面。使用驼峰命名法有利于与 JavaScript/TypeScript 的互操作性。

建议为结构体和每个字段添加文档注释,以提高代码的可读性和可维护性。例如:

/// 配置 Minifish 的结构体
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct MinifishConfig {
    /// 映射配置
    pub mapping: HashMap<String, String>,
    /// 元数据路径
    pub meta_path: Option<PathBuf>,
    /// 注入配置
    pub inject: Option<HashMap<String, InjectItem>>,
}

16-25: InjectItem 结构体设计合理

结构体的设计很好地涵盖了注入配置的各个方面。大多数字段使用 Option 类型增加了配置的灵活性。

建议为结构体和每个字段添加文档注释,以提高代码的可读性和可维护性。例如:

/// 配置注入项的结构体
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct InjectItem {
    /// 注入来源
    pub from: String,
    /// 命名导入
    pub named: Option<String>,
    /// 是否使用命名空间
    pub namespace: Option<bool>,
    /// 排除模式
    pub exclude: Option<String>,
    /// 包含模式
    pub include: Option<String>,
    /// 是否优先使用 require
    pub prefer_require: Option<bool>,
}

27-27: 使用宏创建反序列化函数是个好方法

使用 create_deserialize_fn 宏为 MinifishConfig 创建反序列化函数是一种简洁的方法。

建议为这行代码添加一个简短的注释,解释宏的作用,以帮助新开发者理解代码。例如:

// 为 MinifishConfig 创建反序列化函数
create_deserialize_fn!(deserialize_minifish, MinifishConfig);
crates/mako/src/config/px2rem.rs (2)

5-23: Px2RemConfig 结构体定义良好,但可以进行小改进。

结构体的设计很好地满足了像素到 rem 单位转换配置的需求。每个字段都有适当的 serde 属性,这有助于序列化和反序列化。

建议:

  • 考虑为 min_pixel_value 字段也添加一个默认值函数,以保持与 root 字段的一致性。

您可以这样修改:

-    #[serde(rename = "minPixelValue", default)]
+    #[serde(rename = "minPixelValue", default = "default_min_pixel_value")]
     pub min_pixel_value: f64,

 // 在文件的其他地方添加:
+fn default_min_pixel_value() -> f64 {
+    0.0
+}

这样可以使默认值的设置更加明确和一致。


40-40: 宏的使用看起来是正确的,但可以添加注释。

create_deserialize_fn! 宏的使用似乎是为 Px2RemConfig 创建一个自定义的反序列化函数。这是一个常见且有用的模式。

建议:

  • 考虑在宏调用之前添加一个简短的注释,解释 deserialize_px2rem 函数的用途和行为。

您可以添加类似这样的注释:

// 创建 Px2RemConfig 的自定义反序列化函数
create_deserialize_fn!(deserialize_px2rem, Px2RemConfig);

这将帮助其他开发者更好地理解这个函数的目的。

crates/mako/src/config/output.rs (4)

11-25: OutputConfig 结构体设计合理,但可以改进文档

结构体的设计涵盖了输出配置的各个方面,使用驼峰命名法序列化字段名有利于与 JavaScript/TypeScript 互操作。然而,建议为每个字段添加文档注释,以便更好地理解每个配置选项的用途。

建议添加类似以下的文档注释:

/// 输出配置
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct OutputConfig {
    /// 输出路径
    pub path: PathBuf,
    /// 输出模式
    pub mode: OutputMode,
    // ... 为其他字段添加类似的注释
}

27-33: OutputMode 枚举定义清晰,建议添加文档

枚举定义了两种输出模式,结构简单明了。使用 ValueEnum trait 表明它可能用于命令行解析,这是个不错的设计。

建议为枚举及其变体添加文档注释,例如:

/// 输出模式
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, ValueEnum, Clone)]
pub enum OutputMode {
    /// 打包模式
    #[serde(rename = "bundle")]
    Bundle,
    /// 非打包模式
    #[serde(rename = "bundless")]
    Bundless,
}

35-50: CrossOriginLoading 枚举及其 Display 实现设计合理

枚举定义了跨源加载的两个选项,并为其实现了 Display trait,便于字符串表示。实现与序列化名称匹配,保持了一致性。

建议添加文档注释以提高可读性:

/// 跨源加载选项
#[derive(Deserialize, Serialize, Debug, Clone)]
pub enum CrossOriginLoading {
    /// 匿名模式
    #[serde(rename = "anonymous")]
    Anonymous,
    /// 使用凭证模式
    #[serde(rename = "use-credentials")]
    UseCredentials,
}

impl fmt::Display for CrossOriginLoading {
    /// 将 CrossOriginLoading 转换为字符串表示
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        // ... 实现保持不变
    }
}

52-56: get_default_chunk_loading_global 函数逻辑合理,可以改进错误处理

函数通过使用可选的 UMD 名称或包名来生成默认的 chunk 加载全局名称,逻辑合理。

建议改进错误处理,例如:

pub fn get_default_chunk_loading_global(umd: Option<String>, root: &Path) -> String {
    let unique_name = umd.or_else(|| get_pkg_name(root).ok())
        .unwrap_or_else(|| "global".to_string());

    format!("makoChunk_{}", unique_name)
}

这样可以更明确地处理 get_pkg_name 可能的错误情况,并提供更清晰的回退策略。

crates/mako/src/config/mako.config.default.json (1)

26-37: 配置看起来合理,考虑启用高级功能

当前的配置适合标准的 Web 项目。然而,根据项目需求,您可能想考虑启用一些高级功能:

  1. 如果项目中使用 Markdown 与 JSX 混合内容,可以将 "mdx": true 设置。
  2. 对于大型项目,启用 "autoCSSModules": true 可能会提高 CSS 的模块化和可维护性。
  3. "_treeShaking": "basic" 设置是否满足项目需求?考虑是否需要更激进的 tree shaking 策略。

这些建议旨在优化构建过程和开发体验,但请根据实际项目需求来决定是否采用。

crates/mako/src/utils.rs (1)

Line range hint 1-95: 文件总结和测试建议

本次更改为 utils.rs 文件添加了一个新的实用函数 get_pkg_name,用于从 package.json 文件中读取包名。虽然基本功能已经实现,但在错误处理和健壮性方面还有改进空间。

建议:

  1. 实现上述建议的改进。
  2. get_pkg_name 函数添加单元测试,覆盖以下场景:
    • 正常情况下读取包名
    • package.json 文件不存在的情况
    • package.json 文件格式错误的情况
    • "name" 字段缺失或非字符串的情况
crates/mako/src/config/macros.rs (1)

2-2: 修正宏注释中的语法错误。

注释中存在语法错误,建议修改为:

- * a macro to create deserialize function that allow false value for optional struct
+ * A macro to create a deserialize function that allows a false value for an optional struct
crates/mako/src/config/external.rs (2)

46-49: 建议使用 Rust 标准的文档注释格式并改进注释内容

当前的注释使用了 /** ... */ 的格式,在 Rust 中标准的文档注释是使用三斜杠 /// 或者模块级别的 //!。建议调整注释格式以符合 Rust 的惯例,并改进注释的语法,使其更加清晰。

您可以参考以下修改:

-/**
- * custom formatter for convert $EMPTY to enum, because rename is not supported for $ symbol
- * @see https://serde.rs/custom-date-format.html
- */
+//! 自定义格式化器,将 `$EMPTY` 转换为枚举,因为 Serde 不支持对包含特殊符号的字段重命名。
+//!
+//! 参考:https://serde.rs/custom-date-format.html

3-44: 建议为结构体和枚举添加文档注释

为了提高代码的可读性和可维护性,建议在每个结构体和枚举的定义之前添加文档注释,说明其用途和使用方式。这将有助于其他开发者更快地理解您的代码。

例如,您可以在 ExternalConfig 枚举前添加注释:

/// 配置外部模块的枚举类型,支持基本字符串配置和高级配置结构
pub enum ExternalConfig {
    // ...
}
crates/mako/src/config.rs (3)

97-116: 缺少对 validate_mako_config 函数的单元测试

新添加的 validate_mako_config 函数(第97-116行)尚未被单元测试覆盖。为了确保配置验证功能的可靠性,建议为该函数编写单元测试。

您是否需要我协助编写此函数的单元测试,或为您打开一个新的 GitHub issue 来跟踪这个任务?

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 103-108: crates/mako/src/config.rs#L103-L108
Added lines #L103 - L108 were not covered by tests


[warning] 110-110: crates/mako/src/config.rs#L110
Added line #L110 was not covered by tests


[warning] 113-113: crates/mako/src/config.rs#L113
Added line #L113 was not covered by tests


79-96: 缺少对 ConfigParseError 的测试覆盖

ConfigParseError 结构体及其实现(第79-96行)目前没有单元测试覆盖。为了提高错误处理的可靠性,建议为其添加相应的单元测试。

您是否需要我协助编写相关的单元测试,或为您打开一个新的 GitHub issue 来跟踪这个任务?

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 79-79: crates/mako/src/config.rs#L79
Added line #L79 was not covered by tests


[warning] 83-83: crates/mako/src/config.rs#L83
Added line #L83 was not covered by tests


[warning] 85-86: crates/mako/src/config.rs#L85-L86
Added lines #L85 - L86 were not covered by tests


[warning] 92-94: crates/mako/src/config.rs#L92-L94
Added lines #L92 - L94 were not covered by tests


294-330: 配置冲突检查缺少单元测试

在第294-330行,添加了对配置冲突的检查和错误处理逻辑。这些重要的校验逻辑目前没有被测试覆盖。建议为这些场景编写单元测试,以确保配置冲突能够被正确捕获和处理。

您是否需要我协助编写这些测试用例,或为您打开一个新的 GitHub issue 来跟踪这个任务?

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 294-294: crates/mako/src/config.rs#L294
Added line #L294 was not covered by tests


[warning] 298-298: crates/mako/src/config.rs#L298
Added line #L298 was not covered by tests


[warning] 302-302: crates/mako/src/config.rs#L302
Added line #L302 was not covered by tests


[warning] 319-322: crates/mako/src/config.rs#L319-L322
Added lines #L319 - L322 were not covered by tests

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 9a4c4d8 and ff30ee5.

📒 Files selected for processing (34)
  • crates/mako/src/config.rs (1 hunks)
  • crates/mako/src/config/analyze.rs (1 hunks)
  • crates/mako/src/config/code_splitting.rs (1 hunks)
  • crates/mako/src/config/config.rs (0 hunks)
  • crates/mako/src/config/dev_server.rs (1 hunks)
  • crates/mako/src/config/devtool.rs (1 hunks)
  • crates/mako/src/config/duplicate_package_checker.rs (1 hunks)
  • crates/mako/src/config/experimental.rs (1 hunks)
  • crates/mako/src/config/external.rs (1 hunks)
  • crates/mako/src/config/generic_usize.rs (1 hunks)
  • crates/mako/src/config/hrm.rs (1 hunks)
  • crates/mako/src/config/inline_css.rs (1 hunks)
  • crates/mako/src/config/macros.rs (1 hunks)
  • crates/mako/src/config/mako.config.default.json (1 hunks)
  • crates/mako/src/config/manifest.rs (1 hunks)
  • crates/mako/src/config/minifish.rs (1 hunks)
  • crates/mako/src/config/mode.rs (1 hunks)
  • crates/mako/src/config/module_id_strategy.rs (1 hunks)
  • crates/mako/src/config/optimization.rs (1 hunks)
  • crates/mako/src/config/output.rs (1 hunks)
  • crates/mako/src/config/progress.rs (1 hunks)
  • crates/mako/src/config/provider.rs (1 hunks)
  • crates/mako/src/config/px2rem.rs (1 hunks)
  • crates/mako/src/config/react.rs (1 hunks)
  • crates/mako/src/config/resolve.rs (1 hunks)
  • crates/mako/src/config/rsc_client.rs (1 hunks)
  • crates/mako/src/config/rsc_server.rs (1 hunks)
  • crates/mako/src/config/stats.rs (1 hunks)
  • crates/mako/src/config/transform_import.rs (1 hunks)
  • crates/mako/src/config/tree_shaking.rs (1 hunks)
  • crates/mako/src/config/umd.rs (1 hunks)
  • crates/mako/src/config/watch.rs (1 hunks)
  • crates/mako/src/generate/chunk_pot/util.rs (1 hunks)
  • crates/mako/src/utils.rs (2 hunks)
💤 Files not reviewed due to no reviewable changes (1)
  • crates/mako/src/config/config.rs
🧰 Additional context used
🪛 GitHub Check: codecov/patch
crates/mako/src/config.rs

[warning] 3-3: crates/mako/src/config.rs#L3
Added line #L3 was not covered by tests


[warning] 6-6: crates/mako/src/config.rs#L6
Added line #L6 was not covered by tests


[warning] 9-9: crates/mako/src/config.rs#L9
Added line #L9 was not covered by tests


[warning] 17-17: crates/mako/src/config.rs#L17
Added line #L17 was not covered by tests


[warning] 20-20: crates/mako/src/config.rs#L20
Added line #L20 was not covered by tests


[warning] 34-34: crates/mako/src/config.rs#L34
Added line #L34 was not covered by tests


[warning] 41-41: crates/mako/src/config.rs#L41
Added line #L41 was not covered by tests


[warning] 61-61: crates/mako/src/config.rs#L61
Added line #L61 was not covered by tests


[warning] 66-66: crates/mako/src/config.rs#L66
Added line #L66 was not covered by tests


[warning] 79-79: crates/mako/src/config.rs#L79
Added line #L79 was not covered by tests


[warning] 83-83: crates/mako/src/config.rs#L83
Added line #L83 was not covered by tests


[warning] 85-86: crates/mako/src/config.rs#L85-L86
Added lines #L85 - L86 were not covered by tests


[warning] 92-94: crates/mako/src/config.rs#L92-L94
Added lines #L92 - L94 were not covered by tests


[warning] 103-108: crates/mako/src/config.rs#L103-L108
Added lines #L103 - L108 were not covered by tests


[warning] 110-110: crates/mako/src/config.rs#L110
Added line #L110 was not covered by tests


[warning] 113-113: crates/mako/src/config.rs#L113
Added line #L113 was not covered by tests


[warning] 132-132: crates/mako/src/config.rs#L132
Added line #L132 was not covered by tests


[warning] 155-155: crates/mako/src/config.rs#L155
Added line #L155 was not covered by tests


[warning] 157-157: crates/mako/src/config.rs#L157
Added line #L157 was not covered by tests


[warning] 159-159: crates/mako/src/config.rs#L159
Added line #L159 was not covered by tests


[warning] 169-169: crates/mako/src/config.rs#L169
Added line #L169 was not covered by tests


[warning] 178-178: crates/mako/src/config.rs#L178
Added line #L178 was not covered by tests


[warning] 200-200: crates/mako/src/config.rs#L200
Added line #L200 was not covered by tests


[warning] 206-206: crates/mako/src/config.rs#L206
Added line #L206 was not covered by tests


[warning] 216-216: crates/mako/src/config.rs#L216
Added line #L216 was not covered by tests


[warning] 252-252: crates/mako/src/config.rs#L252
Added line #L252 was not covered by tests


[warning] 294-294: crates/mako/src/config.rs#L294
Added line #L294 was not covered by tests


[warning] 298-298: crates/mako/src/config.rs#L298
Added line #L298 was not covered by tests


[warning] 302-302: crates/mako/src/config.rs#L302
Added line #L302 was not covered by tests


[warning] 319-322: crates/mako/src/config.rs#L319-L322
Added lines #L319 - L322 were not covered by tests

🔇 Additional comments (46)
crates/mako/src/config/analyze.rs (1)

1-1: 使用 serde 库是个不错的选择。

引入 serde 库的 DeserializeSerialize trait 是很好的做法。这将使 AnalyzeConfig 结构体能够轻松地与各种数据格式(如 JSON、YAML 等)进行序列化和反序列化,提高了配置的灵活性和可用性。

crates/mako/src/config/umd.rs (2)

1-3: 导入看起来没有问题。

导入的 serde::Deserializecreate_deserialize_fn 宏都是必要的,并且正确使用。


1-7: 整体代码结构清晰,实现了预期功能。

这个文件结构简洁,专注于定义 Umd 类型和其反序列化功能。使用类型别名和宏来创建反序列化函数是一个好的设计实践。建议添加一些注释来提高代码的可读性和可维护性,但总的来说,这个文件的实现是合理的。

crates/mako/src/config/resolve.rs (2)

1-1: 使用 Serde 库进行序列化和反序列化是个不错的选择。

引入 Serde 的 Deserialize 和 Serialize trait 可以方便地将配置结构转换为各种数据格式(如 JSON)或从这些格式中解析。这对于配置管理来说是一个很好的做法。


3-4: 结构定义清晰且实用。

ResolveConfig 结构的定义很好:

  1. 使用 pub 关键字使其可以在模块外部使用,这对于配置结构来说是必要的。
  2. 派生了 DeserializeSerialize trait,与 Serde 的使用相匹配。
  3. 添加了 Debug trait,这对于开发和调试非常有用。
  4. 结构名称 ResolveConfig 清晰地表达了其用途。
crates/mako/src/config/inline_css.rs (2)

1-3: 导入看起来没有问题。

导入的 serde 特性和自定义宏都是必要的,并且正确使用。


8-8: 宏的使用看起来正确,但需要验证其实现。

create_deserialize_fn! 宏的使用与 InlineCssConfig 结构体的定义一致。

请运行以下脚本来验证宏的实现:

✅ Verification successful

宏实现已验证,无需进一步更改。

create_deserialize_fn! 宏的实现已确认,并且在 InlineCssConfig 中的使用与其他配置文件中的用法一致,符合预期。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 描述:验证 create_deserialize_fn! 宏的实现

# 测试:搜索宏的定义。预期:找到宏的实现代码。
rg --type rust -A 10 'macro_rules!\s+create_deserialize_fn'

# 测试:搜索宏的其他用例。预期:找到类似的用法模式。
rg --type rust 'create_deserialize_fn!\s*\([^)]+\)'

Length of output: 2630

crates/mako/src/config/provider.rs (1)

1-1: 导入语句正确无误。

HashMap 的导入是必要的,并且正确使用了标准库。

crates/mako/src/config/hrm.rs (1)

1-3: 导入看起来很好。

导入的内容适合文件的功能,使用 serde 进行序列化和反序列化是一个很好的选择。自定义宏的使用表明项目中有一致的反序列化函数创建方法。

crates/mako/src/config/stats.rs (2)

1-3: 导入看起来很好。

导入语句正确引入了所需的 Serde 特性和自定义宏。这些导入为结构体的序列化/反序列化功能和代码生成提供了必要的支持。


10-10: 宏使用正确,建议验证实现。

create_deserialize_fn! 宏的使用看起来是正确的,它为 StatsConfig 创建了一个名为 deserialize_stats 的反序列化函数。这种方法可以提供更多的反序列化控制。

然而,由于宏的具体实现在此文件中不可见,建议验证以下几点:

  1. 确保宏生成的函数符合预期的反序列化逻辑。
  2. 验证生成的函数能够正确处理各种输入情况,包括边界情况和错误处理。
  3. 考虑添加单元测试来确保 deserialize_stats 函数的正确性。

请运行以下脚本来查看宏的定义:

✅ Verification successful

宏使用验证通过。

create_deserialize_fn! 宏在 crates/mako/src/config/macros.rs 中的定义正确,为 StatsConfig 创建了 deserialize_stats 反序列化函数。宏的实现符合预期的反序列化逻辑,确保了代码的正确性。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 描述:查找 create_deserialize_fn 宏的定义

# 测试:搜索宏定义。预期:找到宏的具体实现。
rg --type rust "macro_rules!\s+create_deserialize_fn" -A 10

Length of output: 894

crates/mako/src/config/module_id_strategy.rs (1)

1-2: 代码结构清晰,使用恰当

serde 的使用和枚举的结构设计都很合理。ModuleIdStrategy 枚举清晰地定义了三种模块 ID 策略,这有助于配置的灵活性。枚举被标记为 pub,表明它可以在其他模块中使用,这增加了代码的可重用性。

Also applies to: 4-11

crates/mako/src/config/watch.rs (1)

1-5: 导入和派生宏的使用恰当。

使用 Serde 进行序列化和反序列化是配置结构的良好选择。派生 Debug 特征有助于日志记录和调试。将所有字段重命名为驼峰式命名法符合常见的 JSON 命名约定,有利于与其他系统集成。

crates/mako/src/config/dev_server.rs (2)

1-3: 导入看起来很好。

导入的 serde 特性和自定义宏都是必要的,并且符合文件的用途。


12-12: 自定义宏的使用看起来合适,但建议验证其实现。

使用 create_deserialize_fn! 宏来创建反序列化函数是个好主意,它可能有助于减少重复代码。然而,为了确保其正确性和效率,建议仔细检查宏的实现。

请运行以下脚本来检查宏的定义和使用:

✅ Verification successful

create_deserialize_fn! 的定义和使用已通过验证,没有发现问题。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 描述:验证 create_deserialize_fn 宏的定义和使用

# 测试:搜索宏的定义
echo "Searching for macro definition:"
rg --type rust "macro_rules!\s+create_deserialize_fn"

# 测试:搜索宏的其他使用情况
echo "Searching for other macro usages:"
rg --type rust "create_deserialize_fn!"

Length of output: 2075

crates/mako/src/config/progress.rs (1)

1-3: 导入语句看起来不错!

使用 serde 进行序列化和反序列化是一个很好的选择。从 crate 根导入自定义宏也是一个良好的做法,有助于组织共享宏。

crates/mako/src/config/tree_shaking.rs (2)

1-3: 导入看起来没有问题。

导入的库和本地宏都是必要的,并且正确使用。


13-13: 自定义宏的使用看起来合适,但需要验证其实现。

使用 create_deserialize_fn! 宏来生成反序列化函数是一个好方法,可以减少重复代码。生成的函数名称 deserialize_tree_shaking 也符合 Rust 的命名约定。

为了确保宏的正确性和一致性,建议运行以下脚本来检查宏的定义和使用:

这将帮助我们了解宏在整个项目中的定义和使用情况,确保其实现的一致性。

crates/mako/src/config/optimization.rs (2)

1-3: 导入看起来很好!

导入的内容与结构体的功能相匹配,包括序列化和反序列化的支持。自定义宏的导入表明项目中可能有通用的反序列化逻辑。


12-12: 宏的使用看起来很好,但建议验证其实现

使用自定义宏 create_deserialize_fn! 来创建反序列化函数是一个好方法,可以减少样板代码并保持一致性。然而,没有看到宏的定义,难以完全评估其功能或潜在问题。

建议:

  1. 确保宏的实现在项目中有良好的文档说明。
  2. 验证生成的 deserialize_optimization 函数的行为是否符合预期。
  3. 考虑添加一个简单的单元测试,以确保反序列化功能正常工作。

请运行以下脚本来验证宏的定义和使用:

crates/mako/src/config/rsc_server.rs (2)

1-3: 导入看起来很好。

导入 serde 的 Deserialize 和 Serialize trait 以及自定义的 create_deserialize_fn 宏是合适的。这些导入为配置结构提供了必要的序列化和反序列化功能。


13-13: 宏的使用看起来是正确的,但需要验证其功能。

create_deserialize_fn 宏的使用似乎是为 RscServerConfig 创建一个自定义的反序列化函数。这可能对于复杂的反序列化逻辑或错误处理很有用。

建议验证 deserialize_rsc_server 函数的功能是否符合预期。可以通过以下步骤进行验证:

  1. 检查 create_deserialize_fn 宏的定义。
  2. 编写单元测试来确保 deserialize_rsc_server 函数能够正确地反序列化 RscServerConfig 实例。
✅ Verification successful

建议获取 create_deserialize_fn 宏的完整定义以进一步验证其功能。


建议获取 create_deserialize_fn 宏的完整定义以进一步验证其功能。


建议获取 create_deserialize_fn 宏的完整定义以进一步验证其功能。


已验证 create_deserialize_fn 宏的功能,使用正确。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 描述:查找 create_deserialize_fn 宏的定义
rg --type rust "macro_rules!\s+create_deserialize_fn" -A 10

Length of output: 894


Script:

#!/bin/bash
# 描述:获取 create_deserialize_fn 宏的完整定义
rg --type rust "macro_rules!\s+create_deserialize_fn" -A 20

Length of output: 1784


Script:

#!/bin/bash
# 描述:获取 create_deserialize_fn 宏的完整定义
rg --type rust "macro_rules!\s+create_deserialize_fn" -A 50

Length of output: 2244


Script:

#!/bin/bash
# 描述:获取 create_deserialize_fn 宏的完整定义
rg --type rust "macro_rules!\s+create_deserialize_fn" -A 100

Length of output: 2245

crates/mako/src/config/devtool.rs (1)

15-15: 请提供有关自定义宏的更多信息

代码使用了自定义宏 create_deserialize_fn! 来创建 DevtoolConfig 的反序列化函数。这种方法可能有其优点,但没有足够的上下文来评估其必要性和实现细节。

建议:

  1. 请提供 create_deserialize_fn! 宏的实现细节或文档链接。
  2. 考虑添加注释解释为什么需要这个自定义宏,而不是使用 serde 的标准反序列化。
  3. 如果这个宏在多个地方使用,考虑将其移动到一个共享的工具模块中。

为了更好地理解这个宏的使用情况,我们可以运行以下脚本来检查它在代码库中的其他用途:

这将帮助我们了解这个宏的广泛性和定义位置。

✅ Verification successful

核实完成:自定义宏的使用符合预期

create_deserialize_fn! 宏在多个配置文件中得到一致使用,并且其定义位于 crates/mako/src/config/macros.rs。这种集中定义和统一使用的方式有助于代码的维护和扩展。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 描述:查找 create_deserialize_fn! 宏的其他使用位置和定义

echo "查找 create_deserialize_fn! 宏的使用位置:"
rg "create_deserialize_fn!" --type rust

echo "\n查找 create_deserialize_fn! 宏的定义:"
rg "macro_rules!\s+create_deserialize_fn" --type rust

Length of output: 2079

crates/mako/src/config/transform_import.rs (1)

3-8: 枚举 TransformImportStyle 的实现看起来不错!

这个枚举的设计很好地满足了配置的需求:

  1. 使用 #[serde(untagged)] 属性允许灵活的反序列化,这对于配置文件来说是很有用的。
  2. 两个变体 Built(String)Source(bool) 涵盖了两种不同的导入转换样式,这似乎是合适的。
  3. 派生的特征(Deserialize, Serialize, Clone, 和 Debug)对于配置结构来说是合适的。
crates/mako/src/config/mode.rs (1)

1-2: 导入看起来很好!

导入的 clap::ValueEnumserde::{Deserialize, Serialize} 都在 Mode 枚举的定义中使用,分别用于命令行参数解析和序列化/反序列化。这些导入是必要的,并且与代码的用途相符。

crates/mako/src/config/manifest.rs (1)

1-3: 导入语句看起来很合适。

导入语句包含了必要的 serde 功能和本地模块,没有多余或缺失的导入。

crates/mako/src/config/duplicate_package_checker.rs (3)

1-3: 导入看起来很合适。

导入的 serde 特性和自定义的 create_deserialize_fn 宏与模块的功能相符,有助于实现配置的序列化和反序列化。


5-13: 结构定义良好,但请确认默认值的正确性。

DuplicatePackageCheckerConfig 结构体定义清晰,使用了适当的 Rust 和 Serde 特性。字段命名遵循了 Rust 的 snake_case 和 JSON 的 camelCase 约定,这是很好的实践。

请确认所有字段默认为 false 是否符合预期。如果某些字段默认应为 true,可能需要调整。


1-18: 总体而言,这个新文件结构清晰,符合重构目标。

这个新的 duplicate_package_checker.rs 文件很好地实现了配置代码组织的改进目标。它定义了一个清晰的 DuplicatePackageCheckerConfig 结构,使用了适当的 Rust 和 Serde 特性,并通过自定义宏简化了反序列化函数的创建。这种方法提高了配置的可维护性和可读性。

建议在进行代码审查时,考虑以下几点:

  1. 确认所有配置字段的默认值是否符合预期。
  2. 考虑为自定义宏的使用添加简短的解释性注释。
  3. 如果这种配置结构模式在项目中被广泛使用,可以考虑创建一个模板或指南,以确保一致性。
crates/mako/src/config/rsc_client.rs (1)

1-4: 导入看起来很合适

导入的库和本地宏与文件的功能相匹配,包括命令行参数解析、序列化/反序列化以及自定义的反序列化函数创建。

crates/mako/src/config/minifish.rs (1)

1-6: 导入看起来很合适!

导入的内容与文件中定义的结构体和功能相匹配,没有多余的导入。

crates/mako/src/config/px2rem.rs (3)

1-3: 导入语句看起来很好。

导入语句包含了必要的 serde 依赖和本地模块,这些都是配置结构所需的。


25-38: Default 特征实现看起来很好。

Px2RemConfigDefault 实现提供了合理的默认值。特别是:

  • root 字段使用 visitors::css_px2rem::default_root() 函数,与结构体定义保持一致。
  • 其他字段的默认值也很合适,如空向量和布尔值 false

这个实现为使用者提供了一个良好的起点,允许他们只覆盖需要自定义的字段。


1-40: 总体来说,这个新的 px2rem.rs 模块实现得很好。

该模块引入了一个用于像素到 rem 单位转换配置的新结构体 Px2RemConfig。主要亮点包括:

  1. 结构良好,使用了适当的 Rust 语言特性。
  2. 充分利用了 Serde 进行序列化和反序列化。
  3. 提供了合理的默认值实现。

建议的小改进:

  1. min_pixel_value 字段添加默认值函数。
  2. create_deserialize_fn! 宏调用添加注释。

这些小改动将进一步提高代码的可读性和一致性。总的来说,这是一个优秀的实现,为项目的配置管理提供了灵活性和可扩展性。

crates/mako/src/config/output.rs (2)

1-9: 导入看起来很合适!

导入的模块和函数与文件的功能相匹配,没有发现未使用的导入。


58-58: 需要更多关于 create_deserialize_fn 宏的信息

这行代码使用宏创建了 CrossOriginLoading 的反序列化函数。为了更好地理解其功能和必要性,建议提供以下信息:

  1. create_deserialize_fn 的定义和功能说明。
  2. 为什么需要为 CrossOriginLoading 创建自定义的反序列化函数。
  3. 这个自定义反序列化如何影响 OutputConfig 结构体中 cross_origin_loading 字段的处理。

可以运行以下命令来查找宏的定义:

这将帮助我们更好地评估此宏的使用是否合适。

✅ Verification successful

验证通过:create_deserialize_fn 宏定义完整且功能正确

crates/mako/src/config/output.rs 文件中调用 create_deserialize_fn!(deserialize_cross_origin_loading, CrossOriginLoading); 生成的反序列化函数完整且符合预期,没有发现被移除或替换的代码。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

rg "macro_rules!\s+create_deserialize_fn" --type rust

Length of output: 125


Script:

#!/bin/bash
# 提取 create_deserialize_fn 宏的定义
sed -n '/macro_rules! create_deserialize_fn {/,/}/p' crates/mako/src/config/macros.rs

Length of output: 1163


Script:

#!/bin/bash
# 完整提取 create_deserialize_fn 宏的定义,包括所有括号
awk '/macro_rules! create_deserialize_fn {/,/}/' crates/mako/src/config/macros.rs

Length of output: 1159


Script:

#!/bin/bash
# 提取 create_deserialize_fn 宏的完整定义,包括后续的20行
rg "macro_rules!\s+create_deserialize_fn" --type rust -A 20 crates/mako/src/config/macros.rs

Length of output: 1124


Script:

#!/bin/bash
# 完整提取 create_deserialize_fn 宏的定义,包括后续的40行
rg "macro_rules!\s+create_deserialize_fn" --type rust -A 40 crates/mako/src/config/macros.rs

Length of output: 1320

crates/mako/src/config/mako.config.default.json (4)

1-14: 确认入口配置和输出设置

entry 对象当前为空。请确认这是否是有意为之,或是否需要在此处指定项目的入口点。

输出配置看起来很全面,涵盖了构建输出的各个方面,包括路径、模式、ES 版本等。这些设置提供了良好的灵活性。


38-53: 优化设置全面,验证 React 配置

优化设置看起来很全面,包括了并行分块、清理、节点 polyfill 等多个方面,这有助于提高构建性能和输出质量。

React 配置使用了现代设置,特别是 "runtime": "automatic",这是 React 17+ 推荐的方式。请确认这些设置与项目中使用的 React 版本相匹配:

  1. 确保项目使用的是 React 17 或更高版本。
  2. 验证 "importSource": "react" 是否符合项目需求,特别是如果使用了自定义的 JSX 转换。
  3. 检查 "pragma""pragmaFrag" 设置是否仍然需要,因为在 "automatic" 运行时模式下,这些通常不是必需的。

15-25: ⚠️ Potential issue

检查模式设置和目标浏览器版本

  1. 模式设置为 "development",但同时启用了压缩(minify: true)。这种组合比较不常见,可能会影响开发过程中的调试。请确认这是否是有意为之,或是否应该在开发模式下禁用压缩。

  2. 目标浏览器设置为 Chrome 80。考虑到 Chrome 的快速更新周期,这个版本可能已经过时。建议检查是否需要更新到更新的版本,以利用新的浏览器功能并提高兼容性。


62-77: 🛠️ Refactor suggestion

探索实验性功能并扩展监视配置

  1. 实验性功能:

    • "webpackSyntaxValidate" 数组为空,考虑添加需要验证的特定语法或模块。
    • 循环依赖检测功能已启用,这对于提高代码质量很有帮助。考虑将 "graphviz": true 设置,以生成依赖关系的可视化图表,有助于更好地理解和解决复杂的依赖关系。
  2. 监视配置:

    • "ignorePaths" 数组为空,建议添加不需要监视的特定路径,如 builddistnode_modules 目录。
    • "_nodeModulesRegexes" 为空,可以考虑添加一些正则表达式来更精确地控制 node_modules 的监视行为。
  3. 其他设置:

    • "useDefineForClassFields": true 是一个好的现代 JavaScript 实践。
    • 考虑项目需求,评估是否需要启用 "emitDecoratorMetadata": true,特别是如果使用 TypeScript 和某些依赖装饰器元数据的框架。
crates/mako/src/utils.rs (1)

10-10: 导入语句正确添加

新添加的 use std::path::Path; 导入语句是正确的,它为新的 get_pkg_name 函数提供了必要的 Path 类型支持。

crates/mako/src/generate/chunk_pot/util.rs (2)

24-24: 导入语句的更改看起来不错!

这些更改符合重构配置代码组织的目标。将get_pkg_name函数从crate::utils模块中单独导入,提高了代码的清晰度和可维护性。这种方法使得依赖关系更加明确,有助于更好地理解和管理代码。

Also applies to: 28-28


Line range hint 1-385: 代码变更的整体影响是积极的

导入语句的更改是一个小而精确的重构,符合改进配置代码组织的目标。这些更改不会影响文件的其他部分或其整体功能。get_pkg_name函数在runtime_code函数中的使用保持不变,确保了代码的一致性和正确性。

总的来说,这些更改提高了代码的可读性和可维护性,同时保持了现有功能的完整性。

crates/mako/src/config/code_splitting.rs (3)

18-22: CodeSplitting 结构体定义合理

CodeSplitting 结构体正确地包含了策略和可选参数,代码清晰且易于维护。


24-32: CodeSplittingStrategy 枚举定义完善

CodeSplittingStrategy 枚举完整地列出了可能的拆分策略,并正确地处理了序列化和反序列化。


34-39: CodeSplittingStrategyOptions 枚举设计合理

CodeSplittingStrategyOptions 使用了 untagged 枚举,能够灵活匹配不同的策略选项,设计合理。

crates/mako/src/config/watch.rs Show resolved Hide resolved
pub graphviz: bool,
}

create_deserialize_fn!(deserialize_detect_loop, DetectCircularDependence);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

建议重命名 deserialize_detect_loop 函数以保持命名一致性。

在代码库中,create_deserialize_fn! 宏用于生成多个配置结构体的反序列化函数,命名通常遵循 deserialize_<结构体名称> 的模式。然而,deserialize_detect_loop 用于 DetectCircularDependence 结构体,这与其他反序列化函数的命名不一致。

建议:

  • deserialize_detect_loop 重命名为 deserialize_detect_circular_dependence,以匹配对应的结构体名称,提升代码的一致性和可读性。
🔗 Analysis chain

请提供有关 create_deserialize_fn! 宏的更多信息,并考虑重命名反序列化函数。

使用自定义宏 create_deserialize_fn! 来创建反序列化函数是一个有趣的方法。为了更好地理解其用途和实现:

  1. 能否提供 create_deserialize_fn! 宏的定义或文档链接?这将有助于理解其功能和潜在的影响。

  2. 考虑将 deserialize_detect_loop 函数重命名为更具描述性的名称,例如 deserialize_detect_circular_dependence。当前的名称可能会引起混淆,因为它是在反序列化 DetectCircularDependence 结构体,而不是特定的"循环"。

为了更好地理解这个宏的使用情况,我们可以在代码库中搜索它的其他用例:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 搜索 create_deserialize_fn! 宏的其他使用实例
rg --type rust "create_deserialize_fn!" -C 3

Length of output: 4611

Comment on lines +54 to +61
"progress": {
"progressChars": "▨▨"
},
"duplicatePackageChecker": {
"verbose": false,
"showHelp": false,
"emitError": false
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

考虑启用重复包检查器的某些选项

进度显示的自定义字符("progressChars": "▨▨")是一个不错的视觉定制,可以提高构建过程的可读性。

然而,重复包检查器(duplicatePackageChecker)的所有选项都设置为 false,这可能会错过一些重要的警告:

  1. 考虑将 "verbose": true 设置,以获得更详细的输出,有助于识别潜在的问题。
  2. "emitError": true 可以在发现重复包时中断构建,这在某些情况下可能很有用,特别是在 CI/CD 管道中。
  3. 至少将 "showHelp": true 设置为 true,以便在发现问题时提供有用的信息。

启用这些选项可以帮助更好地管理依赖,减少潜在的冲突和构建大小问题。

Comment on lines +56 to +69
pub(crate) fn get_pkg_name(root: &Path) -> Option<String> {
let pkg_json_path = root.join("package.json");

if pkg_json_path.exists() {
let pkg_json = std::fs::read_to_string(pkg_json_path).unwrap();
let pkg_json: serde_json::Value = serde_json::from_str(&pkg_json).unwrap();

pkg_json
.get("name")
.map(|name| name.as_str().unwrap().to_string())
} else {
None
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

建议改进错误处理和健壮性

get_pkg_name 函数的实现有以下几点可以改进:

  1. 错误处理:建议使用 Result 类型而不是 unwrap(),以便更好地处理可能出现的错误。

  2. 健壮性:函数假设 "name" 字段始终是字符串类型,这可能并不总是成立。建议添加类型检查。

  3. 代码格式:函数体的缩进似乎与文件其他部分不一致,建议统一缩进风格。

以下是改进后的代码建议:

pub(crate) fn get_pkg_name(root: &Path) -> Result<Option<String>> {
    let pkg_json_path = root.join("package.json");

    if pkg_json_path.exists() {
        let pkg_json = std::fs::read_to_string(pkg_json_path)
            .map_err(|e| anyhow!("Failed to read package.json: {}", e))?;
        let pkg_json: serde_json::Value = serde_json::from_str(&pkg_json)
            .map_err(|e| anyhow!("Failed to parse package.json: {}", e))?;

        Ok(pkg_json.get("name")
            .and_then(|name| name.as_str())
            .map(|s| s.to_string()))
    } else {
        Ok(None)
    }
}

这个版本使用 Result 处理错误,增加了对 "name" 字段类型的检查,并统一了缩进风格。

crates/mako/src/config/code_splitting.rs Show resolved Hide resolved
crates/mako/src/config/code_splitting.rs Show resolved Hide resolved
Comment on lines +135 to +142
let v = String::deserialize(deserializer)?;

if v.is_empty() {
Ok(None)
} else {
Ok(Regex::new(v.as_str()).ok())
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

避免在正则表达式解析失败时忽略错误

在反序列化正则表达式时,如果解析失败,当前实现会返回 Ok(None),这可能会导致潜在的错误被忽略。建议在解析失败时正确地传播错误,以便开发者及时发现并处理无效的正则表达式。

可以修改代码以在解析失败时返回错误:

  if v.is_empty() {
      Ok(None)
  } else {
-     Ok(Regex::new(v.as_str()).ok())
+     match Regex::new(v.as_str()) {
+         Ok(regex) => Ok(Some(regex)),
+         Err(err) => Err(serde::de::Error::custom(format!("Invalid regex pattern: {}", err))),
+     }
  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let v = String::deserialize(deserializer)?;
if v.is_empty() {
Ok(None)
} else {
Ok(Regex::new(v.as_str()).ok())
}
}
let v = String::deserialize(deserializer)?;
if v.is_empty() {
Ok(None)
} else {
match Regex::new(v.as_str()) {
Ok(regex) => Ok(Some(regex)),
Err(err) => Err(serde::de::Error::custom(format!("Invalid regex pattern: {}", err))),
}
}
}

mod experimental;
mod external;
mod generic_usize;
mod hrm;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

模块名称可能存在拼写错误

在第9行声明了 mod hrm;,但在第51行使用了 pub use hrm::{deserialize_hmr, HmrConfig};。根据上下文,可能是热模块替换,缩写通常为 hmr。请检查模块名称是否应为 hmr,以保持一致性。

Also applies to: 51-51

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 9-9: crates/mako/src/config.rs#L9
Added line #L9 was not covered by tests

Comment on lines +283 to +290
"{}: The configuration of {} conflicts with current {} and will be overwritten as {} ",
"warning".to_string().yellow(),
"NODE_ENV".to_string().yellow(),
"mode".to_string().yellow(),
config.mode.to_string().red()
);
println!("{}", warn_message);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

建议使用日志库记录警告信息

在第283-290行,使用了 println! 输出警告信息。为了更好地控制日志级别和输出方式,建议使用日志库(如 log crate)来记录警告信息,而不是直接使用 println!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (5)
crates/mako/src/config/hmr.rs (2)

3-3: 自定义宏的导入看起来没有问题,但可以考虑添加文档。

create_deserialize_fn 宏的导入是正确的。然而,为了提高代码的可读性和可维护性,建议为这个自定义宏添加文档注释,解释其用途和使用方法。

考虑在 create_deserialize_fn 宏的定义处添加类似以下的文档注释:

/// 创建一个用于反序列化指定类型的函数。
/// 
/// # 参数
/// 
/// * `$name` - 要创建的函数名
/// * `$type` - 要反序列化的类型
/// 
/// # 示例
/// 
/// ```
/// create_deserialize_fn!(deserialize_config, Config);
/// ```
macro_rules! create_deserialize_fn {
    // 宏的实现...
}

5-7: HmrConfig 结构体的定义看起来不错,但可以添加注释说明其用途。

结构体的定义使用了正确的派生宏和 serde 属性。然而,当前结构体是空的,这可能表示配置尚未实现或者是为将来使用预留的占位符。

建议添加注释解释为什么这个结构体当前是空的,例如:

/// HMR(热模块替换)的配置。
/// 
/// 注意:当前此结构体为空,作为未来扩展的占位符。
/// TODO: 实现 HMR 配置选项
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct HmrConfig {}
crates/mako/src/config.rs (3)

126-222: 配置结构体设计全面,但可以改进文档

Config 结构体设计全面,涵盖了配置的多个方面。使用自定义反序列化函数允许复杂的解析逻辑,命名约定一致且具有描述性。

建议:考虑为一些较复杂或不太常见的字段添加文档注释,解释它们的用途和使用方法。这将有助于其他开发者更好地理解和使用这些配置选项。


227-389: Config::new 方法功能全面,但可以考虑重构

该方法在处理各种配置场景方面非常全面。验证步骤有助于防止无效配置,错误消息描述性强且使用颜色编码以提高可见性。

建议:考虑将 Config::new 方法拆分为更小的函数,每个函数负责特定的验证或规范化任务。这将提高代码的可读性和可维护性。例如,可以创建单独的函数来处理入口点规范化、别名解析和平台特定配置。


409-489: 测试覆盖全面,但可以提高健壮性

测试模块涵盖了重要的场景和边缘情况,包括冲突检查、无效配置和平台特定行为。使用 #[should_panic] 测试无效配置是恰当的。

建议:考虑使用相对路径或环境变量来指定测试配置文件的位置,而不是硬编码路径。这将使测试更加健壮,不容易受到目录结构变化的影响。此外,可以考虑添加更多的边缘情况测试,以确保配置系统能够正确处理各种异常情况。

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between ff30ee5 and 21ae9e5.

📒 Files selected for processing (2)
  • crates/mako/src/config.rs (1 hunks)
  • crates/mako/src/config/hmr.rs (1 hunks)
🔇 Additional comments (10)
crates/mako/src/config/hmr.rs (3)

1-1: 导入看起来没有问题。

Serde 的 Deserialize 和 Serialize 特性的导入是正确的,这对于 HmrConfig 结构体的序列化和反序列化是必要的。


9-9: create_deserialize_fn 宏的使用看起来很好。

使用 create_deserialize_fn 宏来为 HmrConfig 创建反序列化函数是一个很好的做法。这种方法可以减少样板代码,并在整个项目中保持一致性。


1-9: 总体来说,这个新文件的结构和实现都很好。

这个文件引入了 HmrConfig 结构体,用于热模块替换(HMR)的配置。它正确地使用了 Serde 进行序列化和反序列化,并使用了自定义宏来创建反序列化函数,这有助于保持代码的一致性和减少重复。

虽然实现看起来很好,但有一些小的改进建议:

  1. 为自定义宏 create_deserialize_fn 添加文档注释。
  2. HmrConfig 结构体添加注释,解释其当前为空的原因和未来的计划。

这些小改进将进一步提高代码的可读性和可维护性。

crates/mako/src/config.rs (7)

1-29: 模块导入和声明结构良好

模块化的方法改善了代码组织和可维护性。每个模块都封装了相关的功能,这是一个很好的实践。命名约定一致且具有描述性。


31-75: 导入语句组织合理

使用自定义反序列化函数表明配置解析较为复杂。导入语句组织良好,逻辑分组清晰。使用 pub use 语法重新导出一些项目,有助于模块化设计。


79-95: 配置解析错误处理得当

新引入的 ConfigParseError 结构体实现了 Diagnostic trait,增强了错误报告能力。包含源代码上下文和跨度信息,有助于调试。正确实现了 std::error::Errorfmt::Display traits。


97-116: 配置验证函数实现合理

validate_mako_config 函数提供了良好的错误处理和报告。使用 miette 进行错误诊断,有助于生成用户友好的错误消息。错误信息包含了配置文件中解析失败的确切位置,这对于调试非常有帮助。


118-124: 平台枚举定义清晰

Platform 枚举简洁明了,代表了两个主要平台。使用 serde 重命名属性确保了正确的序列化/反序列化。这种设计有助于在配置中明确指定目标平台。


391-401: 默认配置实现合理

Config::default 实现使用 DEFAULT_CONFIG 常量,确保了默认配置与整体配置结构一致。使用常量存储默认配置便于更新和维护。这种方法保证了在没有用户提供配置时,系统仍能使用一致的默认值。


403-407: 配置错误枚举设计合理

ConfigError 枚举使用 thiserror 派生 Error trait,这是一个很好的实践。错误消息清晰,包含了问题值。随着配置系统的增长,可能需要添加更多的错误变体。目前的设计为未来的扩展提供了良好的基础。

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (3)
crates/mako/src/config.rs (3)

126-222: Config 结构体的扩展增强了灵活性,但也增加了复杂性

Config 结构体的扩展涵盖了更多的配置选项,这提高了系统的灵活性。然而,这也增加了复杂性,可能会使配置过程变得更加困难。

new 方法中的验证和规范化步骤很好地提高了配置过程的健壮性。特别是以下几点值得注意:

  1. 配置文件的验证(第251行)
  2. 输出路径的规范化(第269-271行)
  3. NODE_ENVmode 的冲突检查(第279-290行)
  4. 入口文件的处理和验证(第332-360行)
  5. 别名路径的处理(第362-376行)

建议考虑将一些复杂的验证逻辑抽取为单独的私有方法,以提高 new 方法的可读性。

考虑将复杂的验证逻辑抽取为单独的私有方法,例如:

impl Config {
    fn validate_and_normalize(&mut self, root: &Path) -> Result<()> {
        self.normalize_output_path(root);
        self.check_node_env_conflict();
        self.normalize_entry(root)?;
        self.resolve_aliases(root);
        // ... 其他验证和规范化步骤
        Ok(())
    }

    fn normalize_output_path(&mut self, root: &Path) {
        if self.output.path.is_relative() {
            self.output.path = root.join(self.output.path.to_string_lossy().to_string());
        }
    }

    // ... 其他私有方法
}

这样可以使 new 方法更加简洁和易于理解。

Also applies to: 227-387


408-488: 测试用例的扩展提高了代码的可靠性

新增的测试用例涵盖了多个重要场景,包括默认配置、命令行参数、平台特定行为等。这些测试有助于确保配置系统在各种情况下都能正常工作。

特别值得称赞的是:

  1. 测试了 NODE_ENVmode 冲突的情况(第446-459行)
  2. 验证了无效 publicPath 的错误处理(第461-471行)
  3. 测试了 Node 平台特定的配置行为(第474-487行)

建议考虑添加以下测试场景:

  1. 测试 cjsumd 同时使用时的错误处理
  2. 验证 hmr 配置在没有 devServer 时的错误处理
  3. 测试 inlineCSS 在没有 umd 配置时的错误处理
  4. 验证远程 external 的错误处理

考虑添加以下测试用例:

#[test]
#[should_panic(expected = "cjs and umd cannot be used at the same time")]
fn test_cjs_and_umd_conflict() {
    // 实现测试逻辑
}

#[test]
#[should_panic(expected = "hmr can only be used with devServer")]
fn test_hmr_without_dev_server() {
    // 实现测试逻辑
}

#[test]
#[should_panic(expected = "inlineCSS can only be used with umd")]
fn test_inline_css_without_umd() {
    // 实现测试逻辑
}

#[test]
#[should_panic(expected = "remote external is not supported yet")]
fn test_remote_external_not_supported() {
    // 实现测试逻辑
}

这些额外的测试将进一步提高配置系统的可靠性和健壮性。


1-488: 配置系统的重构总体上改进了灵活性和健壮性,但可能需要更多文档支持

这次重构对配置系统进行了全面的改进,主要包括:

  1. 引入了新的模块和类型,提高了代码的组织性和类型安全性。
  2. 扩展了 Config 结构体,增加了更多配置选项,提高了系统的灵活性。
  3. 改进了错误处理机制,使用 miette 库提供更详细的错误信息。
  4. 增加了测试用例,提高了代码的可靠性。

这些改进无疑会提高系统的整体质量。然而,由于系统变得更加复杂,建议考虑以下改进:

  1. 为新增的配置选项添加详细的文档注释,解释每个选项的用途和可能的取值。
  2. 考虑创建一个单独的文档文件,详细说明配置系统的使用方法和最佳实践。
  3. 为复杂的验证逻辑添加注释,解释其目的和工作原理。
  4. 考虑提供一些常见配置场景的示例,帮助用户更好地理解如何使用这个复杂的配置系统。

建议创建一个专门的文档文件(例如 CONFIG.md),详细说明配置系统的结构、使用方法和最佳实践。这个文档可以包括:

  1. 配置文件的结构和格式说明
  2. 每个配置选项的详细解释和示例
  3. 常见配置场景的示例
  4. 配置验证和错误处理的说明
  5. 针对不同平台(浏览器/Node.js)的配置建议

这将大大提高系统的可用性,并减少用户在使用过程中可能遇到的困难。

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 21ae9e5 and 89d2abd.

📒 Files selected for processing (1)
  • crates/mako/src/config.rs (1 hunks)
🔇 Additional comments (2)
crates/mako/src/config.rs (2)

1-29: 模块结构和类型定义看起来不错!

新增的模块结构清晰,类型定义遵循了 Rust 的命名约定。ConfigParseError 结构体实现了必要的错误处理 trait,这有助于提供更详细的配置解析错误信息。Platform 枚举的引入也增强了配置的类型安全性。

Also applies to: 79-95, 118-124


97-116: 错误处理机制的改进值得称赞

新引入的 ConfigError 枚举和 validate_mako_config 函数中使用 miette 库的方式显著提升了错误处理和报告的质量。这些改进将有助于开发者更快速地定位和解决配置问题。

特别值得注意的是:

  1. ConfigParseError 结构体(第79-87行)提供了详细的错误信息,包括源代码位置。
  2. validate_mako_config 函数(第97-116行)使用 miette 生成了更加用户友好的错误信息。
  3. ConfigError 枚举(第402-406行)为特定的配置错误提供了明确的类型。

这些改进将大大提高调试效率和用户体验。

Also applies to: 402-406

@xusd320 xusd320 merged commit d9d2511 into master Sep 27, 2024
20 of 21 checks passed
@xusd320 xusd320 deleted the refactor/config branch September 27, 2024 11:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants