From 0e1e57ddd3fbdaecdf83ccd1daa1239609fbeb8b Mon Sep 17 00:00:00 2001 From: Tw93 Date: Fri, 10 May 2024 21:51:56 +0800 Subject: [PATCH] :art: Format Optimization --- bin/README.md | 11 ++--- bin/README_CN.md | 6 +-- bin/cli.ts | 25 ++++++---- bin/dev.ts | 4 +- bin/helpers/merge.ts | 2 +- bin/helpers/rust.ts | 7 +-- bin/options/index.ts | 5 +- bin/types.ts | 2 +- bin/utils/combine.ts | 12 +++-- bin/utils/dir.ts | 5 +- script/app_config.mjs | 6 +-- src-tauri/src/inject/component.js | 5 +- src-tauri/src/inject/event.js | 78 +++++++++++++++++-------------- src-tauri/tauri.linux.conf.json | 2 +- 14 files changed, 92 insertions(+), 78 deletions(-) diff --git a/bin/README.md b/bin/README.md index d0dcbc7..02c2d63 100644 --- a/bin/README.md +++ b/bin/README.md @@ -5,7 +5,7 @@ Ensure that your Node.js version is 18.0 or higher (e.g., 18.20.2). Avoid using `sudo` for the installation. If you encounter permission issues with npm, refer to [How to fix npm throwing error without sudo](https://stackoverflow.com/questions/16151018/how-to-fix-npm-throwing-error-without-sudo). ```bash -npm install pake-cli -g +npm install pake-cli -g ``` ## Considerations for Windows & Linux Users @@ -40,14 +40,15 @@ npm install pake-cli -g ## Usage ### Development + The `DEFAULT_DEV_PAKE_OPTIONS` configuration in `bin/defaults.ts` can be modified at development time to match the `pake-cli` configuration description. ```typescript -export const DEFAULT_DEV_PAKE_OPTIONS: PakeCliOptions & {url: string} = { +export const DEFAULT_DEV_PAKE_OPTIONS: PakeCliOptions & { url: string } = { ...DEFAULT_PAKE_OPTIONS, url: 'https://weread.qq.com', name: 'Weread', -} +}; ``` then @@ -129,7 +130,6 @@ screen. --fullscreen ``` - #### [activation-shortcut] Set the activation shortcut for the application. Default is ` `, it does not take effect, you can customize the activation shortcut with the following commands, e.g. `CmdOrControl+Shift+P`, use can refer to [available-modifiers](https://www.electronjs.org/docs/latest/api/accelerator#available-modifiers). @@ -221,7 +221,7 @@ Enable recursive copying. When the URL is a local file path, enabling this optio #### [inject] -Using `inject`, you can inject local absolute and relative path `css` and `js` files into the page you specify the `url` to customize it. For example, an adblock script that can be applied to any web page, or a `css` that optimizes the `UI` of a page, you can write it once to customize it. would only need to write the `app` once to generalize it to any other page. +Using `inject`, you can inject local absolute and relative path `css` and `js` files into the page you specify the `url` to customize it. For example, an adblock script that can be applied to any web page, or a `css` that optimizes the `UI` of a page, you can write it once to customize it. would only need to write the `app` once to generalize it to any other page. ```shell --inject ./tools/style.css,./tools/hotkey.js @@ -248,4 +248,3 @@ The typed package has dev-tools for debugging, in addition to outputting more lo ## Conclusion After completing the above steps, your application should be successfully packaged. Please note that the packaging process may take some time depending on your system configuration and network conditions. Be patient, and once the packaging is complete, you can find the application installer in the specified directory. - diff --git a/bin/README_CN.md b/bin/README_CN.md index 3e9ae70..e7eccda 100644 --- a/bin/README_CN.md +++ b/bin/README_CN.md @@ -5,7 +5,7 @@ 请确保您的 Node.js 版本为 18 或更高版本(例如 18.7)。请避免使用 `sudo` 进行安装。如果 npm 报告权限问题,请参考 [如何在不使用 sudo 的情况下修复 npm 报错](https://stackoverflow.com/questions/16151018/how-to-fix-npm-throwing-error-without-sudo)。 ```bash -npm install pake-cli -g +npm install pake-cli -g ``` ## Windows/Linux 注意事项 @@ -44,11 +44,11 @@ npm install pake-cli -g 开发时可以修改 `bin/defaults.ts` 中 `DEFAULT_DEV_PAKE_OPTIONS` 配置,配置项和 `pake-cli` 配置说明保持一致 ```typescript -export const DEFAULT_DEV_PAKE_OPTIONS: PakeCliOptions & {url: string} = { +export const DEFAULT_DEV_PAKE_OPTIONS: PakeCliOptions & { url: string } = { ...DEFAULT_PAKE_OPTIONS, url: 'https://weread.qq.com', name: 'Weread', -} +}; ``` 之后运行 diff --git a/bin/cli.ts b/bin/cli.ts index 2037b43..f71ec3d 100644 --- a/bin/cli.ts +++ b/bin/cli.ts @@ -18,10 +18,7 @@ ${green('| __/ (_| | < __/')} ${yellow('https://github.com/tw93/pake')} ${green('|_| \\__,_|_|\\_\\___| can turn any webpage into a desktop app with Rust.')} `; -program - .addHelpText('beforeAll', logo) - .usage(`[url] [options]`) - .showHelpAfterError(); +program.addHelpText('beforeAll', logo).usage(`[url] [options]`).showHelpAfterError(); program .argument('[url]', 'The web URL you want to package', validateUrlInput) @@ -37,12 +34,24 @@ program .option('--inject [injects...]', 'Injection of .js or .css Files', DEFAULT.inject) .option('--debug', 'Debug build and more output', DEFAULT.debug) .addOption(new Option('--user-agent ', 'Custom user agent').default(DEFAULT.userAgent).hideHelp()) - .addOption(new Option('--targets ', 'Only for Linux, option "deb" or "appimage"').default(DEFAULT.targets).hideHelp()) + .addOption( + new Option('--targets ', 'Only for Linux, option "deb" or "appimage"').default(DEFAULT.targets).hideHelp(), + ) .addOption(new Option('--always-on-top', 'Always on the top level').default(DEFAULT.alwaysOnTop).hideHelp()) - .addOption(new Option('--disabled-web-shortcuts', 'Disabled webPage shortcuts').default(DEFAULT.disabledWebShortcuts).hideHelp()) - .addOption(new Option('--safe-domain [domains...]', 'Domains that Require Security Configuration').default(DEFAULT.safeDomain).hideHelp()) + .addOption( + new Option('--disabled-web-shortcuts', 'Disabled webPage shortcuts') + .default(DEFAULT.disabledWebShortcuts) + .hideHelp(), + ) + .addOption( + new Option('--safe-domain [domains...]', 'Domains that Require Security Configuration') + .default(DEFAULT.safeDomain) + .hideHelp(), + ) .addOption(new Option('--show-system-tray', 'Show system tray in app').default(DEFAULT.showSystemTray).hideHelp()) - .addOption(new Option('--system-tray-icon ', 'Custom system tray icon').default(DEFAULT.systemTrayIcon).hideHelp()) + .addOption( + new Option('--system-tray-icon ', 'Custom system tray icon').default(DEFAULT.systemTrayIcon).hideHelp(), + ) .version(packageJson.version, '-v, --version', 'Output the current version') .action(async (url: string, options: PakeCliOptions) => { await checkUpdateTips(); diff --git a/bin/dev.ts b/bin/dev.ts index f4b67cd..d577ab7 100644 --- a/bin/dev.ts +++ b/bin/dev.ts @@ -1,5 +1,5 @@ import log from 'loglevel'; -import {DEFAULT_DEV_PAKE_OPTIONS} from './defaults'; +import { DEFAULT_DEV_PAKE_OPTIONS } from './defaults'; import handleInputOptions from './options/index'; import BuilderProvider from './builders/BuilderProvider'; @@ -14,4 +14,4 @@ async function startBuild() { await builder.start(DEFAULT_DEV_PAKE_OPTIONS.url); } -startBuild(); \ No newline at end of file +startBuild(); diff --git a/bin/helpers/merge.ts b/bin/helpers/merge.ts index 482aa20..0e31984 100644 --- a/bin/helpers/merge.ts +++ b/bin/helpers/merge.ts @@ -197,7 +197,7 @@ export async function mergeConfig(url: string, options: PakeAppOptions, tauriCon logger.error('The injected file must be in either CSS or JS format.'); return; } - const files = inject.map(filepath => path.isAbsolute(filepath) ? filepath : path.join(process.cwd(), filepath)); + const files = inject.map(filepath => (path.isAbsolute(filepath) ? filepath : path.join(process.cwd(), filepath))); tauriConf.pake.inject = files; await combineFiles(files, injectFilePath); } else { diff --git a/bin/helpers/rust.ts b/bin/helpers/rust.ts index a6e74a9..e7fd91b 100644 --- a/bin/helpers/rust.ts +++ b/bin/helpers/rust.ts @@ -9,9 +9,10 @@ import { isChinaDomain } from '@/utils/ip'; export async function installRust() { const isActions = process.env.GITHUB_ACTIONS; const isInChina = await isChinaDomain('sh.rustup.rs'); - const rustInstallScriptForMac = isInChina && !isActions - ? 'export RUSTUP_DIST_SERVER="https://rsproxy.cn" && export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup" && curl --proto "=https" --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh' - : "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"; + const rustInstallScriptForMac = + isInChina && !isActions + ? 'export RUSTUP_DIST_SERVER="https://rsproxy.cn" && export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup" && curl --proto "=https" --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh' + : "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"; const rustInstallScriptForWindows = 'winget install --id Rustlang.Rustup'; const spinner = getSpinner('Downloading Rust...'); diff --git a/bin/options/index.ts b/bin/options/index.ts index 2bf78d5..dc90f54 100644 --- a/bin/options/index.ts +++ b/bin/options/index.ts @@ -20,10 +20,7 @@ function isValidName(name: string, platform: NodeJS.Platform): boolean { return !!name && reg.test(name); } -export default async function handleOptions( - options: PakeCliOptions, - url: string, -): Promise { +export default async function handleOptions(options: PakeCliOptions, url: string): Promise { const { platform } = process; const isActions = process.env.GITHUB_ACTIONS; let name = options.name; diff --git a/bin/types.ts b/bin/types.ts index a134593..8a5a7f7 100644 --- a/bin/types.ts +++ b/bin/types.ts @@ -42,7 +42,7 @@ export interface PakeCliOptions { // Tray icon, default same as app icon for Windows and Linux, macOS requires separate png or ico systemTrayIcon: string; - // Recursive copy, when url is a local file path, if this option is enabled, the url path file and all its subfiles will be copied to the pake static file folder, default off + // Recursive copy, when url is a local file path, if this option is enabled, the url path file and all its subFiles will be copied to the pake static file folder, default off useLocalFile: false; // Multi arch, supports both Intel and M1 chips, only for Mac diff --git a/bin/utils/combine.ts b/bin/utils/combine.ts index 0fc1939..641c834 100644 --- a/bin/utils/combine.ts +++ b/bin/utils/combine.ts @@ -4,11 +4,15 @@ export default async function combineFiles(files: string[], output: string) { const contents = files.map(file => { const fileContent = fs.readFileSync(file); if (file.endsWith('.css')) { - return "window.addEventListener('DOMContentLoaded', (_event) => { const css = `" + fileContent + "`; const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); });"; + return ( + "window.addEventListener('DOMContentLoaded', (_event) => { const css = `" + + fileContent + + "`; const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); });" + ); } - - return "window.addEventListener('DOMContentLoaded', (_event) => { " + fileContent + " });"; + + return "window.addEventListener('DOMContentLoaded', (_event) => { " + fileContent + ' });'; }); fs.writeFileSync(output, contents.join('\n')); return files; -} \ No newline at end of file +} diff --git a/bin/utils/dir.ts b/bin/utils/dir.ts index 8e19caf..8276148 100644 --- a/bin/utils/dir.ts +++ b/bin/utils/dir.ts @@ -7,4 +7,7 @@ const currentModulePath = fileURLToPath(import.meta.url); // Resolve the parent directory of the current module export const npmDirectory = path.join(path.dirname(currentModulePath), '..'); -export const tauriConfigDirectory = process.env.NODE_ENV === 'development' ? path.join(npmDirectory, 'src-tauri', '.pake') : path.join(npmDirectory, 'src-tauri'); \ No newline at end of file +export const tauriConfigDirectory = + process.env.NODE_ENV === 'development' + ? path.join(npmDirectory, 'src-tauri', '.pake') + : path.join(npmDirectory, 'src-tauri'); diff --git a/script/app_config.mjs b/script/app_config.mjs index d4baff7..feb59b6 100755 --- a/script/app_config.mjs +++ b/script/app_config.mjs @@ -86,7 +86,6 @@ switch (os.platform()) { break; } - updateIconFile(platformVariables.iconPath, platformVariables.defaultIconPath); updatePlatformConfig(platformConfig, platformVariables); @@ -148,7 +147,6 @@ function updatePlatformConfig(platformConfig, platformVariables) { } function save() { - writeFileSync(variables.pakeConfigPath, JSON.stringify(pakeJson, null, 2)); writeFileSync(variables.tauriConfigPath, JSON.stringify(tauriJson, null, 2)); @@ -158,13 +156,11 @@ function save() { writeFileSync(variables.macos.configFilePath, JSON.stringify(macosJson, null, 2)); writeFileSync(variables.windows.configFilePath, JSON.stringify(windowsJson, null, 2)); - } function updateDesktopEntry() { linuxJson.tauri.bundle.deb.files = {}; - linuxJson.tauri.bundle.deb.files[variables.linux.desktopEntryConfig.configKey] = - variables.linux.desktopEntryConfig.configValue; + linuxJson.tauri.bundle.deb.files[variables.linux.desktopEntryConfig.configKey] = variables.linux.desktopEntryConfig.configValue; writeFileSync(variables.linux.desktopEntryPath, variables.linux.desktopEntry); } diff --git a/src-tauri/src/inject/component.js b/src-tauri/src/inject/component.js index 503f787..0907145 100644 --- a/src-tauri/src/inject/component.js +++ b/src-tauri/src/inject/component.js @@ -6,16 +6,15 @@ document.addEventListener('DOMContentLoaded', () => { m.style.cssText = 'max-width:60%;min-width: 80px;padding:0 12px;height: 32px;color: rgb(255, 255, 255);line-height: 32px;text-align: center;border-radius: 8px;position: fixed; bottom:24px;right: 28px;z-index: 999999;background: rgba(0, 0, 0,.8);font-size: 13px;'; document.body.appendChild(m); - setTimeout(function() { + setTimeout(function () { const d = 0.5; m.style.transition = 'transform ' + d + 's ease-in, opacity ' + d + 's ease-in'; m.style.opacity = '0'; - setTimeout(function() { + setTimeout(function () { document.body.removeChild(m); }, d * 1000); }, 3000); } window.pakeToast = pakeToast; - }); diff --git a/src-tauri/src/inject/event.js b/src-tauri/src/inject/event.js index d3131ea..fad01b5 100644 --- a/src-tauri/src/inject/event.js +++ b/src-tauri/src/inject/event.js @@ -1,13 +1,13 @@ const shortcuts = { - 'ArrowUp': () => scrollTo(0, 0), - 'ArrowDown': () => scrollTo(0, document.body.scrollHeight), '[': () => window.history.back(), ']': () => window.history.forward(), - 'r': () => window.location.reload(), '-': () => zoomOut(), '=': () => zoomIn(), '+': () => zoomIn(), - '0': () => setZoom('100%'), + 0: () => setZoom('100%'), + r: () => window.location.reload(), + ArrowUp: () => scrollTo(0, 0), + ArrowDown: () => scrollTo(0, document.body.scrollHeight), }; function setZoom(zoom) { @@ -22,11 +22,11 @@ function zoomCommon(zoomChange) { } function zoomIn() { - zoomCommon((currentZoom) => `${Math.min(parseInt(currentZoom) + 10, 200)}%`); + zoomCommon(currentZoom => `${Math.min(parseInt(currentZoom) + 10, 200)}%`); } function zoomOut() { - zoomCommon((currentZoom) => `${Math.max(parseInt(currentZoom) - 10, 30)}%`); + zoomCommon(currentZoom => `${Math.max(parseInt(currentZoom) - 10, 30)}%`); } function handleShortcut(event) { @@ -75,7 +75,7 @@ document.addEventListener('DOMContentLoaded', () => { appWindow.startDragging().then(); }); - domEl.addEventListener('mousedown', (e) => { + domEl.addEventListener('mousedown', e => { e.preventDefault(); if (e.buttons === 1 && e.detail !== 2) { appWindow.startDragging().then(); @@ -83,13 +83,13 @@ document.addEventListener('DOMContentLoaded', () => { }); domEl.addEventListener('dblclick', () => { - appWindow.isFullscreen().then((fullscreen) => { + appWindow.isFullscreen().then(fullscreen => { appWindow.setFullscreen(!fullscreen).then(); }); }); if (window['pakeConfig']?.disabled_web_shortcuts !== true) { - document.addEventListener('keyup', (event) => { + document.addEventListener('keyup', event => { if (/windows|linux/i.test(navigator.userAgent) && event.ctrlKey) { handleShortcut(event); } @@ -103,7 +103,7 @@ document.addEventListener('DOMContentLoaded', () => { function collectUrlToBlobs() { const backupCreateObjectURL = window.URL.createObjectURL; window.blobToUrlCaches = new Map(); - window.URL.createObjectURL = (blob) => { + window.URL.createObjectURL = blob => { const url = backupCreateObjectURL.call(window.URL, blob); window.blobToUrlCaches.set(url, blob); return url; @@ -111,7 +111,7 @@ document.addEventListener('DOMContentLoaded', () => { } function convertBlobUrlToBinary(blobUrl) { - return new Promise((resolve) => { + return new Promise(resolve => { const blob = window.blobToUrlCaches.get(blobUrl); const reader = new FileReader(); @@ -145,7 +145,7 @@ document.addEventListener('DOMContentLoaded', () => { } function downloadFromBlobUrl(blobUrl, filename) { - convertBlobUrlToBinary(blobUrl).then((binary) => { + convertBlobUrlToBinary(blobUrl).then(binary => { invoke('download_file_by_binary', { params: { filename, @@ -155,37 +155,40 @@ document.addEventListener('DOMContentLoaded', () => { }); } -// detect blob download by createElement("a") + // detect blob download by createElement("a") function detectDownloadByCreateAnchor() { const createEle = document.createElement; - document.createElement = (el) => { + document.createElement = el => { if (el !== 'a') return createEle.call(document, el); const anchorEle = createEle.call(document, el); // use addEventListener to avoid overriding the original click event. - anchorEle.addEventListener('click', (e) => { - const url = anchorEle.href; - const filename = anchorEle.download || getFilenameFromUrl(url); - if (window.blobToUrlCaches.has(url)) { - downloadFromBlobUrl(url, filename); - // case: download from dataURL -> convert dataURL -> - } else if (url.startsWith('data:')) { - downloadFromDataUri(url, filename); - } else if (isDownloadLink(url) || anchorEle.hostname !== window.location.host) { - handleExternalLink(e, url); - } - }, true); + anchorEle.addEventListener( + 'click', + e => { + const url = anchorEle.href; + const filename = anchorEle.download || getFilenameFromUrl(url); + if (window.blobToUrlCaches.has(url)) { + downloadFromBlobUrl(url, filename); + // case: download from dataURL -> convert dataURL -> + } else if (url.startsWith('data:')) { + downloadFromDataUri(url, filename); + } else if (isDownloadLink(url) || anchorEle.hostname !== window.location.host) { + handleExternalLink(e, url); + } + }, + true, + ); return anchorEle; }; } - const isExternalLink = (link) => window.location.host !== link.host; + const isExternalLink = link => window.location.host !== link.host; // process special download protocol['data:','blob:'] - const isSpecialDownload = (url) => ['blob', 'data'].some(protocol => url.startsWith(protocol)); + const isSpecialDownload = url => ['blob', 'data'].some(protocol => url.startsWith(protocol)); - const isDownloadRequired = (url, anchorElement, e) => - anchorElement.download || e.metaKey || e.ctrlKey || isDownloadLink(url); + const isDownloadRequired = (url, anchorElement, e) => anchorElement.download || e.metaKey || e.ctrlKey || isDownloadLink(url); const handleExternalLink = (e, url) => { e.preventDefault(); @@ -197,7 +200,7 @@ document.addEventListener('DOMContentLoaded', () => { invoke('download_file', { params: { url, filename } }); }; - const detectAnchorElementClick = (e) => { + const detectAnchorElementClick = e => { const anchorElement = e.target.closest('a'); if (anchorElement && anchorElement.href) { anchorElement.target = '_self'; @@ -226,7 +229,7 @@ document.addEventListener('DOMContentLoaded', () => { // Rewrite the window.open function. const originalWindowOpen = window.open; - window.open = function(url, name, specs) { + window.open = function (url, name, specs) { // Apple login and google login if (name === 'AppleAuthentication') { //do nothing @@ -249,10 +252,13 @@ document.addEventListener('DOMContentLoaded', () => { } // Fix Chinese input method "Enter" on Safari - document.addEventListener('keydown', (e) => { - if (e.keyCode === 229) e.stopPropagation(); - }, true); - + document.addEventListener( + 'keydown', + e => { + if (e.keyCode === 229) e.stopPropagation(); + }, + true, + ); }); function setDefaultZoom() { diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index df90475..031a73a 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -8,7 +8,7 @@ "copyright": "", "deb": { "depends": ["curl", "wget"], - "files": {"/usr/share/applications/com-pake-weread.desktop": "assets/com-pake-weread.desktop"} + "files": { "/usr/share/applications/com-pake-weread.desktop": "assets/com-pake-weread.desktop" } }, "externalBin": [], "longDescription": "",