Skip to content

Commit

Permalink
feat: support case sensitive (#1714)
Browse files Browse the repository at this point in the history
* feat: add CaseSensitivePlugin

* FIX: update path check

* fix: clippy error

* fix: 调整判断

* fix: 修复目录读取

* fix: 修改参数名称

* fix: 调整测试方式添加e2e断言,并增加配置项只有mac系统下才需要开启相关配置

* fix: 删除过滤条件

* fix: 删除多余测试文件,增加更新内容

* fix:  删除多余log

* fix: 测试执行

* fix: 添加测试系统

* fix: 调整顺序

* fix: 添加测试系统

* fix: 非mac环境断言

* fix: 引用遗漏

* fix: 断言

* fix: 删除默认

* fix: 默认配置

* fix: 测试覆盖

* Revert "fix: 测试覆盖"

This reverts commit b0a2e66.

---------

Co-authored-by: shikuan.sk <shikuan.sk@antgroup.com>
  • Loading branch information
notcold and shikuan.sk authored Dec 17, 2024
1 parent 71f79db commit 9a00db2
Show file tree
Hide file tree
Showing 14 changed files with 177 additions and 3 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
os: [ ubuntu-latest, macos-latest ]
runs-on: ${{ matrix.os }}
if: ${{ !startsWith(github.event.head_commit.message, 'release:') && !startsWith(github.event.head_commit.message, 'ci:') && !startsWith(github.event.head_commit.message, 'docs:') }}
steps:
Expand Down Expand Up @@ -90,7 +90,7 @@ jobs:
fail-fast: false
matrix:
script: [ "test:e2e", "test:hmr", "test:umi" ]
os: [ ubuntu-latest ]
os: [ ubuntu-latest, macos-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions crates/binding/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ pub struct BuildParams {
ignoredPaths?: string[];
_nodeModulesRegexes?: string[];
};
caseSensitiveCheck?: boolean;
}"#)]
pub config: serde_json::Value,
pub plugins: Vec<JsHooks>,
Expand Down
4 changes: 4 additions & 0 deletions crates/mako/src/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,10 @@ impl Compiler {
},
)));
}
#[cfg(target_os = "macos")]
if config.case_sensitive_check {
plugins.push(Arc::new(plugins::case_sensitive::CaseSensitivePlugin::new()));
}

if let Some(duplicate_package_checker) = &config.check_duplicate_package {
plugins.push(Arc::new(
Expand Down
3 changes: 3 additions & 0 deletions crates/mako/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@ pub struct Config {
default
)]
pub check_duplicate_package: Option<DuplicatePackageCheckerConfig>,
// 是否开启 case sensitive 检查,只有mac平台才需要开启
#[serde(rename = "caseSensitiveCheck")]
pub case_sensitive_check: bool,
}

const CONFIG_FILE: &str = "mako.config.json";
Expand Down
3 changes: 2 additions & 1 deletion crates/mako/src/config/mako.config.default.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,6 @@
"useDefineForClassFields": true,
"emitDecoratorMetadata": false,
"watch": { "ignorePaths": [], "_nodeModulesRegexes": [] },
"devServer": { "host": "127.0.0.1", "port": 3000 }
"devServer": { "host": "127.0.0.1", "port": 3000 },
"caseSensitiveCheck": false
}
1 change: 1 addition & 0 deletions crates/mako/src/plugins.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub mod async_runtime;
pub mod bundless_compiler;
pub mod case_sensitive;
pub mod central_ensure;
pub mod context_module;
pub mod copy;
Expand Down
95 changes: 95 additions & 0 deletions crates/mako/src/plugins/case_sensitive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
use std::collections::HashMap;
use std::fs;
use std::path::Path;
use std::sync::{Arc, Mutex};

use anyhow::{anyhow, Result};

use crate::ast::file::Content;
use crate::compiler::Context;
use crate::plugin::{Plugin, PluginLoadParam};

pub struct CaseSensitivePlugin {
cache_map: Arc<Mutex<HashMap<String, Vec<String>>>>,
}

