Skip to content

Commit 8a5f0fb

Browse files
committed
Turbopack: trace fs-extra calls
1 parent 3abe251 commit 8a5f0fb

File tree

5 files changed

+96
-44
lines changed

5 files changed

+96
-44
lines changed

turbopack/crates/turbopack-ecmascript/src/analyzer/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,10 @@ impl JsValue {
17721772
"fs",
17731773
"The Node.js fs module: https://nodejs.org/api/fs.html",
17741774
),
1775+
WellKnownObjectKind::FsExtraModule | WellKnownObjectKind::FsExtraModuleDefault => (
1776+
"fs-extra",
1777+
"The Node.js fs-extra module: https://github.com/jprichardson/node-fs-extra",
1778+
),
17751779
WellKnownObjectKind::FsModulePromises => (
17761780
"fs/promises",
17771781
"The Node.js fs module: https://nodejs.org/api/fs.html#promises-api",
@@ -3450,6 +3454,8 @@ pub enum WellKnownObjectKind {
34503454
FsModule,
34513455
FsModuleDefault,
34523456
FsModulePromises,
3457+
FsExtraModule,
3458+
FsExtraModuleDefault,
34533459
UrlModule,
34543460
UrlModuleDefault,
34553461
ChildProcess,

turbopack/crates/turbopack-ecmascript/src/analyzer/well_known.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,9 @@ async fn well_known_object_member(
600600
WellKnownObjectKind::FsModule
601601
| WellKnownObjectKind::FsModuleDefault
602602
| WellKnownObjectKind::FsModulePromises => fs_module_member(kind, prop),
603+
WellKnownObjectKind::FsExtraModule | WellKnownObjectKind::FsExtraModuleDefault => {
604+
fs_extra_module_member(kind, prop)
605+
}
603606
WellKnownObjectKind::UrlModule | WellKnownObjectKind::UrlModuleDefault => {
604607
url_module_member(kind, prop)
605608
}
@@ -693,6 +696,45 @@ fn fs_module_member(kind: WellKnownObjectKind, prop: JsValue) -> JsValue {
693696
)
694697
}
695698

699+
fn fs_extra_module_member(kind: WellKnownObjectKind, prop: JsValue) -> JsValue {
700+
if let Some(word) = prop.as_str() {
701+
match (kind, word) {
702+
// regular fs methods
703+
(
704+
..,
705+
"realpath" | "realpathSync" | "stat" | "statSync" | "existsSync"
706+
| "createReadStream" | "exists" | "open" | "openSync" | "readFile" | "readFileSync",
707+
) => {
708+
return JsValue::WellKnownFunction(WellKnownFunctionKind::FsReadMethod(
709+
word.into(),
710+
));
711+
}
712+
// fs-extra specific
713+
(
714+
..,
715+
"pathExists" | "pathExistsSync" | "readJson" | "readJSON" | "readJsonSync"
716+
| "readJSONSync",
717+
) => {
718+
return JsValue::WellKnownFunction(WellKnownFunctionKind::FsReadMethod(
719+
word.into(),
720+
));
721+
}
722+
(WellKnownObjectKind::FsExtraModule, "default") => {
723+
return JsValue::WellKnownObject(WellKnownObjectKind::FsExtraModuleDefault);
724+
}
725+
_ => {}
726+
}
727+
}
728+
JsValue::unknown(
729+
JsValue::member(
730+
Box::new(JsValue::WellKnownObject(WellKnownObjectKind::FsExtraModule)),
731+
Box::new(prop),
732+
),
733+
true,
734+
"unsupported property on fs-extra module",
735+
)
736+
}
737+
696738
fn url_module_member(kind: WellKnownObjectKind, prop: JsValue) -> JsValue {
697739
match (kind, prop.as_str()) {
698740
(.., Some("pathToFileURL")) => {

turbopack/crates/turbopack-ecmascript/src/utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ pub fn module_value_to_well_known_object(module_value: &ModuleValue) -> Option<J
214214
}
215215
"resolve-from" => JsValue::WellKnownFunction(WellKnownFunctionKind::NodeResolveFrom),
216216
"@grpc/proto-loader" => JsValue::WellKnownObject(WellKnownObjectKind::NodeProtobufLoader),
217+
"fs-extra" => JsValue::WellKnownObject(WellKnownObjectKind::FsExtraModule),
217218
_ => return None,
218219
})
219220
}

turbopack/crates/turbopack-tracing/tests/node-file-trace/test/unit/asset-fs-extra/output.js

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,43 @@
11
;[
2-
'node_modules/fs-extra/lib/copy/copy-sync.js',
3-
'node_modules/fs-extra/lib/copy/copy.js',
4-
'node_modules/fs-extra/lib/copy/index.js',
5-
'node_modules/fs-extra/lib/empty/index.js',
6-
'node_modules/fs-extra/lib/ensure/file.js',
7-
'node_modules/fs-extra/lib/ensure/index.js',
8-
'node_modules/fs-extra/lib/ensure/link.js',
9-
'node_modules/fs-extra/lib/ensure/symlink-paths.js',
10-
'node_modules/fs-extra/lib/ensure/symlink-type.js',
11-
'node_modules/fs-extra/lib/ensure/symlink.js',
12-
'node_modules/fs-extra/lib/fs/index.js',
13-
'node_modules/fs-extra/lib/index.js',
14-
'node_modules/fs-extra/lib/json/index.js',
15-
'node_modules/fs-extra/lib/json/jsonfile.js',
16-
'node_modules/fs-extra/lib/json/output-json-sync.js',
17-
'node_modules/fs-extra/lib/json/output-json.js',
18-
'node_modules/fs-extra/lib/mkdirs/index.js',
19-
'node_modules/fs-extra/lib/mkdirs/make-dir.js',
20-
'node_modules/fs-extra/lib/mkdirs/utils.js',
21-
'node_modules/fs-extra/lib/move/index.js',
22-
'node_modules/fs-extra/lib/move/move-sync.js',
23-
'node_modules/fs-extra/lib/move/move.js',
24-
'node_modules/fs-extra/lib/output-file/index.js',
25-
'node_modules/fs-extra/lib/path-exists/index.js',
26-
'node_modules/fs-extra/lib/remove/index.js',
27-
'node_modules/fs-extra/lib/remove/rimraf.js',
28-
'node_modules/fs-extra/lib/util/stat.js',
29-
'node_modules/fs-extra/lib/util/utimes.js',
30-
'node_modules/fs-extra/package.json',
31-
'node_modules/graceful-fs/clone.js',
32-
'node_modules/graceful-fs/graceful-fs.js',
33-
'node_modules/graceful-fs/legacy-streams.js',
34-
'node_modules/graceful-fs/package.json',
35-
'node_modules/graceful-fs/polyfills.js',
36-
'node_modules/jsonfile/index.js',
37-
'node_modules/jsonfile/package.json',
38-
'node_modules/jsonfile/utils.js',
39-
'node_modules/universalify/index.js',
40-
'node_modules/universalify/package.json',
2+
// 'node_modules/fs-extra/lib/copy/copy-sync.js',
3+
// 'node_modules/fs-extra/lib/copy/copy.js',
4+
// 'node_modules/fs-extra/lib/copy/index.js',
5+
// 'node_modules/fs-extra/lib/empty/index.js',
6+
// 'node_modules/fs-extra/lib/ensure/file.js',
7+
// 'node_modules/fs-extra/lib/ensure/index.js',
8+
// 'node_modules/fs-extra/lib/ensure/link.js',
9+
// 'node_modules/fs-extra/lib/ensure/symlink-paths.js',
10+
// 'node_modules/fs-extra/lib/ensure/symlink-type.js',
11+
// 'node_modules/fs-extra/lib/ensure/symlink.js',
12+
// 'node_modules/fs-extra/lib/fs/index.js',
13+
// 'node_modules/fs-extra/lib/index.js',
14+
// 'node_modules/fs-extra/lib/json/index.js',
15+
// 'node_modules/fs-extra/lib/json/jsonfile.js',
16+
// 'node_modules/fs-extra/lib/json/output-json-sync.js',
17+
// 'node_modules/fs-extra/lib/json/output-json.js',
18+
// 'node_modules/fs-extra/lib/mkdirs/index.js',
19+
// 'node_modules/fs-extra/lib/mkdirs/make-dir.js',
20+
// 'node_modules/fs-extra/lib/mkdirs/utils.js',
21+
// 'node_modules/fs-extra/lib/move/index.js',
22+
// 'node_modules/fs-extra/lib/move/move-sync.js',
23+
// 'node_modules/fs-extra/lib/move/move.js',
24+
// 'node_modules/fs-extra/lib/output-file/index.js',
25+
// 'node_modules/fs-extra/lib/path-exists/index.js',
26+
// 'node_modules/fs-extra/lib/remove/index.js',
27+
// 'node_modules/fs-extra/lib/remove/rimraf.js',
28+
// 'node_modules/fs-extra/lib/util/stat.js',
29+
// 'node_modules/fs-extra/lib/util/utimes.js',
30+
// 'node_modules/fs-extra/package.json',
31+
// 'node_modules/graceful-fs/clone.js',
32+
// 'node_modules/graceful-fs/graceful-fs.js',
33+
// 'node_modules/graceful-fs/legacy-streams.js',
34+
// 'node_modules/graceful-fs/package.json',
35+
// 'node_modules/graceful-fs/polyfills.js',
36+
// 'node_modules/jsonfile/index.js',
37+
// 'node_modules/jsonfile/package.json',
38+
// 'node_modules/jsonfile/utils.js',
39+
// 'node_modules/universalify/index.js',
40+
// 'node_modules/universalify/package.json',
4141
'package.json',
4242
'test/unit/asset-fs-extra/asset1.txt',
4343
'test/unit/asset-fs-extra/asset2.json',

turbopack/crates/turbopack-tracing/tests/unit.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ static ALLOC: turbo_tasks_malloc::TurboMalloc = turbo_tasks_malloc::TurboMalloc;
4444
// TODO fix failures
4545
#[rstest]
4646
#[case::amd_disable("amd-disable")]
47-
// #[case::array_emission("array-emission")]
47+
#[case::array_emission("array-emission")]
4848
#[case::array_holes("array-holes")]
49-
// #[case::asset_conditional("asset-conditional")]
49+
#[case::asset_conditional("asset-conditional")]
5050
#[case::asset_fs_array_expr("asset-fs-array-expr")]
5151
#[case::asset_fs_array_expr_node_prefix("asset-fs-array-expr-node-prefix")]
52-
// #[case::asset_fs_extra("asset-fs-extra")]
52+
#[case::asset_fs_extra("asset-fs-extra")]
5353
#[case::asset_fs_inline_path_babel("asset-fs-inline-path-babel")]
5454
#[case::asset_fs_inline_path_enc_es("asset-fs-inline-path-enc-es")]
5555
#[case::asset_fs_inline_path_enc_es_2("asset-fs-inline-path-enc-es-2")]
@@ -273,6 +273,8 @@ async fn to_list(assets: Vec<ResolvedVc<Box<dyn OutputAsset>>>) -> Result<Vec<Rc
273273
}
274274

275275
static TRAILING_COMMA: LazyLock<Regex> = LazyLock::new(|| Regex::new(r",[\s\n]*\]").unwrap());
276+
static LINE_COMMENTS_COMMA: LazyLock<Regex> =
277+
LazyLock::new(|| Regex::new(r"(?m)^\s*//.*$").unwrap());
276278

277279
fn node_file_trace(input_path: &str) -> Result<()> {
278280
let r = &mut {
@@ -305,8 +307,9 @@ fn node_file_trace(input_path: &str) -> Result<()> {
305307

306308
let reference = std::fs::read_to_string(reference)?;
307309
// crude JS -> JSON conversion
308-
let reference = TRAILING_COMMA
309-
.replace(&reference, "]")
310+
let reference = TRAILING_COMMA.replace(&reference, "]");
311+
let reference = LINE_COMMENTS_COMMA
312+
.replace_all(&reference, "")
310313
.replace(";", "")
311314
.replace('\'', "\"");
312315
let reference = serde_json::from_str::<Vec<String>>(&reference)?

0 commit comments

Comments
 (0)