diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a1ed900..fa1969c1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,17 +18,15 @@ jobs: # Create Chrome artifacts - name: Create Chrome artifacts - run: npm run build + run: npm run build:chrome - uses: actions/upload-artifact@v1 with: name: Chrome Extension path: dist # Create Firefox artifacts - - name: Move manifest - run: mv ./dist/manifest.json ./dist/manifest.json.original - - name: Combine manifest for Firefox - run: jq -s '.[0] * .[1]' ./dist/manifest.json.original ./dist/firefox_manifest-extra.json > manifest.json + - name: Create Firefox artifacts + run: npm run build:firefox - uses: actions/upload-artifact@v1 with: name: Firefox Extension diff --git a/manifest/chrome-manifest-extra.json b/manifest/chrome-manifest-extra.json new file mode 100644 index 00000000..8fe52df2 --- /dev/null +++ b/manifest/chrome-manifest-extra.json @@ -0,0 +1,8 @@ +{ + "optional_permissions": [ + "declarativeContent" + ], + "background": { + "persistent": false + } +} diff --git a/public/firefox_manifest-extra.json b/manifest/firefox-manifest-extra.json similarity index 100% rename from public/firefox_manifest-extra.json rename to manifest/firefox-manifest-extra.json diff --git a/manifest/manifest.json b/manifest/manifest.json new file mode 100644 index 00000000..b0d094be --- /dev/null +++ b/manifest/manifest.json @@ -0,0 +1,71 @@ +{ + "name": "__MSG_fullName__", + "short_name": "__MSG_Name__", + "version": "1.2.5", + "default_locale": "en", + "description": "__MSG_Description__", + "content_scripts": [ + { + "run_at": "document_start", + "matches": [ + "https://*.youtube.com/*", + "https://www.youtube-nocookie.com/embed/*" + ], + "all_frames": true, + "js": [ + "./js/vendor.js", + "./js/content.js" + ], + "css": [ + "content.css", + "./libs/Source+Sans+Pro.css", + "popup.css" + ] + } + ], + "web_accessible_resources": [ + "icons/LogoSponsorBlocker256px.png", + "icons/IconSponsorBlocker256px.png", + "icons/PlayerStartIconSponsorBlocker256px.png", + "icons/PlayerStopIconSponsorBlocker256px.png", + "icons/PlayerUploadIconSponsorBlocker256px.png", + "icons/PlayerUploadFailedIconSponsorBlocker256px.png", + "icons/upvote.png", + "icons/downvote.png", + "icons/report.png", + "icons/close.png", + "icons/PlayerInfoIconSponsorBlocker256px.png", + "icons/PlayerDeleteIconSponsorBlocker256px.png", + "popup.html" + ], + "permissions": [ + "storage", + "notifications", + "https://sponsor.ajay.app/*" + ], + "optional_permissions": [ + "*://*/*" + ], + "browser_action": { + "default_title": "__MSG_Name__", + "default_popup": "popup.html" + }, + "background": { + "scripts":[ + "./js/vendor.js", + "./js/background.js" + ] + }, + "icons": { + "16": "icons/IconSponsorBlocker16px.png", + "32": "icons/IconSponsorBlocker32px.png", + "64": "icons/LogoSponsorBlocker64px.png", + "128": "icons/LogoSponsorBlocker128px.png", + "256": "icons/LogoSponsorBlocker256px.png" + }, + "options_ui": { + "page": "options/options.html", + "open_in_tab": true + }, + "manifest_version": 2 +} \ No newline at end of file diff --git a/package.json b/package.json index 3d7bb426..de621e89 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,14 @@ "web-run": "npm run web-run:chrome", "web-run:firefox": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm", "web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium", - "build:watch": "webpack --config webpack/webpack.dev.js --watch", - "dev": "concurrently \"npm run web-run\" \"npm run build:watch\"", - "dev:firefox": "concurrently \"npm run web-run:firefox\" \"npm run build:watch\"", - "build": "webpack --config webpack/webpack.prod.js", + "build": "npm run build:chrome", + "build:chrome": "webpack --env.browser=chrome --config webpack/webpack.prod.js", + "build:firefox": "webpack --env.browser=firefox --config webpack/webpack.prod.js", + "build:watch": "npm run build:chrome:watch", + "build:watch:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js --watch", + "build:watch:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js --watch", + "dev": "npm run build && concurrently \"npm run web-run\" \"npm run build:watch\"", + "dev:firefox": "npm run build:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"", "clean": "rimraf dist", "test": "npx jest" }, diff --git a/public/help/index_en.html b/public/help/index_en.html index ec7cd521..43d43c2c 100644 --- a/public/help/index_en.html +++ b/public/help/index_en.html @@ -10,7 +10,7 @@
- + SponsorBlock
diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 7331e54b..00000000 --- a/public/manifest.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "__MSG_fullName__", - "short_name": "__MSG_Name__", - "version": "1.2.5", - "default_locale": "en", - "description": "__MSG_Description__", - "content_scripts": [ - { - "run_at": "document_start", - "matches": [ - "https://*.youtube.com/*", - "https://www.youtube-nocookie.com/embed/*" - ], - "all_frames": true, - "js": [ - "./js/vendor.js", - "./js/content.js" - ], - "css": [ - "content.css", - "./libs/Source+Sans+Pro.css", - "popup.css" - ] - } - ], - "web_accessible_resources": [ - "icons/LogoSponsorBlocker256px.png", - "icons/IconSponsorBlocker256px.png", - "icons/PlayerStartIconSponsorBlocker256px.png", - "icons/PlayerStopIconSponsorBlocker256px.png", - "icons/PlayerUploadIconSponsorBlocker256px.png", - "icons/PlayerUploadFailedIconSponsorBlocker256px.png", - "icons/upvote.png", - "icons/downvote.png", - "icons/report.png", - "icons/close.png", - "icons/PlayerInfoIconSponsorBlocker256px.png", - "icons/PlayerDeleteIconSponsorBlocker256px.png", - "popup.html" - ], - "permissions": [ - "storage", - "notifications", - "https://sponsor.ajay.app/*" - ], - "optional_permissions": [ - "*://*/*", - "declarativeContent" - ], - "browser_action": { - "default_title": "__MSG_Name__", - "default_popup": "popup.html" - }, - "background": { - "scripts":[ - "./js/vendor.js", - "./js/background.js" - ], - "persistent": false - }, - "icons": { - "16": "icons/IconSponsorBlocker16px.png", - "32": "icons/IconSponsorBlocker32px.png", - "64": "icons/LogoSponsorBlocker64px.png", - "128": "icons/LogoSponsorBlocker128px.png", - "256": "icons/LogoSponsorBlocker256px.png" - }, - "options_ui": { - "page": "options/options.html", - "open_in_tab": true - }, - "manifest_version": 2 -} diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index 70ea347a..162c8b50 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -1,9 +1,10 @@ const webpack = require("webpack"); const path = require('path'); const CopyPlugin = require('copy-webpack-plugin'); +const BuildManifest = require('./webpack.manifest'); const srcDir = '../src/'; -module.exports = { +module.exports = env => ({ entry: { popup: path.join(__dirname, srcDir + 'popup.ts'), background: path.join(__dirname, srcDir + 'background.ts'), @@ -34,11 +35,14 @@ module.exports = { }, plugins: [ // exclude locale files in moment - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new CopyPlugin([ - { from: '.', to: '../' } + { from: '.', to: '../', ignore: ['manifest.json'] } ], {context: 'public' } ), + new BuildManifest({ + browser: env.browser, + pretty: env.mode === "production" + }) ] -}; +}); diff --git a/webpack/webpack.dev.js b/webpack/webpack.dev.js index 274eb28d..6ceabb83 100644 --- a/webpack/webpack.dev.js +++ b/webpack/webpack.dev.js @@ -1,7 +1,7 @@ const merge = require('webpack-merge'); const common = require('./webpack.common.js'); -module.exports = merge(common, { +module.exports = env => merge(common(env), { devtool: 'inline-source-map', mode: 'development' }); \ No newline at end of file diff --git a/webpack/webpack.manifest.js b/webpack/webpack.manifest.js new file mode 100644 index 00000000..08e48b29 --- /dev/null +++ b/webpack/webpack.manifest.js @@ -0,0 +1,65 @@ +const webpack = require("webpack"); +const path = require('path'); +const CopyPlugin = require('copy-webpack-plugin'); +const validateOptions = require('schema-utils'); + +const fs = require('fs'); + +const manifest = require("../manifest/manifest.json"); +const firefoxManifestExtra = require("../manifest/firefox-manifest-extra.json"); +const chromeManifestExtra = require("../manifest/chrome-manifest-extra.json"); + +// schema for options object +const schema = { + type: 'object', + properties: { + browser: { + type: 'string' + }, + pretty: { + type: 'boolean' + } + } +}; + +class BuildManifest { + constructor (options = {}) { + validateOptions(schema, options, "Build Manifest Plugin"); + + this.options = options; + } + + apply(compiler) { + const distManifestFile = path.resolve(__dirname, "../dist/manifest.json"); + + // Add missing manifest elements + if (this.options.browser.toLowerCase() === "firefox") { + mergeObjects(manifest, firefoxManifestExtra); + } else if (this.options.browser.toLowerCase() === "chrome" || this.options.browser.toLowerCase() === "chromium") { + mergeObjects(manifest, chromeManifestExtra); + } + + let result = JSON.stringify(manifest); + if (this.options.pretty) result = JSON.stringify(manifest, null, 2); + + fs.writeFileSync(distManifestFile, result); + } +} + +function mergeObjects(object1, object2) { + for (const key in object2) { + if (key in object1) { + if (Array.isArray(object1[key])) { + object1[key] = object1[key].concat(object2[key]); + } else if (typeof object1[key] == 'object') { + mergeObjects(object1[key], object2[key]); + } else { + object1[key] = object2[key]; + } + } else { + object1[key] = object2[key]; + } + } +} + +module.exports = BuildManifest; \ No newline at end of file diff --git a/webpack/webpack.prod.js b/webpack/webpack.prod.js index daa65f51..65be616f 100644 --- a/webpack/webpack.prod.js +++ b/webpack/webpack.prod.js @@ -1,6 +1,11 @@ const merge = require('webpack-merge'); const common = require('./webpack.common.js'); -module.exports = merge(common, { - mode: 'production' -}); \ No newline at end of file +module.exports = env => { + let mode = "production"; + env.mode = mode; + + return merge(common(env), { + mode + }); +}; \ No newline at end of file