impl CaseSensitivePlugin {
pub fn new() -> Self {
CaseSensitivePlugin {
cache_map: Default::default(),
}
}

pub fn is_checkable(&self, load_param: &PluginLoadParam, root: &String) -> bool {
let file_path = &load_param.file.path;
if !file_path.starts_with(root) {
return false;
}
for component in file_path.iter() {
if component.eq_ignore_ascii_case("node_modules") {
return false;
}
}
true
}

pub fn check_case_sensitive(&self, file: &Path, root: &str) -> String {
// 可变变量,在循环内会被修改
let mut file_path = file.to_path_buf();
let mut case_name = String::new();
// 缓存map,file path做为key存在对应路径下的文件名和文件夹名
let mut cache_map = self.cache_map.lock().unwrap_or_else(|e| e.into_inner());
while file_path.to_string_lossy().len() >= root.len() {
if let Some(current) = file_path.file_name() {
let current_str = current.to_string_lossy().to_string();
file_path.pop(); // parent directory
let mut entries: Vec<String> = Vec::new();
if let Some(dir) = file_path.to_str() {
if let Some(i) = cache_map.get(dir as &str) {
entries = i.to_vec();
} else if let Ok(files) = fs::read_dir(dir) {
files.for_each(|entry| {
entries.push(entry.unwrap().file_name().to_string_lossy().to_string());
});
cache_map.insert(dir.to_string(), entries.to_vec());
}
}
if !entries.contains(&current_str) {
if let Some(correct_name) = entries
.iter()
.find(|&x| x.to_lowercase() == current_str.to_lowercase())
{
case_name = correct_name.to_string();
break;
}
}
}
}
case_name
}
}

impl Plugin for CaseSensitivePlugin {
fn name(&self) -> &str {
"case_sensitive_plugin"
}

fn load(
&self,
load_param: &PluginLoadParam,
context: &Arc<Context>,
) -> Result<Option<Content>> {
let root = &context.root.to_string_lossy().to_string();
if self.is_checkable(load_param, root) {
let dist_path = self.check_case_sensitive(load_param.file.path.as_path(), root);
if !dist_path.is_empty() {
return Err(anyhow!(
"{} does not match the corresponding path on disk [{}]",
load_param.file.path.to_string_lossy().to_string(),
dist_path
));
}
}
Ok(None)
}
}
16 changes: 16 additions & 0 deletions docs/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,22 @@ Whether to automatically enable CSS Modules.

If not enabled, only files with `.module.css` or `.module.less` will be treated as CSS Modules; if enabled, named imports like `import styles from './a.css'` will also be treated as CSS Modules.

### caseSensitiveCheck

- Type: `boolean`
- Default: `true`

Whether to enable case-sensitive check.

e.g.

```ts
{
caseSensitiveCheck: false,
}
```


### clean

- Type: `boolean`
Expand Down
17 changes: 17 additions & 0 deletions docs/config.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,22 @@

如果未启用,只有 `.module.css``.module.less` 的文件会被视为 CSS Modules;如果启用,像 `import styles from './a.css'` 这样的命名导入也会被视为 CSS Modules。

### caseSensitiveCheck

- 类型:`boolean`
- 默认值:`true`

是否启用大小写敏感检查。

e.g.

```ts
{
caseSensitiveCheck: false,
}
```


### clean

- 类型:`boolean`
Expand Down Expand Up @@ -850,3 +866,4 @@ babel-plugin-import 的简化版本,仅支持三个配置项:libraryName,l
- 默认值:`true`

是否在开发模式下将构建结果写入磁盘。

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions e2e/fixtures/error.case-sensitive/expect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const assert = require("assert");
const os = require("os");

module.exports = (err) => {
if (os.platform() === "darwin") {
assert(
err.stderr.includes(
`/Assets/umi-logo.png does not match the corresponding path on disk [assets]`
),
"should throw error"
);
} else {
assert(
err.stderr.includes(
`Module not found: Can't resolve './Assets/umi-logo.png'`
),
"should throw error"
);
}
};
4 changes: 4 additions & 0 deletions e2e/fixtures/error.case-sensitive/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import UmiLogo from "./Assets/umi-logo.png";
console.log(UmiLogo);

export default UmiLogo;
4 changes: 4 additions & 0 deletions e2e/fixtures/error.case-sensitive/mako.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"mode": "production",
"caseSensitiveCheck": true
}
8 changes: 8 additions & 0 deletions e2e/fixtures/error.case-sensitive/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "test",
"version": "1.0.0",
"dependencies": {
"a": "~1.0.0",
"b": "~1.0.0"
}
}

0 comments on commit 9a00db2

Please sign in to comment.