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