diff --git a/apps/remix-ide/src/app/files/fileManager.js b/apps/remix-ide/src/app/files/fileManager.js index 1da55cf8c4..4ef7b71587 100644 --- a/apps/remix-ide/src/app/files/fileManager.js +++ b/apps/remix-ide/src/app/files/fileManager.js @@ -22,7 +22,7 @@ const profile = { icon: 'assets/img/fileManager.webp', permission: true, version: packageJson.version, - methods: ['file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName'], + methods: ['file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath'], kind: 'file-system' } const errorMsg = { @@ -171,7 +171,7 @@ class FileManager extends Plugin { try { path = this.limitPluginScope(path) try { - path = this._resolveFromExternalPath(path).file || path + path = this.getPathFromUrl(path).file } catch (e) { return console.error(e) } @@ -544,13 +544,13 @@ class FileManager extends Plugin { } /** - * Try to resolve the given file path. + * Try to resolve the given file path (the actual path in the file system) * e.g if it's specified a github link, npm library, or any external content, - * it returns the actual path where the content can be find. - * @param {string} file path we are trying to resolve + * it returns the actual path where the content can be found. + * @param {string} file url we are trying to resolve * @returns {{ string, provider }} file path resolved and its provider. */ - _resolveFromExternalPath (file) { + getPathFromUrl (file) { const provider = this.fileProviderOf(file) if (!provider) throw new Error(`no provider for ${file}`) return { @@ -559,6 +559,20 @@ class FileManager extends Plugin { } } + /** + * Try to resolve the given file URl. opposite of getPathFromUrl * + * @param {string} file path we are trying to resolve + * @returns {{ string, provider }} file url resolved and its provider. + */ + getUrlFromPath (file) { + const provider = this.fileProviderOf(file) + if (!provider) throw new Error(`no provider for ${file}`) + return { + file: provider.getUrlFromPath(file) || file, // in case an external URL is given as input, we resolve it to the right internal path + provider + } + } + removeTabsOf (provider) { for (var tab in this.openedFiles) { if (this.fileProviderOf(tab).type === provider.type) { @@ -592,7 +606,7 @@ class FileManager extends Plugin { this.saveCurrentFile() let resolved try { - resolved = this._resolveFromExternalPath(file) + resolved = this.getPathFromUrl(file) file = resolved.file } catch (e) { return console.error(e) diff --git a/apps/remix-ide/src/app/files/fileProvider.js b/apps/remix-ide/src/app/files/fileProvider.js index 57e21d2eab..41e1a5ccfe 100644 --- a/apps/remix-ide/src/app/files/fileProvider.js +++ b/apps/remix-ide/src/app/files/fileProvider.js @@ -39,6 +39,11 @@ class FileProvider { return this.providerExternalsStorage.get(this.reverseKey + url) } + getUrlFromPath (path) { + if (!path.startsWith(this.type)) path = this.type + '/' + path + return this.providerExternalsStorage.get(path) + } + isExternalFolder (path) { return this.externalFolders.includes(path) }