diff --git a/.gitignore b/.gitignore index b41c659..5f0f7cb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ node_modules .DS_Store .history +# build +dist/ + # debug npm-debug.log* yarn-debug.log* diff --git a/build.js b/build.js new file mode 100644 index 0000000..12062f5 --- /dev/null +++ b/build.js @@ -0,0 +1,68 @@ +import * as esbuild from 'esbuild'; +import { cp, mkdir } from 'fs/promises'; + +const userscriptBanner = `// ==UserScript== +// @name Gemini NanoBanana Watermark Remover +// @name:zh-CN Gemini NanoBanana 图片水印移除 +// @namespace https://github.com/journey-ad +// @version 0.1.0 +// @description Automatically removes watermarks from Gemini AI generated images +// @description:zh-CN 自动移除 Gemini AI 生成图像中的水印 +// @icon https://www.google.com/s2/favicons?domain=gemini.google.com +// @author journey-ad +// @license MIT +// @match https://gemini.google.com/app/* +// @grant GM_xmlhttpRequest +// @run-at document-start +// ==/UserScript== +`; + +async function build() { + console.log(`Start Build... ${process.env.NODE_ENV === 'production' ? 'production' : 'development'}\r\n`); + + // 构建网站 - app.js + console.log('Building: dist/app.js'); + await esbuild.build({ + entryPoints: ['src/app.js'], + bundle: true, + format: 'esm', + outfile: 'dist/app.js', + loader: { '.png': 'file' }, + assetNames: 'assets/[name]', + publicPath: '/', + minify: process.env.NODE_ENV === 'production' + }); + + // 构建网站 - i18n.js + console.log('Building: dist/i18n.js'); + await esbuild.build({ + entryPoints: ['src/i18n.js'], + bundle: true, + format: 'esm', + outfile: 'dist/i18n.js', + minify: process.env.NODE_ENV === 'production' + }); + + // 构建油猴脚本 + console.log('Building: dist/userscript/gemini-watermark-remover.user.js'); + await mkdir('dist/userscript', { recursive: true }); + await esbuild.build({ + entryPoints: ['src/userscript/index.js'], + bundle: true, + format: 'iife', + outfile: 'dist/userscript/gemini-watermark-remover.user.js', + banner: { js: userscriptBanner }, + loader: { '.png': 'dataurl' }, + minify: false + }); + + // 复制静态文件 + console.log('Copying: src/i18n -> dist/i18n'); + await cp('src/i18n', 'dist/i18n', { recursive: true }); + console.log('Copying: public -> dist'); + await cp('public', 'dist', { recursive: true }); + + console.log('\r\n✓ Build complete'); +} + +build().catch(console.error); diff --git a/package.json b/package.json new file mode 100644 index 0000000..6afc802 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "gemini-watermark-remover", + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "node build.js", + "build": "NODE_ENV=production node build.js", + "serve": "npx serve dist" + }, + "devDependencies": { + "esbuild": "^0.24.0" + }, + "packageManager": "pnpm@10.11.0" +} diff --git a/userscript/pnpm-lock.yaml b/pnpm-lock.yaml similarity index 100% rename from userscript/pnpm-lock.yaml rename to pnpm-lock.yaml diff --git a/index.html b/public/index.html similarity index 98% rename from index.html rename to public/index.html index e5d3f5c..367ef6f 100644 --- a/index.html +++ b/public/index.html @@ -82,6 +82,7 @@