From 8aa48f7a53f7e126de8ea8666ef3dd429abdac69 Mon Sep 17 00:00:00 2001 From: Ailton Loures Date: Fri, 6 Dec 2024 19:20:06 -0300 Subject: [PATCH 1/3] feat: adding wsl integration --- package.json | 2 +- src/core/index.js | 1 - src/core/vscode.js | 9 +++++ src/core/wsl.js | 17 ++++++++ src/data/store/bookmark.js | 3 +- src/{modules => electron}/index.js | 0 src/{modules => electron}/menu.js | 0 src/{modules => electron}/tray.js | 0 src/{modules => electron}/utils/dialog.js | 0 src/{modules => electron}/utils/icon.js | 0 src/{modules => electron}/utils/index.js | 0 src/{modules => electron}/utils/label.js | 0 src/{modules => electron}/utils/vite.js | 0 src/{modules => electron}/window.js | 0 src/main.js | 47 +++++++++++++++++------ 15 files changed, 65 insertions(+), 14 deletions(-) delete mode 100644 src/core/index.js create mode 100644 src/core/vscode.js create mode 100644 src/core/wsl.js rename src/{modules => electron}/index.js (100%) rename src/{modules => electron}/menu.js (100%) rename src/{modules => electron}/tray.js (100%) rename src/{modules => electron}/utils/dialog.js (100%) rename src/{modules => electron}/utils/icon.js (100%) rename src/{modules => electron}/utils/index.js (100%) rename src/{modules => electron}/utils/label.js (100%) rename src/{modules => electron}/utils/vite.js (100%) rename src/{modules => electron}/window.js (100%) diff --git a/package.json b/package.json index 8f1ba10..19ea8c1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-bookmark", "productName": "VSCode Bookmark", "description": "A utility to save your favorite projects and open them easily in vscode.", - "version": "1.2.3", + "version": "1.3.0-beta", "author": "Ailton Loures", "homepage": "https://github.com/ailtonloures/vscode-bookmark#readme", "repository": { diff --git a/src/core/index.js b/src/core/index.js deleted file mode 100644 index 2376f0c..0000000 --- a/src/core/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './setup'; diff --git a/src/core/vscode.js b/src/core/vscode.js new file mode 100644 index 0000000..70806de --- /dev/null +++ b/src/core/vscode.js @@ -0,0 +1,9 @@ +import { spawn } from 'node:child_process'; + +function openIntoVsCode(path, extraArgs = []) { + const commandArgs = [...extraArgs, `"${path}"`]; + + spawn('code', commandArgs, { shell: true }); +} + +export { openIntoVsCode }; diff --git a/src/core/wsl.js b/src/core/wsl.js new file mode 100644 index 0000000..e819f12 --- /dev/null +++ b/src/core/wsl.js @@ -0,0 +1,17 @@ +function wslBookmarkDataAdapter(path) { + const sanitizedPath = String(path) + .replaceAll('\\', '/') + .replace('.localhost/', '+'); + const filePath = `vscode-remote:${sanitizedPath}`; + + return { + filePath, + wsl: true, + }; +} + +function filePathIsFromWsl(path) { + return String(path).includes('wsl'); +} + +export { wslBookmarkDataAdapter, filePathIsFromWsl }; diff --git a/src/data/store/bookmark.js b/src/data/store/bookmark.js index c995478..5ad61a7 100644 --- a/src/data/store/bookmark.js +++ b/src/data/store/bookmark.js @@ -4,7 +4,7 @@ import store from './store'; const storeName = 'bookmarks'; -function createBookmark(filePath) { +function createBookmark({ filePath, wsl = false }) { const bookmarkList = getBookmarks(); store.set(storeName, [ @@ -12,6 +12,7 @@ function createBookmark(filePath) { path: filePath, basename: basename(filePath), id: new Date().getTime(), + wsl, }, ...bookmarkList, ]); diff --git a/src/modules/index.js b/src/electron/index.js similarity index 100% rename from src/modules/index.js rename to src/electron/index.js diff --git a/src/modules/menu.js b/src/electron/menu.js similarity index 100% rename from src/modules/menu.js rename to src/electron/menu.js diff --git a/src/modules/tray.js b/src/electron/tray.js similarity index 100% rename from src/modules/tray.js rename to src/electron/tray.js diff --git a/src/modules/utils/dialog.js b/src/electron/utils/dialog.js similarity index 100% rename from src/modules/utils/dialog.js rename to src/electron/utils/dialog.js diff --git a/src/modules/utils/icon.js b/src/electron/utils/icon.js similarity index 100% rename from src/modules/utils/icon.js rename to src/electron/utils/icon.js diff --git a/src/modules/utils/index.js b/src/electron/utils/index.js similarity index 100% rename from src/modules/utils/index.js rename to src/electron/utils/index.js diff --git a/src/modules/utils/label.js b/src/electron/utils/label.js similarity index 100% rename from src/modules/utils/label.js rename to src/electron/utils/label.js diff --git a/src/modules/utils/vite.js b/src/electron/utils/vite.js similarity index 100% rename from src/modules/utils/vite.js rename to src/electron/utils/vite.js diff --git a/src/modules/window.js b/src/electron/window.js similarity index 100% rename from src/modules/window.js rename to src/electron/window.js diff --git a/src/main.js b/src/main.js index 35d9a5a..17ae93a 100644 --- a/src/main.js +++ b/src/main.js @@ -1,16 +1,16 @@ -import { spawn } from 'node:child_process'; - import * as Sentry from '@sentry/electron'; import { app, ipcMain } from 'electron'; -import { makeAppToInitOnASingleInstance } from './core'; +import { makeAppToInitOnASingleInstance } from './core/setup'; +import { openIntoVsCode } from './core/vscode'; +import { filePathIsFromWsl, wslBookmarkDataAdapter } from './core/wsl'; import { createBookmark, deleteBookmark, getBookmarks, } from './data/store/bookmark'; -import { createMenu, createTray, createWindow } from './modules'; -import { openDialog } from './modules/utils'; +import { createMenu, createTray, createWindow } from './electron'; +import { openDialog } from './electron/utils'; Sentry.init({ dsn: 'https://713782327975276ae010040b1db6ab8a@o4507887084503040.ingest.us.sentry.io/4507887098724352', @@ -41,7 +41,9 @@ function createAppContext() { function registerIpcMainEvents(context) { ipcMain.on('create-bookmark', (event, filePath) => { - createBookmark(filePath); + const filePathData = getBookmarkDataFromFilePath(filePath); + + createBookmark(filePathData); renderApp(context); event.reply('create-bookmark', true); @@ -79,26 +81,28 @@ function renderApp(context) { if (!filePaths) return; - createBookmark(filePaths.at(0)); + const filePathData = getBookmarkDataFromFilePath(filePaths.at(0)); + + createBookmark(filePathData); renderApp(context); }, }); const separatorMenuItem = { type: 'separator' }; - const bookmarkMenuItems = getBookmarks().map(({ basename, path, id }) => ({ - label: basename, + const bookmarkMenuItems = getBookmarks().map((bookmarkData) => ({ + label: getBasenameFromBookmarkData(bookmarkData), submenu: [ { label: 'Open', click: () => { - spawn('code', [path], { shell: true }); + openBookmarkIntoVsCode(bookmarkData); }, }, { label: 'Remove', click: () => { - deleteBookmark(id); + deleteBookmark(bookmarkData.id); renderApp(context); }, }, @@ -126,3 +130,24 @@ function renderApp(context) { tray.setContextMenu(contextMenu); } + +function getBookmarkDataFromFilePath(filePath) { + if (filePathIsFromWsl(filePath)) return wslBookmarkDataAdapter(filePath); + + return { filePath }; +} + +function getBasenameFromBookmarkData(bookmarkData) { + if (bookmarkData.wsl) return `[WSL] ${bookmarkData.basename}`; + + return bookmarkData.basename; +} + +function openBookmarkIntoVsCode(bookmarkData) { + if (bookmarkData.wsl) { + openIntoVsCode(bookmarkData.path, ['--folder-uri']); + return; + } + + openIntoVsCode(bookmarkData.path); +} From ab989f28ab29dcc4ef5e3f4b6d8dee78506bf272 Mon Sep 17 00:00:00 2001 From: Ailton Loures Date: Sat, 7 Dec 2024 17:18:58 -0300 Subject: [PATCH 2/3] fix: fixing wsl integration files --- forge.config.js | 2 +- package.json | 2 +- src/core/wsl.js | 6 +++--- src/data/store/bookmark.js | 22 ++++++++++------------ src/electron/utils/index.js | 1 + src/electron/utils/platform.js | 5 +++++ src/main.js | 17 ++++++++++------- 7 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 src/electron/utils/platform.js diff --git a/forge.config.js b/forge.config.js index c8a5ba6..050faaf 100644 --- a/forge.config.js +++ b/forge.config.js @@ -1,6 +1,6 @@ +const { FuseV1Options, FuseVersion } = require('@electron/fuses'); const { FusesPlugin } = require('@electron-forge/plugin-fuses'); const { VitePlugin } = require('@electron-forge/plugin-vite'); -const { FuseV1Options, FuseVersion } = require('@electron/fuses'); const { name: projectName, diff --git a/package.json b/package.json index 19ea8c1..b54ae47 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-bookmark", "productName": "VSCode Bookmark", "description": "A utility to save your favorite projects and open them easily in vscode.", - "version": "1.3.0-beta", + "version": "1.3.0", "author": "Ailton Loures", "homepage": "https://github.com/ailtonloures/vscode-bookmark#readme", "repository": { diff --git a/src/core/wsl.js b/src/core/wsl.js index e819f12..f8e7f80 100644 --- a/src/core/wsl.js +++ b/src/core/wsl.js @@ -10,8 +10,8 @@ function wslBookmarkDataAdapter(path) { }; } -function filePathIsFromWsl(path) { - return String(path).includes('wsl'); +function isFilePathFromWsl(path) { + return String(path).startsWith('\\\\wsl'); } -export { wslBookmarkDataAdapter, filePathIsFromWsl }; +export { wslBookmarkDataAdapter, isFilePathFromWsl }; diff --git a/src/data/store/bookmark.js b/src/data/store/bookmark.js index 5ad61a7..9ba3231 100644 --- a/src/data/store/bookmark.js +++ b/src/data/store/bookmark.js @@ -6,16 +6,14 @@ const storeName = 'bookmarks'; function createBookmark({ filePath, wsl = false }) { const bookmarkList = getBookmarks(); - - store.set(storeName, [ - { - path: filePath, - basename: basename(filePath), - id: new Date().getTime(), - wsl, - }, - ...bookmarkList, - ]); + const bookmarkData = { + path: filePath, + basename: basename(filePath), + id: new Date().getTime(), + wsl, + }; + + store.set(storeName, [bookmarkData, ...bookmarkList]); } function getBookmarks(limit = 10) { @@ -23,7 +21,7 @@ function getBookmarks(limit = 10) { return bookmarkList.slice(0, limit); } -function deleteBookmark(id) { +function deleteBookmarkById(id) { const bookmarkList = getBookmarks(); store.set( @@ -32,4 +30,4 @@ function deleteBookmark(id) { ); } -export { createBookmark, deleteBookmark, getBookmarks }; +export { createBookmark, deleteBookmarkById, getBookmarks }; diff --git a/src/electron/utils/index.js b/src/electron/utils/index.js index 56b98f8..0b7138e 100644 --- a/src/electron/utils/index.js +++ b/src/electron/utils/index.js @@ -2,3 +2,4 @@ export * from './dialog'; export * from './icon'; export * from './label'; export * from './vite'; +export * from './platform'; diff --git a/src/electron/utils/platform.js b/src/electron/utils/platform.js new file mode 100644 index 0000000..ad8fee7 --- /dev/null +++ b/src/electron/utils/platform.js @@ -0,0 +1,5 @@ +function isWindows() { + return process.platform === 'win32'; +} + +export { isWindows }; diff --git a/src/main.js b/src/main.js index 17ae93a..89d67ea 100644 --- a/src/main.js +++ b/src/main.js @@ -3,14 +3,14 @@ import { app, ipcMain } from 'electron'; import { makeAppToInitOnASingleInstance } from './core/setup'; import { openIntoVsCode } from './core/vscode'; -import { filePathIsFromWsl, wslBookmarkDataAdapter } from './core/wsl'; +import { isFilePathFromWsl, wslBookmarkDataAdapter } from './core/wsl'; import { createBookmark, - deleteBookmark, + deleteBookmarkById, getBookmarks, } from './data/store/bookmark'; import { createMenu, createTray, createWindow } from './electron'; -import { openDialog } from './electron/utils'; +import { isWindows, openDialog } from './electron/utils'; Sentry.init({ dsn: 'https://713782327975276ae010040b1db6ab8a@o4507887084503040.ingest.us.sentry.io/4507887098724352', @@ -41,9 +41,9 @@ function createAppContext() { function registerIpcMainEvents(context) { ipcMain.on('create-bookmark', (event, filePath) => { - const filePathData = getBookmarkDataFromFilePath(filePath); + const bookmarkData = getBookmarkDataFromFilePath(filePath); - createBookmark(filePathData); + createBookmark(bookmarkData); renderApp(context); event.reply('create-bookmark', true); @@ -102,7 +102,9 @@ function renderApp(context) { { label: 'Remove', click: () => { - deleteBookmark(bookmarkData.id); + const { id } = bookmarkData; + + deleteBookmarkById(id); renderApp(context); }, }, @@ -132,7 +134,8 @@ function renderApp(context) { } function getBookmarkDataFromFilePath(filePath) { - if (filePathIsFromWsl(filePath)) return wslBookmarkDataAdapter(filePath); + if (isWindows() && isFilePathFromWsl(filePath)) + return wslBookmarkDataAdapter(filePath); return { filePath }; } From 9295bf00c3b570cac04ff46e4115ad1c63a005e4 Mon Sep 17 00:00:00 2001 From: Ailton Loures Date: Sat, 7 Dec 2024 17:37:31 -0300 Subject: [PATCH 3/3] docs: updating readme --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8d0429d..2b42068 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ VSCode Bookmark ![GitHub License](https://img.shields.io/github/license/ailtonloures/vscode-bookmark) -

A utility to save your favorite projects and open them easily in vscode.

+

A utility to save your favorite projects and files to open them easily on Visual Studio Code.

@@ -32,9 +32,12 @@ VSCode Bookmark ## Features -- Save projects path on Store; -- Open projects in VSCode; -- Logs and Monitoring with Sentry; +- Save projects and files to open in vscode; + - by drag and drop; + - by file's browser; +- WSL Integration (Windows); + - by drag and drop; + - projects (directories) only; ## Development