Browse Source

fix(core/path): remove suffix in basename only once (#9166)

* fix(core/path): remove suffix in basename only once

ref: #9064

* Update tooling/api/src/path.ts

---------

Co-authored-by: Lucas Fernandes Nogueira <lucas@tauri.app>
Amr Bashir 1 năm trước cách đây
mục cha
commit
e3b6d38d26

+ 6 - 0
.changes/core-path-basename-replace.md

@@ -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.

+ 11 - 9
core/tauri/src/endpoints/path.rs

@@ -150,15 +150,17 @@ impl Cmd {
     path: String,
     ext: Option<String>,
   ) -> super::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()
-      }),
+    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(crate::error::into_anyhow(crate::api::Error::Path(
         "Couldn't get the basename".into(),
       ))),

+ 8 - 10
tooling/api/src/path.ts

@@ -726,9 +726,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
@@ -747,10 +747,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
@@ -769,9 +768,8 @@ 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');
  * ```
  *