diff --git a/package.json b/package.json index 1c6137c8..374a2611 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,6 @@ "/rewatch-linux-arm64", "/rewatch-macos", "/rewatch-windows.exe" - ] + ], + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/src/config.rs b/src/config.rs index c575b90e..8bb2cb64 100644 --- a/src/config.rs +++ b/src/config.rs @@ -287,11 +287,32 @@ fn check_if_rescript11_or_higher(version: &str) -> Result { } fn namespace_from_package_name(package_name: &str) -> String { - package_name - .to_owned() - .replace('@', "") - .replace('/', "_") - .to_case(Case::Pascal) + let len = package_name.len(); + let mut buf = String::with_capacity(len); + + fn aux(s: &str, capital: bool, buf: &mut String, off: usize) { + if off >= s.len() { + return; + } + + let ch = s.as_bytes()[off] as char; + match ch { + 'a'..='z' | 'A'..='Z' | '0'..='9' | '_' => { + let new_capital = false; + buf.push(if capital { ch.to_ascii_uppercase() } else { ch }); + aux(s, new_capital, buf, off + 1); + } + '/' | '-' => { + aux(s, true, buf, off + 1); + } + _ => { + aux(s, capital, buf, off + 1); + } + } + } + + aux(package_name, true, &mut buf, 0); + buf } impl Config { @@ -312,7 +333,7 @@ impl Config { namespace if namespace.is_case(Case::UpperFlat) => { packages::Namespace::Namespace(namespace.to_string()) } - namespace => packages::Namespace::Namespace(namespace.to_string().to_case(Case::Pascal)), + namespace => packages::Namespace::Namespace(namespace_from_package_name(namespace)), }, (Some(self::NamespaceConfig::String(str)), Some(entry)) => match str.as_str() { "true" => packages::Namespace::NamespaceWithEntry { diff --git a/testrepo/bsconfig.json b/testrepo/bsconfig.json index 53fc8462..6a23b8d4 100644 --- a/testrepo/bsconfig.json +++ b/testrepo/bsconfig.json @@ -18,13 +18,16 @@ "@testrepo/main", "@testrepo/dep01", "@testrepo/dep02", - "@testrepo/new-namespace" + "@testrepo/new-namespace", + "@testrepo/namespace-casing" + ], "bs-dependencies": [ "@testrepo/main", "@testrepo/dep01", "@testrepo/dep02", - "@testrepo/new-namespace" + "@testrepo/new-namespace", + "@testrepo/namespace-casing" ], "reason": { "react-jsx": 3 diff --git a/testrepo/package.json b/testrepo/package.json index ae816464..e9802c0f 100644 --- a/testrepo/package.json +++ b/testrepo/package.json @@ -6,7 +6,8 @@ "packages/main", "packages/dep01", "packages/dep02", - "packages/new-namespace" + "packages/new-namespace", + "packages/namespace-casing" ] }, "scripts": { diff --git a/testrepo/packages/namespace-casing/bsconfig.json b/testrepo/packages/namespace-casing/bsconfig.json new file mode 100644 index 00000000..000bbfdc --- /dev/null +++ b/testrepo/packages/namespace-casing/bsconfig.json @@ -0,0 +1,22 @@ +{ + "name": "@testrepo/namespace-casing", + "namespace": "NamespaceCasingAPI", + "sources": [ + { + "dir": "src", + "subdirs": true + } + ], + "package-specs": [ + { + "module": "es6", + "in-source": true + } + ], + "suffix": ".mjs", + "bs-dependencies": [], + "bsc-flags": [], + "jsx": { + "version": 4 + } +} \ No newline at end of file diff --git a/testrepo/packages/namespace-casing/package.json b/testrepo/packages/namespace-casing/package.json new file mode 100644 index 00000000..65b24114 --- /dev/null +++ b/testrepo/packages/namespace-casing/package.json @@ -0,0 +1,12 @@ +{ + "name": "@testrepo/namespace-casing", + "version": "0.0.1", + "keywords": [ + "rescript" + ], + "author": "", + "license": "MIT", + "dependencies": { + "rescript": "*" + } +} diff --git a/testrepo/packages/namespace-casing/src/Consume.mjs b/testrepo/packages/namespace-casing/src/Consume.mjs new file mode 100644 index 00000000..c89a31a8 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Consume.mjs @@ -0,0 +1,10 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Produce$NamespaceCasingAPI from "./Produce.mjs"; + +var x = Produce$NamespaceCasingAPI.meh(1); + +export { + x , +} +/* x Not a pure module */ diff --git a/testrepo/packages/namespace-casing/src/Consume.res b/testrepo/packages/namespace-casing/src/Consume.res new file mode 100644 index 00000000..e2d9a264 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Consume.res @@ -0,0 +1 @@ +let x = Produce.meh(1) \ No newline at end of file diff --git a/testrepo/packages/namespace-casing/src/Produce.mjs b/testrepo/packages/namespace-casing/src/Produce.mjs new file mode 100644 index 00000000..b740c393 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Produce.mjs @@ -0,0 +1,11 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +function meh(param) { + return true; +} + +export { + meh , +} +/* No side effect */ diff --git a/testrepo/packages/namespace-casing/src/Produce.res b/testrepo/packages/namespace-casing/src/Produce.res new file mode 100644 index 00000000..194a02d4 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Produce.res @@ -0,0 +1,3 @@ +let meh = (_: int) => { + true +} \ No newline at end of file diff --git a/testrepo/yarn.lock b/testrepo/yarn.lock index 2a3f684a..9f859581 100644 --- a/testrepo/yarn.lock +++ b/testrepo/yarn.lock @@ -4,5 +4,5 @@ rescript@*: version "11.0.0" - resolved "https://registry.yarnpkg.com/rescript/-/rescript-11.0.0.tgz#9a0b6fc998c360543c459aba49b77a572a0306cd" + resolved "https://registry.npmjs.org/rescript/-/rescript-11.0.0.tgz" integrity sha512-uIUwDZZmDUb7ymGkBiiGioxMg8hXh1mze/2k/qhYQcZGgi7PrLHQIW9AksM7gb9WnpjCAvFsA8U2VgC0nA468w== diff --git a/tests/snapshots/dependency-cycle.txt b/tests/snapshots/dependency-cycle.txt index 3d80f6bf..2ff57f31 100644 --- a/tests/snapshots/dependency-cycle.txt +++ b/tests/snapshots/dependency-cycle.txt @@ -1,7 +1,7 @@ [1/7] ๐Ÿ“ฆ Building package tree... [1/7] ๐Ÿ“ฆ Built package tree in 0.00s [2/7] ๐Ÿ‘€ Finding source files... [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 0/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 0/13 0.00s  [5/7] ๐Ÿงฑ Parsed 1 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] โŒ Compiled 0 modules in 0.00s diff --git a/tests/snapshots/remove-file.txt b/tests/snapshots/remove-file.txt index 9ecdcc32..71baf8f9 100644 --- a/tests/snapshots/remove-file.txt +++ b/tests/snapshots/remove-file.txt @@ -1,7 +1,7 @@ [1/7] ๐Ÿ“ฆ Building package tree... [1/7] ๐Ÿ“ฆ Built package tree in 0.00s [2/7] ๐Ÿ‘€ Finding source files... [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/13 0.00s  [5/7] ๐Ÿงฑ Parsed 0 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] โŒ Compiled 1 modules in 0.00s diff --git a/tests/snapshots/rename-file-internal-dep-namespace.txt b/tests/snapshots/rename-file-internal-dep-namespace.txt index 6b0c05a0..02ac93fb 100644 --- a/tests/snapshots/rename-file-internal-dep-namespace.txt +++ b/tests/snapshots/rename-file-internal-dep-namespace.txt @@ -1,7 +1,7 @@ [1/7] ๐Ÿ“ฆ Building package tree... [1/7] ๐Ÿ“ฆ Built package tree in 0.00s [2/7] ๐Ÿ‘€ Finding source files... [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/13 0.00s  [5/7] ๐Ÿงฑ Parsed 2 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] โŒ Compiled 3 modules in 0.00s diff --git a/tests/snapshots/rename-file-internal-dep.txt b/tests/snapshots/rename-file-internal-dep.txt index e8bb0f77..4332689b 100644 --- a/tests/snapshots/rename-file-internal-dep.txt +++ b/tests/snapshots/rename-file-internal-dep.txt @@ -1,7 +1,7 @@ [1/7] ๐Ÿ“ฆ Building package tree... [1/7] ๐Ÿ“ฆ Built package tree in 0.00s [2/7] ๐Ÿ‘€ Finding source files... [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/13 0.00s  [5/7] ๐Ÿงฑ Parsed 2 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] โŒ Compiled 2 modules in 0.00s diff --git a/tests/snapshots/rename-file-with-interface.txt b/tests/snapshots/rename-file-with-interface.txt index 5ebe1076..27ad665b 100644 --- a/tests/snapshots/rename-file-with-interface.txt +++ b/tests/snapshots/rename-file-with-interface.txt @@ -3,7 +3,7 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface.resi  [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 2/13 0.00s  [5/7] ๐Ÿงฑ Parsed 1 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] ๐Ÿคบ Compiled 2 modules in 0.00s diff --git a/tests/snapshots/rename-file.txt b/tests/snapshots/rename-file.txt index d3a0ab56..3e4c0759 100644 --- a/tests/snapshots/rename-file.txt +++ b/tests/snapshots/rename-file.txt @@ -1,7 +1,7 @@ [1/7] ๐Ÿ“ฆ Building package tree... [1/7] ๐Ÿ“ฆ Built package tree in 0.00s [2/7] ๐Ÿ‘€ Finding source files... [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/13 0.00s  [5/7] ๐Ÿงฑ Parsed 1 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] ๐Ÿคบ Compiled 1 modules in 0.00s diff --git a/tests/snapshots/rename-interface-file.txt b/tests/snapshots/rename-interface-file.txt index a51a6de4..7c3b8c0b 100644 --- a/tests/snapshots/rename-interface-file.txt +++ b/tests/snapshots/rename-interface-file.txt @@ -3,7 +3,7 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface2.resi  [2/7] ๐Ÿ‘€ Found source files in 0.00s [3/7] ๐Ÿ“ Reading compile state... [3/7] ๐Ÿ“ Read compile state 0.00s -[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/11 0.00s +[4/7] ๐Ÿงน Cleaning up previous build... [4/7] ๐Ÿงน Cleaned 1/13 0.00s  [5/7] ๐Ÿงฑ Parsed 1 source files in 0.00s  [6/7] ๐ŸŒด Collected deps in 0.00s  [7/7] ๐Ÿคบ Compiled 2 modules in 0.00s diff --git a/tests/suffix.sh b/tests/suffix.sh index aa9cddf5..ea072965 100755 --- a/tests/suffix.sh +++ b/tests/suffix.sh @@ -27,11 +27,11 @@ fi # Count files with new extension file_count=$(find . -name *.res.js | wc -l) -if [ "$file_count" -eq 20 ]; +if [ "$file_count" -eq 24 ]; then success "Found files with correct suffix" else - error "Suffix not correctly used" + error "Suffix not correctly used, got $file_count files" exit 1 fi