diff --git a/.gitignore b/.gitignore index 7a53ecf4..f6046401 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,7 @@ dist dist-ssr extension/ extension-firefox/ +extension-safari/ node_modules web-ext-profile +extension-safari-macos/ \ No newline at end of file diff --git a/knip.json b/knip.json index a5698347..fc2e9d66 100644 --- a/knip.json +++ b/knip.json @@ -14,7 +14,7 @@ "uno.css", "lint-staged" ], - "ignoreBinaries": ["gh"], + "ignoreBinaries": ["gh", "xcrun"], "rules": { "types": "off", "enumMembers": "off", diff --git a/package.json b/package.json index 6943e36d..e7efa387 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,12 @@ "dev:bg": "tsup --watch ./src", "build": "cross-env NODE_ENV=production run-s clear build:web build:prepare build:js build:bg", "build-firefox": "cross-env NODE_ENV=production FIREFOX=true run-s clear-firefox build:web build:prepare build:js build:bg", + "build-safari": "cross-env NODE_ENV=production SAFARI=true run-s clear-safari build:web build:prepare build:js build:bg", "build:prepare": "esno scripts/prepare.ts", "build:web": "vite build", "build:js": "vite build --config vite.config.content.ts", "build:bg": "tsup", + "convert-safari": "xcrun safari-web-extension-converter ./extension-safari --project-location ./extension-safari-macos --macos-only", "pack": "cross-env NODE_ENV=production run-p pack:*", "pack:zip": "rimraf extension.zip && jszip-cli add extension/* -o ./extension.zip", "pack:zip-firefox": "rimraf extension-firefox.zip && jszip-cli add extension-firefox/* -o ./extension-firefox.zip", @@ -30,6 +32,7 @@ "start:firefox": "web-ext run --source-dir ./extension-firefox --target=firefox-desktop", "clear": "rimraf --glob extension extension.*", "clear-firefox": "rimraf --glob extension-firefox extension-firefox.*", + "clear-safari": "rimraf --glob extension-safari extension-safari.*", "lint": "eslint", "lint:fix": "eslint --fix", "test": "vitest test", diff --git a/scripts/manifest.ts b/scripts/manifest.ts index 7cca6b73..e9ea5908 100644 --- a/scripts/manifest.ts +++ b/scripts/manifest.ts @@ -1,10 +1,14 @@ import fs from 'fs-extra' import { getManifest } from '../src/manifest' -import { isFirefox, log, r } from './utils' +import { isFirefox, isSafari, log, r } from './utils' export async function writeManifest() { - await fs.writeJSON(r(isFirefox ? 'extension-firefox/manifest.json' : 'extension/manifest.json'), await getManifest(), { spaces: 2 }) + await fs.writeJSON(r( + isFirefox + ? 'extension-firefox/manifest.json' + : isSafari ? 'extension-safari/manifest.json' : 'extension/manifest.json', + ), await getManifest(), { spaces: 2 }) log('PRE', 'write manifest.json') } diff --git a/scripts/prepare.ts b/scripts/prepare.ts index f3abbab1..8f890b68 100644 --- a/scripts/prepare.ts +++ b/scripts/prepare.ts @@ -4,7 +4,7 @@ import { execSync } from 'node:child_process' import chokidar from 'chokidar' import fs from 'fs-extra' -import { isDev, isFirefox, log, r } from './utils' +import { isDev, isFirefox, isSafari, log, r } from './utils' /** * Stub index.html to use Vite in development @@ -16,12 +16,20 @@ async function stubIndexHtml() { ] for (const view of views) { - await fs.ensureDir(r(isFirefox ? `extension-firefox/dist/${view}` : `extension/dist/${view}`)) + await fs.ensureDir(r( + isFirefox + ? `extension-firefox/dist/${view}` + : isSafari ? `extension-safari/dist/${view}` : `extension/dist/${view}`, + )) let data = await fs.readFile(r(`src/${view}/index.html`), 'utf-8') data = data .replace('"./main.ts"', `"/${view}/main.ts.js"`) .replace('
', '
Vite server did not start
') - await fs.writeFile(r(isFirefox ? `extension-firefox/dist/${view}/index.html` : `extension/dist/${view}/index.html`), data, 'utf-8') + await fs.writeFile(r( + isFirefox + ? `extension-firefox/dist/${view}/index.html` + : isSafari ? `extension-safari/dist/${view}/index.html` : `extension/dist/${view}/index.html`, + ), data, 'utf-8') log('PRE', `stub ${view}`) } } @@ -30,8 +38,8 @@ function writeManifest() { execSync('npx esno ./scripts/manifest.ts', { stdio: 'inherit' }) } -fs.ensureDirSync(r(isFirefox ? 'extension-firefox' : 'extension')) -fs.copySync(r('assets'), r(isFirefox ? 'extension-firefox/assets' : 'extension/assets')) +fs.ensureDirSync(r(isFirefox ? 'extension-firefox' : isSafari ? 'extension-safari' : 'extension')) +fs.copySync(r('assets'), r(isFirefox ? 'extension-firefox/assets' : isSafari ? 'extension-safari/assets' : 'extension/assets')) writeManifest() if (isDev) { diff --git a/scripts/utils.ts b/scripts/utils.ts index 818d516e..94519821 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -9,6 +9,7 @@ export const r = (...args: string[]) => resolve(dirname(fileURLToPath(import.met export const isDev = process.env.NODE_ENV !== 'production' export const isWin = process.platform === 'win32' export const isFirefox = process.env.FIREFOX === 'true' +export const isSafari = process.env.SAFARI === 'true' export function log(name: string, message: string) { console.log(black(bgCyan(` ${name} `)), message) diff --git a/src/contentScripts/index.ts b/src/contentScripts/index.ts index 17a19597..823e2ba2 100644 --- a/src/contentScripts/index.ts +++ b/src/contentScripts/index.ts @@ -113,7 +113,8 @@ if (settings.value.adaptToOtherPageStyles && isHomePage()) { `) } -document.addEventListener('DOMContentLoaded', async () => { +function onDOMLoaded() { + // Remove the original Bilibili homepage if in Bilibili homepage & useOriginalBilibiliHomepage is enabled if (!settings.value.useOriginalBilibiliHomepage && isHomePage()) { const originalTopBar = document.querySelector('#i_cecream > .bili-feed4 > .bili-header') const originalTopBarInnerUselessContents = document.querySelectorAll('#i_cecream > .bili-feed4 > .bili-header > *:not(.bili-header__bar)') @@ -138,7 +139,12 @@ document.addEventListener('DOMContentLoaded', async () => { // Then inject the app injectApp() } -}) +} + +if (document.readyState !== 'loading') + onDOMLoaded() +else + document.addEventListener('DOMContentLoaded', () => onDOMLoaded()) function injectApp() { // Inject app when idle diff --git a/src/manifest.ts b/src/manifest.ts index d705824d..03e55a5e 100644 --- a/src/manifest.ts +++ b/src/manifest.ts @@ -2,7 +2,7 @@ import fs from 'fs-extra' import type { Manifest } from 'webextension-polyfill' import type PkgType from '../package.json' -import { isDev, isFirefox, port, r } from '../scripts/utils' +import { isDev, isFirefox, isSafari, port, r } from '../scripts/utils' export async function getManifest() { const pkg = await fs.readJSON(r('package.json')) as typeof PkgType @@ -23,8 +23,8 @@ export async function getManifest() { // page: './dist/options/index.html', // open_in_tab: true, // }, - background: isFirefox - ? { scripts: ['./dist/background/index.js'] } + background: (isFirefox || isSafari) + ? { scripts: ['./dist/background/index.js'], persistent: false } : { service_worker: './dist/background/index.js' }, icons: { 16: './assets/icon-512.png', diff --git a/src/styles/adaptedStyles/common/comments.scss b/src/styles/adaptedStyles/common/comments.scss index 794072c1..8b1d7dd1 100644 --- a/src/styles/adaptedStyles/common/comments.scss +++ b/src/styles/adaptedStyles/common/comments.scss @@ -85,6 +85,10 @@ } } + .bili-dyn-forward-publishing__editor { + background-color: var(--bew-content-solid); + } + // Like & dislike icon .like-icon, .dislike-icon, @@ -311,7 +315,6 @@ .comment-bilibili-fold .comment-send .textarea-container .ipt-txt, .bb-comment .comment-send-lite .textarea-container .ipt-txt, .comment-bilibili-fold .comment-send-lite .textarea-container .ipt-txt, - .bili-dyn-forward-publishing__editor, .textarea-container textarea { background-color: var(--bew-fill-1); border-color: var(--bew-border-color); diff --git a/tsup.config.ts b/tsup.config.ts index c823c909..adb252be 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,16 +1,16 @@ import { defineConfig } from 'tsup' -import { isDev, isFirefox } from './scripts/utils' +import { isDev, isFirefox, isSafari } from './scripts/utils' export default defineConfig(() => ({ entry: { 'background/index': './src/background/index.ts', ...(isDev ? { mv3client: './scripts/client.ts' } : {}), }, - outDir: isFirefox ? 'extension-firefox/dist' : 'extension/dist', + outDir: isFirefox ? 'extension-firefox/dist' : isSafari ? 'extension-safari/dist' : 'extension/dist', format: ['esm'], target: 'esnext', - ignoreWatch: ['**/extension/**', '**/extension-firefox/**'], + ignoreWatch: ['**/extension/**', '**/extension-firefox/**', '**/extension-safari/**'], splitting: false, sourcemap: false, // https://github.com/vitejs/vite-plugin-vue/issues/35 define: { diff --git a/vite-mv3-hmr.ts b/vite-mv3-hmr.ts index 27086699..e92ad57b 100644 --- a/vite-mv3-hmr.ts +++ b/vite-mv3-hmr.ts @@ -3,9 +3,9 @@ import { dirname, join } from 'node:path' import fs from 'fs-extra' import type { HMRPayload, PluginOption } from 'vite' -import { isFirefox, isWin, r } from './scripts/utils' +import { isFirefox, isSafari, isWin, r } from './scripts/utils' -const targetDir = r(isFirefox ? 'extension-firefox' : 'extension') +const targetDir = r(isFirefox ? 'extension-firefox' : isSafari ? 'extension-safari' : 'extension') export function MV3Hmr(): PluginOption { return { diff --git a/vite.config.content.ts b/vite.config.content.ts index e7a628a2..6763952a 100644 --- a/vite.config.content.ts +++ b/vite.config.content.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import packageJson from './package.json' -import { isDev, isFirefox, r } from './scripts/utils' +import { isDev, isFirefox, isSafari, r } from './scripts/utils' import { sharedConfig } from './vite.config' // bundling the content script using Vite @@ -11,7 +11,7 @@ export default defineConfig({ watch: isDev ? { include: ['./**/*'] } : undefined, - outDir: r(isFirefox ? 'extension-firefox/dist/contentScripts' : 'extension/dist/contentScripts'), + outDir: r(isFirefox ? 'extension-firefox/dist/contentScripts' : isSafari ? 'extension-safari/dist/contentScripts' : 'extension/dist/contentScripts'), cssCodeSplit: false, emptyOutDir: false, sourcemap: false, // https://github.com/vitejs/vite-plugin-vue/issues/35 diff --git a/vite.config.ts b/vite.config.ts index eba464af..0c4451d4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -10,7 +10,7 @@ import AutoImport from 'unplugin-auto-import/vite' import type { UserConfig } from 'vite' import { defineConfig } from 'vite' -import { isDev, isFirefox, port, r } from './scripts/utils' +import { isDev, isFirefox, isSafari, port, r } from './scripts/utils' import { MV3Hmr } from './vite-mv3-hmr' export const sharedConfig: UserConfig = { @@ -84,7 +84,7 @@ export default defineConfig(({ command }) => ({ }, }, build: { - outDir: r(isFirefox ? 'extension-firefox/dist' : 'extension/dist'), + outDir: r(isFirefox ? 'extension-firefox/dist' : isSafari ? 'extension-safari/dist' : 'extension/dist'), emptyOutDir: false, sourcemap: false, // https://github.com/vitejs/vite-plugin-vue/issues/35 // https://developer.chrome.com/docs/webstore/program_policies/#:~:text=Code%20Readability%20Requirements