diff --git a/package-lock.json b/package-lock.json index 7803faf2..5901c0df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ ], "license": "LGPL-3.0-or-later", "dependencies": { - "@ajayyy/maze-utils": "^1.1.8", + "@ajayyy/maze-utils": "^1.1.9", "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -67,9 +67,9 @@ } }, "node_modules/@ajayyy/maze-utils": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.1.8.tgz", - "integrity": "sha512-0LwL+i/JvQZYBu6BadYX77XUoU0QVJZXCaElihVTO7suuZ9rracJX7w7A/p12whR/bQ2pO2bCqIvXuWoOiln0Q==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.1.9.tgz", + "integrity": "sha512-fU85QRrSBAP31ppFs+Gzfm9vHx+4wFFDr8pSoT747+w6L6cMPlubWG0lFquRTjffStfZlw33kGJOSuwXNiYbAA==", "funding": [ { "type": "individual", @@ -13858,9 +13858,9 @@ }, "dependencies": { "@ajayyy/maze-utils": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.1.8.tgz", - "integrity": "sha512-0LwL+i/JvQZYBu6BadYX77XUoU0QVJZXCaElihVTO7suuZ9rracJX7w7A/p12whR/bQ2pO2bCqIvXuWoOiln0Q==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.1.9.tgz", + "integrity": "sha512-fU85QRrSBAP31ppFs+Gzfm9vHx+4wFFDr8pSoT747+w6L6cMPlubWG0lFquRTjffStfZlw33kGJOSuwXNiYbAA==" }, "@ampproject/remapping": { "version": "2.2.0", diff --git a/package.json b/package.json index 694d15a4..555a0e4c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "", "main": "background.js", "dependencies": { - "@ajayyy/maze-utils": "^1.1.8", + "@ajayyy/maze-utils": "^1.1.9", "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/src/content.ts b/src/content.ts index b73be606..b5c26df6 100644 --- a/src/content.ts +++ b/src/content.ts @@ -45,6 +45,7 @@ import { getHash, HashedValue } from "@ajayyy/maze-utils/lib/hash"; import { generateUserID } from "@ajayyy/maze-utils/lib/setup"; import { setThumbnailListener, updateAll } from "@ajayyy/maze-utils/lib/thumbnailManagement"; import { labelThumbnails, setupThumbnailPageLoadListener } from "./utils/thumbnails"; +import * as documentScript from "../dist/js/document.js"; const utils = new Utils(); @@ -111,7 +112,8 @@ setupVideoModule({ updatePreviewBar(); updateVisibilityOfPlayerControlsButton(); }, - resetValues + resetValues, + documentScript }, () => Config); setThumbnailListener(labelThumbnails); setupThumbnailPageLoadListener(); diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index 0be6c63c..75583107 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -25,99 +25,168 @@ const edgeLanguages = [ "zh_CN" ] -module.exports = env => ({ - entry: { - popup: path.join(__dirname, srcDir + 'popup.ts'), - background: path.join(__dirname, srcDir + 'background.ts'), - content: path.join(__dirname, srcDir + 'content.ts'), - options: path.join(__dirname, srcDir + 'options.ts'), - help: path.join(__dirname, srcDir + 'help.ts'), - permissions: path.join(__dirname, srcDir + 'permissions.ts'), - document: path.join(__dirname, srcDir + 'document.ts'), - upsell: path.join(__dirname, srcDir + 'upsell.ts') - }, - output: { - path: path.join(__dirname, '../dist/js'), - }, - optimization: { - splitChunks: { - name: 'vendor', - chunks: "initial" - } - }, - module: { - rules: [ - { - test: /\.tsx?$/, - loader: 'ts-loader', - exclude: /node_modules/, - options: { - // disable type checker for user in fork plugin - transpileOnly: true, - configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" - } - } - ] - }, - resolve: { - extensions: ['.ts', '.tsx', '.js'] - }, - plugins: [ - // fork TS checker - new ForkTsCheckerWebpackPlugin(), - // exclude locale files in moment - new CopyPlugin({ - patterns: [ + + +module.exports = env => { + const documentScriptBuild = webpack({ + entry: { + document: { + import: path.join(__dirname, srcDir + 'document.ts'), + }, + }, + output: { + path: path.join(__dirname, '../dist/js'), + }, + module: { + rules: [ { - from: '.', - to: '../', - globOptions: { - ignore: ['manifest.json'], - }, - context: './public', - filter: async (path) => { - if (path.match(/\/_locales\/.+/)) { - if (env.browser.toLowerCase() === "edge" - && !edgeLanguages.includes(path.match(/(?<=\/_locales\/)[^/]+(?=\/[^/]+$)/)[0])) { - return false; - } - - const data = await fs.promises.readFile(path); - const parsed = JSON.parse(data.toString()); - - return parsed.fullName && parsed.Description; - } else { - return true; - } - }, - transform(content, path) { - if (path.match(/\/_locales\/.+/)) { - const parsed = JSON.parse(content.toString()); - if (env.browser.toLowerCase() === "safari") { - parsed.fullName.message = parsed.fullName.message.match(/^.+(?= -)/)?.[0] || parsed.fullName.message; - if (parsed.fullName.message.length > 50) { - parsed.fullName.message = parsed.fullName.message.slice(0, 47) + "..."; - } - - parsed.Description.message = parsed.Description.message.match(/^.+(?=\. )/)?.[0] || parsed.Description.message; - if (parsed.Description.message.length > 80) { - parsed.Description.message = parsed.Description.message.slice(0, 77) + "..."; - } - } - - return Buffer.from(JSON.stringify(parsed)); - } - - return content; + test: /\.tsx?$/, + loader: 'ts-loader', + exclude: /node_modules/, + resourceQuery: { not: [/raw/] }, + options: { + // disable type checker for user in fork plugin + transpileOnly: true, + configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" } + }, + ] + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + plugins: [ + // Don't fork TS checker for document script to speed up + // new ForkTsCheckerWebpackPlugin() + ] + }); + + class DocumentScriptCompiler { + currentWatching = null; + + /** + * + * @param {webpack.Compiler} compiler + */ + apply(compiler) { + compiler.hooks.beforeCompile.tapAsync({ name: 'DocumentScriptCompiler' }, (compiler, callback) => { + if (env.WEBPACK_WATCH) { + let first = true; + if (!this.currentWatching) { + this.currentWatching = documentScriptBuild.watch({}, () => { + if (first) { + first = false; + callback(); + } + }); + } else { + callback(); + } + } else { + documentScriptBuild.close(() => { + documentScriptBuild.run(() => { + callback(); + }); + }); + } + }); + } + } + + return { + entry: { + popup: path.join(__dirname, srcDir + 'popup.ts'), + background: path.join(__dirname, srcDir + 'background.ts'), + content: path.join(__dirname, srcDir + 'content.ts'), + options: path.join(__dirname, srcDir + 'options.ts'), + help: path.join(__dirname, srcDir + 'help.ts'), + permissions: path.join(__dirname, srcDir + 'permissions.ts'), + upsell: path.join(__dirname, srcDir + 'upsell.ts') + }, + output: { + path: path.join(__dirname, '../dist/js'), + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'ts-loader', + exclude: /node_modules/, + resourceQuery: { not: [/raw/] }, + options: { + // disable type checker for user in fork plugin + transpileOnly: true, + configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" + } + }, + { + test: /js\/document\.js$/, + type: 'asset/source' } ] - }), - new BuildManifest({ - browser: env.browser, - pretty: env.mode === "production", - stream: env.stream - }), - new configDiffPlugin() - ] -}); + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + plugins: [ + // Prehook to start building document script before normal build + new DocumentScriptCompiler(), + // fork TS checker + new ForkTsCheckerWebpackPlugin(), + // exclude locale files in moment + new CopyPlugin({ + patterns: [ + { + from: '.', + to: '../', + globOptions: { + ignore: ['manifest.json'], + }, + context: './public', + filter: async (path) => { + if (path.match(/\/_locales\/.+/)) { + if (env.browser.toLowerCase() === "edge" + && !edgeLanguages.includes(path.match(/(?<=\/_locales\/)[^/]+(?=\/[^/]+$)/)[0])) { + return false; + } + + const data = await fs.promises.readFile(path); + const parsed = JSON.parse(data.toString()); + + return parsed.fullName && parsed.Description; + } else { + return true; + } + }, + transform(content, path) { + if (path.match(/\/_locales\/.+/)) { + const parsed = JSON.parse(content.toString()); + if (env.browser.toLowerCase() === "safari") { + parsed.fullName.message = parsed.fullName.message.match(/^.+(?= -)/)?.[0] || parsed.fullName.message; + if (parsed.fullName.message.length > 50) { + parsed.fullName.message = parsed.fullName.message.slice(0, 47) + "..."; + } + + parsed.Description.message = parsed.Description.message.match(/^.+(?=\. )/)?.[0] || parsed.Description.message; + if (parsed.Description.message.length > 80) { + parsed.Description.message = parsed.Description.message.slice(0, 77) + "..."; + } + } + + return Buffer.from(JSON.stringify(parsed)); + } + + return content; + } + } + ] + }), + new BuildManifest({ + browser: env.browser, + pretty: env.mode === "production", + stream: env.stream + }), + new configDiffPlugin() + ] + }; +}; \ No newline at end of file