Skip to content

Commit

Permalink
fix(core/path): remove suffix in basename only once (#9165)
Browse files Browse the repository at this point in the history
* fix(core/path): remove suffix in `basename` only once

closes #9064

* Update tooling/api/src/path.ts

* remove extra assert

---------

Co-authored-by: Lucas Fernandes Nogueira <lucas@tauri.app>
  • Loading branch information
amrbashir and lucasfernog authored Mar 18, 2024
1 parent ea0242d commit 379cc2b
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 21 deletions.
6 changes: 6 additions & 0 deletions .changes/core-path-basename-replace.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'tauri': 'patch:bug'
'@tauri-apps/api': patch:bug
---

Fix `basename(path, 'ext')` JS API when removing all occurances of `ext` where it should only remove the last one.
58 changes: 48 additions & 10 deletions core/tauri/src/path/plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,16 +179,17 @@ pub fn extname(path: String) -> Result<String> {
}

#[command(root = "crate")]
pub fn basename(path: String, ext: Option<String>) -> Result<String> {
match Path::new(&path)
.file_name()
.and_then(std::ffi::OsStr::to_str)
{
Some(p) => Ok(if let Some(ext) = ext {
p.replace(ext.as_str(), "")
} else {
p.to_string()
}),
pub fn basename(path: &str, ext: Option<&str>) -> Result<String> {
let file_name = Path::new(path).file_name().map(|f| f.to_string_lossy());
match file_name {
Some(p) => {
let maybe_stripped = if let Some(ext) = ext {
p.strip_suffix(ext).unwrap_or(&p).to_string()
} else {
p.to_string()
};
Ok(maybe_stripped)
}
None => Err(Error::NoBasename),
}
}
Expand Down Expand Up @@ -245,3 +246,40 @@ pub(crate) fn init<R: Runtime>() -> TauriPlugin<R> {
})
.build()
}

#[cfg(test)]
mod tests {

#[test]
fn basename() {
let path = "/path/to/some-json-file.json";
assert_eq!(
super::basename(path, Some(".json")).unwrap(),
"some-json-file"
);

let path = "/path/to/some-json-file.json";
assert_eq!(
super::basename(path, Some("json")).unwrap(),
"some-json-file."
);

let path = "/path/to/some-json-file.html.json";
assert_eq!(
super::basename(path, Some(".json")).unwrap(),
"some-json-file.html"
);

let path = "/path/to/some-json-file.json.json";
assert_eq!(
super::basename(path, Some(".json")).unwrap(),
"some-json-file.json"
);

let path = "/path/to/some-json-file.json.html";
assert_eq!(
super::basename(path, Some(".json")).unwrap(),
"some-json-file.json.html"
);
}
}
19 changes: 8 additions & 11 deletions tooling/api/src/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,9 +609,9 @@ async function join(...paths: string[]): Promise<string> {
* Returns the directory name of a `path`. Trailing directory separators are ignored.
* @example
* ```typescript
* import { dirname, appDataDir } from '@tauri-apps/api/path';
* const appDataDirPath = await appDataDir();
* const dir = await dirname(appDataDirPath);
* import { dirname } from '@tauri-apps/api/path';
* const dir = await dirname('/path/to/somedir/');
* assert(dir === 'somedir');
* ```
*
* @since 1.0.0
Expand All @@ -624,10 +624,9 @@ async function dirname(path: string): Promise<string> {
* Returns the extension of the `path`.
* @example
* ```typescript
* import { extname, resolveResource } from '@tauri-apps/api/path';
* const resourcePath = await resolveResource('app.conf');
* const ext = await extname(resourcePath);
* assert(ext === 'conf');
* import { extname } from '@tauri-apps/api/path';
* const ext = await extname('/path/to/file.html');
* assert(ext === 'html');
* ```
*
* @since 1.0.0
Expand All @@ -640,12 +639,10 @@ async function extname(path: string): Promise<string> {
* Returns the last portion of a `path`. Trailing directory separators are ignored.
* @example
* ```typescript
* import { basename, resolveResource } from '@tauri-apps/api/path';
* const resourcePath = await resolveResource('app.conf');
* const base = await basename(resourcePath);
* import { basename } from '@tauri-apps/api/path';
* const base = await basename('path/to/app.conf');
* assert(base === 'app.conf');
* ```
*
* @param ext An optional file extension to be removed from the returned path.
*
* @since 1.0.0
Expand Down

0 comments on commit 379cc2b

Please sign in to comment.