From e78fbfd1f051ccdd299eb95e8af66c74c509d2b9 Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 17:37:13 +0100 Subject: [PATCH 1/3] Update namespace argument --- src/config.rs | 32 ++++++++++++++++++- testrepo/package.json | 3 +- .../packages/namespace-casing/package.json | 12 +++++++ .../packages/namespace-casing/rescript.json | 22 +++++++++++++ .../packages/namespace-casing/src/Consume.res | 1 + .../packages/namespace-casing/src/Produce.res | 3 ++ 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 testrepo/packages/namespace-casing/package.json create mode 100644 testrepo/packages/namespace-casing/rescript.json create mode 100644 testrepo/packages/namespace-casing/src/Consume.res create mode 100644 testrepo/packages/namespace-casing/src/Produce.res diff --git a/src/config.rs b/src/config.rs index c575b90..1604f82 100644 --- a/src/config.rs +++ b/src/config.rs @@ -295,6 +295,35 @@ fn namespace_from_package_name(package_name: &str) -> String { } impl Config { + fn namespace_of_package_name(s: &str) -> String { + let len = s.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(s, true, &mut buf, 0); + buf + } + pub fn get_namespace(&self) -> packages::Namespace { let namespace_from_package = namespace_from_package_name(&self.name); match (self.namespace.as_ref(), self.namespace_entry.as_ref()) { @@ -312,7 +341,8 @@ 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(Self::namespace_of_package_name(namespace)), + // namespace.to_string().to_case(Case::Pascal)), }, (Some(self::NamespaceConfig::String(str)), Some(entry)) => match str.as_str() { "true" => packages::Namespace::NamespaceWithEntry { diff --git a/testrepo/package.json b/testrepo/package.json index ae81646..e9802c0 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/package.json b/testrepo/packages/namespace-casing/package.json new file mode 100644 index 0000000..65b2411 --- /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/rescript.json b/testrepo/packages/namespace-casing/rescript.json new file mode 100644 index 0000000..243f7f6 --- /dev/null +++ b/testrepo/packages/namespace-casing/rescript.json @@ -0,0 +1,22 @@ +{ + "name": "namespace-casing", + "namespace": "NamespaceCasingAPI", + "sources": [ + { + "dir": "src", + "subdirs": true + } + ], + "package-specs": [ + { + "module": "esmodule", + "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/src/Consume.res b/testrepo/packages/namespace-casing/src/Consume.res new file mode 100644 index 0000000..eb27cb2 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Consume.res @@ -0,0 +1 @@ +let x = Sample.meh(1) \ No newline at end of file diff --git a/testrepo/packages/namespace-casing/src/Produce.res b/testrepo/packages/namespace-casing/src/Produce.res new file mode 100644 index 0000000..cba1a66 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Produce.res @@ -0,0 +1,3 @@ +let meh = (a: int) => { + true +} \ No newline at end of file From e67ae17c248e8a651b5e1c9020d436c4d759b83d Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 17:42:53 +0100 Subject: [PATCH 2/3] Produce code with new sample --- .../namespace-casing/{rescript.json => bsconfig.json} | 2 +- testrepo/packages/namespace-casing/src/Consume.mjs | 10 ++++++++++ testrepo/packages/namespace-casing/src/Consume.res | 2 +- testrepo/packages/namespace-casing/src/Produce.mjs | 11 +++++++++++ tests/snapshots/dependency-cycle.txt | 2 +- tests/snapshots/remove-file.txt | 2 +- tests/snapshots/rename-file-with-interface.txt | 2 +- tests/snapshots/rename-interface-file.txt | 2 +- 8 files changed, 27 insertions(+), 6 deletions(-) rename testrepo/packages/namespace-casing/{rescript.json => bsconfig.json} (91%) create mode 100644 testrepo/packages/namespace-casing/src/Consume.mjs create mode 100644 testrepo/packages/namespace-casing/src/Produce.mjs diff --git a/testrepo/packages/namespace-casing/rescript.json b/testrepo/packages/namespace-casing/bsconfig.json similarity index 91% rename from testrepo/packages/namespace-casing/rescript.json rename to testrepo/packages/namespace-casing/bsconfig.json index 243f7f6..bc74c18 100644 --- a/testrepo/packages/namespace-casing/rescript.json +++ b/testrepo/packages/namespace-casing/bsconfig.json @@ -9,7 +9,7 @@ ], "package-specs": [ { - "module": "esmodule", + "module": "es6", "in-source": true } ], diff --git a/testrepo/packages/namespace-casing/src/Consume.mjs b/testrepo/packages/namespace-casing/src/Consume.mjs new file mode 100644 index 0000000..c89a31a --- /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 index eb27cb2..e2d9a26 100644 --- a/testrepo/packages/namespace-casing/src/Consume.res +++ b/testrepo/packages/namespace-casing/src/Consume.res @@ -1 +1 @@ -let x = Sample.meh(1) \ No newline at end of file +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 0000000..78a43f1 --- /dev/null +++ b/testrepo/packages/namespace-casing/src/Produce.mjs @@ -0,0 +1,11 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +function meh(a) { + return true; +} + +export { + meh , +} +/* No side effect */ diff --git a/tests/snapshots/dependency-cycle.txt b/tests/snapshots/dependency-cycle.txt index b30824a..a6a30ad 100644 --- a/tests/snapshots/dependency-cycle.txt +++ b/tests/snapshots/dependency-cycle.txt @@ -8,7 +8,7 @@  [4/7] 🧹 Cleaned 0/11 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 + [7/7] ️🛑 Compiled 1 modules in 0.00s ERROR: Can't continue... Found a circular dependency in your code: diff --git a/tests/snapshots/remove-file.txt b/tests/snapshots/remove-file.txt index 344d8d3..b363781 100644 --- a/tests/snapshots/remove-file.txt +++ b/tests/snapshots/remove-file.txt @@ -8,7 +8,7 @@  [4/7] 🧹 Cleaned 1/11 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 + [7/7] ️🛑 Compiled 2 modules in 0.00s ERROR: We've found a bug for you! diff --git a/tests/snapshots/rename-file-with-interface.txt b/tests/snapshots/rename-file-with-interface.txt index 9927321..6688b6e 100644 --- a/tests/snapshots/rename-file-with-interface.txt +++ b/tests/snapshots/rename-file-with-interface.txt @@ -10,6 +10,6 @@ WARN:  [4/7] 🧹 Cleaned 2/11 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 + [7/7] ⚔️ Compiled 2 modules in 0.00s  ✨ Finished Compilation in 0.00s diff --git a/tests/snapshots/rename-interface-file.txt b/tests/snapshots/rename-interface-file.txt index 50dcd91..a292ef6 100644 --- a/tests/snapshots/rename-interface-file.txt +++ b/tests/snapshots/rename-interface-file.txt @@ -10,6 +10,6 @@ WARN:  [4/7] 🧹 Cleaned 1/11 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 + [7/7] ⚔️ Compiled 2 modules in 0.00s  ✨ Finished Compilation in 0.00s From 29f903371a270d775d3cc57223b9560f80ae4adc Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 18:18:05 +0100 Subject: [PATCH 3/3] Change original namespace_from_package_name --- src/config.rs | 57 ++++++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/src/config.rs b/src/config.rs index 1604f82..8bb2cb6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -287,43 +287,35 @@ 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; + } -impl Config { - fn namespace_of_package_name(s: &str) -> String { - let len = s.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); } - - 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(s, true, buf, off + 1); + } + _ => { + aux(s, capital, buf, off + 1); } } - - aux(s, true, &mut buf, 0); - buf } + aux(package_name, true, &mut buf, 0); + buf +} + +impl Config { pub fn get_namespace(&self) -> packages::Namespace { let namespace_from_package = namespace_from_package_name(&self.name); match (self.namespace.as_ref(), self.namespace_entry.as_ref()) { @@ -341,8 +333,7 @@ impl Config { namespace if namespace.is_case(Case::UpperFlat) => { packages::Namespace::Namespace(namespace.to_string()) } - namespace => packages::Namespace::Namespace(Self::namespace_of_package_name(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 {