diff --git a/rewatch/src/build/compile.rs b/rewatch/src/build/compile.rs index 2e13b92563..f62a5123d8 100644 --- a/rewatch/src/build/compile.rs +++ b/rewatch/src/build/compile.rs @@ -521,7 +521,9 @@ fn get_dependency_paths( .as_ref() .map(|package| package.path.clone()) } else { - packages::read_dependency(package_name, project_context).ok() + // packages will only be None when called by build::get_compiler_args + // in that case we can safely pass config as the package config. + packages::read_dependency(package_name, config, project_context).ok() } .map(|canonicalized_path| { vec![ diff --git a/rewatch/src/build/packages.rs b/rewatch/src/build/packages.rs index c4d1b6e9b6..73fa603943 100644 --- a/rewatch/src/build/packages.rs +++ b/rewatch/src/build/packages.rs @@ -250,13 +250,50 @@ pub fn read_config(package_dir: &Path) -> Result { } } -pub fn read_dependency(package_name: &str, project_context: &ProjectContext) -> Result { +pub fn read_dependency( + package_name: &str, + package_config: &Config, + project_context: &ProjectContext, +) -> Result { + // package folder + node_modules + package_name + // This can happen in the following scenario: + // The ProjectContext has a MonoRepoContext::MonorepoRoot. + // We are reading a dependency from the root package. + // And that local dependency has a hoisted dependency. + let path_from_current_package = package_config + .path + .parent() + .ok_or_else(|| { + anyhow!( + "Expected {} to have a parent folder", + package_config.path.to_string_lossy() + ) + }) + .map(|parent_path| helpers::package_path(parent_path, package_name))?; + + // current folder + node_modules + package_name + let path_from_current_config = project_context + .current_config + .path + .parent() + .ok_or_else(|| { + anyhow!( + "Expected {} to have a parent folder", + project_context.current_config.path.to_string_lossy() + ) + }) + .map(|parent_path| helpers::package_path(parent_path, package_name))?; + // root folder + node_modules + package_name let path_from_root = helpers::package_path(project_context.get_root_path(), package_name); - let path = (if path_from_root.exists() { + let path = (if path_from_current_package.exists() { + Ok(path_from_current_package) + } else if path_from_current_config.exists() { + Ok(path_from_current_config) + } else if path_from_root.exists() { Ok(path_from_root) } else { - Err(format!( + Err(anyhow!( "The package \"{package_name}\" is not found (are node_modules up-to-date?)..." )) })?; @@ -266,7 +303,7 @@ pub fn read_dependency(package_name: &str, project_context: &ProjectContext) -> .map(StrippedVerbatimPath::to_stripped_verbatim_path) { Ok(canonical_path) => Ok(canonical_path), - Err(e) => Err(format!( + Err(e) => Err(anyhow!( "Failed canonicalizing the package \"{}\" path \"{}\" (are node_modules up-to-date?)...\nMore details: {}", package_name, path.to_string_lossy(), @@ -312,7 +349,7 @@ fn read_dependencies( .par_iter() .map(|package_name| { let (config, canonical_path) = - match read_dependency(package_name, project_context) { + match read_dependency(package_name, package_config, project_context) { Err(error) => { if show_progress { println!( diff --git a/rewatch/testrepo/package.json b/rewatch/testrepo/package.json index 3bb995984a..4de0800eac 100644 --- a/rewatch/testrepo/package.json +++ b/rewatch/testrepo/package.json @@ -15,7 +15,11 @@ "packages/file-casing", "packages/file-casing-no-namespace", "packages/pure-dev", - "packages/with-ppx" + "packages/with-ppx", + "packages/nohoist" + ], + "nohoist": [ + "rescript-bun" ] }, "dependencies": { diff --git a/rewatch/testrepo/packages/nohoist/package.json b/rewatch/testrepo/packages/nohoist/package.json new file mode 100644 index 0000000000..958aedca5f --- /dev/null +++ b/rewatch/testrepo/packages/nohoist/package.json @@ -0,0 +1,7 @@ +{ + "name": "@testrepo/nohoist", + "dependencies": { + "rescript": "12.0.0-beta.3", + "rescript-bun": "2.0.1" + } +} diff --git a/rewatch/testrepo/packages/nohoist/rescript.json b/rewatch/testrepo/packages/nohoist/rescript.json new file mode 100644 index 0000000000..0cc58534de --- /dev/null +++ b/rewatch/testrepo/packages/nohoist/rescript.json @@ -0,0 +1,5 @@ +{ + "name": "@testrepo/nohoist", + "sources": ["src"], + "dependencies": ["rescript-bun"] +} \ No newline at end of file diff --git a/rewatch/testrepo/packages/nohoist/src/BunSample.mjs b/rewatch/testrepo/packages/nohoist/src/BunSample.mjs new file mode 100644 index 0000000000..a0abfa69c0 --- /dev/null +++ b/rewatch/testrepo/packages/nohoist/src/BunSample.mjs @@ -0,0 +1,6 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +console.log(import.meta.dir); + +/* Not a pure module */ diff --git a/rewatch/testrepo/packages/nohoist/src/BunSample.res b/rewatch/testrepo/packages/nohoist/src/BunSample.res new file mode 100644 index 0000000000..e91f5d33a8 --- /dev/null +++ b/rewatch/testrepo/packages/nohoist/src/BunSample.res @@ -0,0 +1 @@ +Console.log(RescriptBun.Globals.import.meta.dir) diff --git a/rewatch/testrepo/rescript.json b/rewatch/testrepo/rescript.json index 6085fed3a3..1b20bf9719 100644 --- a/rewatch/testrepo/rescript.json +++ b/rewatch/testrepo/rescript.json @@ -26,7 +26,8 @@ "@testrepo/deprecated-config", "@testrepo/file-casing", "@testrepo/file-casing-no-namespace", - "@testrepo/with-ppx" + "@testrepo/with-ppx", + "@testrepo/nohoist" ], "dev-dependencies": [ "@testrepo/pure-dev" diff --git a/rewatch/testrepo/yarn.lock b/rewatch/testrepo/yarn.lock index 7712ac2c52..153c6db527 100644 --- a/rewatch/testrepo/yarn.lock +++ b/rewatch/testrepo/yarn.lock @@ -12,6 +12,13 @@ __metadata: languageName: node linkType: hard +"@rescript/darwin-arm64@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "@rescript/darwin-arm64@npm:12.0.0-beta.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rescript/darwin-x64@npm:12.0.0-beta.1": version: 12.0.0-beta.1 resolution: "@rescript/darwin-x64@npm:12.0.0-beta.1" @@ -19,6 +26,13 @@ __metadata: languageName: node linkType: hard +"@rescript/darwin-x64@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "@rescript/darwin-x64@npm:12.0.0-beta.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rescript/linux-arm64@npm:12.0.0-beta.1": version: 12.0.0-beta.1 resolution: "@rescript/linux-arm64@npm:12.0.0-beta.1" @@ -26,6 +40,13 @@ __metadata: languageName: node linkType: hard +"@rescript/linux-arm64@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "@rescript/linux-arm64@npm:12.0.0-beta.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@rescript/linux-x64@npm:12.0.0-beta.1": version: 12.0.0-beta.1 resolution: "@rescript/linux-x64@npm:12.0.0-beta.1" @@ -33,6 +54,13 @@ __metadata: languageName: node linkType: hard +"@rescript/linux-x64@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "@rescript/linux-x64@npm:12.0.0-beta.3" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@rescript/webapi@npm:0.1.0-experimental-73e6a0d": version: 0.1.0-experimental-73e6a0d resolution: "@rescript/webapi@npm:0.1.0-experimental-73e6a0d" @@ -49,6 +77,13 @@ __metadata: languageName: node linkType: hard +"@rescript/win32-x64@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "@rescript/win32-x64@npm:12.0.0-beta.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@testrepo/compiled-by-legacy@npm:*, @testrepo/compiled-by-legacy@workspace:packages/compiled-by-legacy": version: 0.0.0-use.local resolution: "@testrepo/compiled-by-legacy@workspace:packages/compiled-by-legacy" @@ -108,6 +143,15 @@ __metadata: languageName: unknown linkType: soft +"@testrepo/nohoist@workspace:packages/nohoist": + version: 0.0.0-use.local + resolution: "@testrepo/nohoist@workspace:packages/nohoist" + dependencies: + rescript: "npm:12.0.0-beta.3" + rescript-bun: "npm:2.0.1" + languageName: unknown + linkType: soft + "@testrepo/nonexisting-dev-files@workspace:packages/nonexisting-dev-files": version: 0.0.0-use.local resolution: "@testrepo/nonexisting-dev-files@workspace:packages/nonexisting-dev-files" @@ -139,6 +183,15 @@ __metadata: languageName: unknown linkType: soft +"rescript-bun@npm:2.0.1": + version: 2.0.1 + resolution: "rescript-bun@npm:2.0.1" + peerDependencies: + rescript: 12.0.0-beta.3 + checksum: 10c0/97fedd71f2706dca0a13084c76cf0f61f7d910cf2e2dfb8dbe33e19d8ad8c5c67aeb25cdf7ab935264fb26e6dda911f1451a370fd7ae10766023c629810d0e36 + languageName: node + linkType: hard + "rescript-nodejs@npm:16.1.0": version: 16.1.0 resolution: "rescript-nodejs@npm:16.1.0" @@ -176,6 +229,36 @@ __metadata: languageName: node linkType: hard +"rescript@npm:12.0.0-beta.3": + version: 12.0.0-beta.3 + resolution: "rescript@npm:12.0.0-beta.3" + dependencies: + "@rescript/darwin-arm64": "npm:12.0.0-beta.3" + "@rescript/darwin-x64": "npm:12.0.0-beta.3" + "@rescript/linux-arm64": "npm:12.0.0-beta.3" + "@rescript/linux-x64": "npm:12.0.0-beta.3" + "@rescript/win32-x64": "npm:12.0.0-beta.3" + dependenciesMeta: + "@rescript/darwin-arm64": + optional: true + "@rescript/darwin-x64": + optional: true + "@rescript/linux-arm64": + optional: true + "@rescript/linux-x64": + optional: true + "@rescript/win32-x64": + optional: true + bin: + bsc: cli/bsc.js + bstracing: cli/bstracing.js + rescript: cli/rescript.js + rescript-legacy: cli/rescript-legacy.js + rescript-tools: cli/rescript-tools.js + checksum: 10c0/da264d99199f600dcaf78d8907b70200333dc1cc3a45a52f2fa2c72e2f5f393a8dedd01ebbcf46de94cbbe59a997a4685d6e20648739cd2234560cfb94cd7832 + languageName: node + linkType: hard + "sury-ppx@npm:^11.0.0-alpha.2": version: 11.0.0-alpha.2 resolution: "sury-ppx@npm:11.0.0-alpha.2" diff --git a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt index dcb7d2a84c..fcf2118183 100644 --- a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt +++ b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt @@ -1,4 +1,4 @@ -Cleaned 0/67 +Cleaned 0/115 Parsed 2 source files Compiled 2 modules diff --git a/rewatch/tests/snapshots/dependency-cycle.txt b/rewatch/tests/snapshots/dependency-cycle.txt index d188bae03b..2b90a0c8e2 100644 --- a/rewatch/tests/snapshots/dependency-cycle.txt +++ b/rewatch/tests/snapshots/dependency-cycle.txt @@ -1,4 +1,4 @@ -Cleaned 0/67 +Cleaned 0/115 Parsed 1 source files Compiled 0 modules diff --git a/rewatch/tests/snapshots/remove-file.txt b/rewatch/tests/snapshots/remove-file.txt index f29d684156..10f05cb95e 100644 --- a/rewatch/tests/snapshots/remove-file.txt +++ b/rewatch/tests/snapshots/remove-file.txt @@ -1,4 +1,4 @@ -Cleaned 1/67 +Cleaned 1/115 Parsed 0 source files Compiled 1 modules diff --git a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt index dbfd47cfa9..17dcaaf94c 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt @@ -1,4 +1,4 @@ -Cleaned 2/67 +Cleaned 2/115 Parsed 2 source files Compiled 3 modules diff --git a/rewatch/tests/snapshots/rename-file-internal-dep.txt b/rewatch/tests/snapshots/rename-file-internal-dep.txt index e2e6058d9d..bebcb52cfd 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep.txt @@ -1,4 +1,4 @@ -Cleaned 2/67 +Cleaned 2/115 Parsed 2 source files Compiled 2 modules diff --git a/rewatch/tests/snapshots/rename-file-with-interface.txt b/rewatch/tests/snapshots/rename-file-with-interface.txt index a5a1eba38b..3202fc9a0c 100644 --- a/rewatch/tests/snapshots/rename-file-with-interface.txt +++ b/rewatch/tests/snapshots/rename-file-with-interface.txt @@ -1,5 +1,5 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface.resi -Cleaned 2/67 +Cleaned 2/115 Parsed 1 source files Compiled 2 modules diff --git a/rewatch/tests/snapshots/rename-file.txt b/rewatch/tests/snapshots/rename-file.txt index 12816226ad..760b9fda3b 100644 --- a/rewatch/tests/snapshots/rename-file.txt +++ b/rewatch/tests/snapshots/rename-file.txt @@ -1,4 +1,4 @@ -Cleaned 1/67 +Cleaned 1/115 Parsed 1 source files Compiled 1 modules diff --git a/rewatch/tests/snapshots/rename-interface-file.txt b/rewatch/tests/snapshots/rename-interface-file.txt index c422225d07..621f151afb 100644 --- a/rewatch/tests/snapshots/rename-interface-file.txt +++ b/rewatch/tests/snapshots/rename-interface-file.txt @@ -1,5 +1,5 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface2.resi -Cleaned 1/67 +Cleaned 1/115 Parsed 1 source files Compiled 2 modules diff --git a/rewatch/tests/suffix.sh b/rewatch/tests/suffix.sh index 32450befea..bdbee8670d 100755 --- a/rewatch/tests/suffix.sh +++ b/rewatch/tests/suffix.sh @@ -31,7 +31,7 @@ fi # Count files with new extension file_count=$(find ./packages -name *.res.js | wc -l) -if [ "$file_count" -eq 38 ]; +if [ "$file_count" -eq 134 ]; then success "Found files with correct suffix" else