build: refactor build script
parent
8d95184abe
commit
607a3c8719
142
build.js
142
build.js
|
|
@ -1,5 +1,30 @@
|
||||||
import * as esbuild from 'esbuild';
|
import * as esbuild from 'esbuild';
|
||||||
import { cp, mkdir } from 'fs/promises';
|
import { cpSync, rmSync, existsSync, mkdirSync, watch } from 'node:fs';
|
||||||
|
import { createRequire } from 'node:module';
|
||||||
|
import { execSync } from 'child_process';
|
||||||
|
|
||||||
|
const require = createRequire(import.meta.url);
|
||||||
|
const pkg = require('./package.json');
|
||||||
|
const isProd = process.env.NODE_ENV === 'production';
|
||||||
|
|
||||||
|
let _commitHash = null;
|
||||||
|
const getCommitHash = () => {
|
||||||
|
if (_commitHash) return _commitHash;
|
||||||
|
try {
|
||||||
|
_commitHash = execSync('git rev-parse --short HEAD').toString().trim();
|
||||||
|
} catch {
|
||||||
|
_commitHash = 'unknown';
|
||||||
|
}
|
||||||
|
return _commitHash;
|
||||||
|
};
|
||||||
|
|
||||||
|
const jsBanner = `/*!
|
||||||
|
* ${pkg.name} v${pkg.version}+${getCommitHash()}
|
||||||
|
* ${pkg.description}
|
||||||
|
* (c) ${new Date().getFullYear()} ${pkg.author}
|
||||||
|
* ${pkg.repository.url?.replace(/\.git$/, '')}
|
||||||
|
* Released under the ${pkg.license} License.
|
||||||
|
*/`;
|
||||||
|
|
||||||
const userscriptBanner = `// ==UserScript==
|
const userscriptBanner = `// ==UserScript==
|
||||||
// @name Gemini NanoBanana Watermark Remover
|
// @name Gemini NanoBanana Watermark Remover
|
||||||
|
|
@ -20,51 +45,82 @@ const userscriptBanner = `// ==UserScript==
|
||||||
// ==/UserScript==
|
// ==/UserScript==
|
||||||
`;
|
`;
|
||||||
|
|
||||||
async function build() {
|
const copyAssetsPlugin = {
|
||||||
console.log(`Start Build... ${process.env.NODE_ENV === 'production' ? 'production' : 'development'}\r\n`);
|
name: 'copy-assets',
|
||||||
|
setup(build) {
|
||||||
|
build.onEnd(() => {
|
||||||
|
console.log('📂 Syncing static assets...');
|
||||||
|
try {
|
||||||
|
if (!existsSync('dist/i18n')) mkdirSync('dist/i18n', { recursive: true });
|
||||||
|
cpSync('src/i18n', 'dist/i18n', { recursive: true });
|
||||||
|
cpSync('public', 'dist', { recursive: true });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('❌ Asset copy failed:', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
// Build website - app.js
|
const commonConfig = {
|
||||||
console.log('Building: dist/app.js');
|
bundle: true,
|
||||||
await esbuild.build({
|
loader: { '.png': 'dataurl' },
|
||||||
entryPoints: ['src/app.js'],
|
minify: isProd,
|
||||||
bundle: true,
|
logLevel: 'info',
|
||||||
format: 'esm',
|
};
|
||||||
outfile: 'dist/app.js',
|
|
||||||
loader: { '.png': 'dataurl' },
|
|
||||||
publicPath: '/',
|
|
||||||
minify: process.env.NODE_ENV === 'production'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Build website - i18n.js
|
// Build website - app.js
|
||||||
console.log('Building: dist/i18n.js');
|
const websiteCtx = await esbuild.context({
|
||||||
await esbuild.build({
|
...commonConfig,
|
||||||
entryPoints: ['src/i18n.js'],
|
entryPoints: ['src/app.js'],
|
||||||
bundle: true,
|
outfile: 'dist/app.js',
|
||||||
format: 'esm',
|
platform: 'browser',
|
||||||
outfile: 'dist/i18n.js',
|
target: ['es2020'],
|
||||||
minify: process.env.NODE_ENV === 'production'
|
banner: { js: jsBanner },
|
||||||
});
|
sourcemap: !isProd,
|
||||||
|
plugins: [copyAssetsPlugin],
|
||||||
|
});
|
||||||
|
|
||||||
// Build userscript
|
// Build userscript
|
||||||
console.log('Building: dist/userscript/gemini-watermark-remover.user.js');
|
const userscriptCtx = await esbuild.context({
|
||||||
await mkdir('dist/userscript', { recursive: true });
|
...commonConfig,
|
||||||
await esbuild.build({
|
entryPoints: ['src/userscript/index.js'],
|
||||||
entryPoints: ['src/userscript/index.js'],
|
format: 'iife',
|
||||||
bundle: true,
|
outfile: 'dist/userscript/gemini-watermark-remover.user.js',
|
||||||
format: 'iife',
|
banner: { js: userscriptBanner },
|
||||||
outfile: 'dist/userscript/gemini-watermark-remover.user.js',
|
minify: false
|
||||||
banner: { js: userscriptBanner },
|
});
|
||||||
loader: { '.png': 'dataurl' },
|
|
||||||
minify: false
|
|
||||||
});
|
|
||||||
|
|
||||||
// Copy static files
|
console.log(`🚀 Starting build process... [${isProd ? 'PRODUCTION' : 'DEVELOPMENT'}]`);
|
||||||
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');
|
if (existsSync('dist')) rmSync('dist', { recursive: true });
|
||||||
|
mkdirSync('dist/userscript', { recursive: true });
|
||||||
|
|
||||||
|
if (isProd) {
|
||||||
|
await Promise.all([websiteCtx.rebuild(), userscriptCtx.rebuild()]);
|
||||||
|
console.log('✅ Build complete!');
|
||||||
|
process.exit(0);
|
||||||
|
} else {
|
||||||
|
await Promise.all([websiteCtx.watch(), userscriptCtx.watch()]);
|
||||||
|
|
||||||
|
const watchDir = (dir, dest) => {
|
||||||
|
let debounceTimer = null;
|
||||||
|
|
||||||
|
watch(dir, { recursive: true }, (eventType, filename) => {
|
||||||
|
if (!filename) return;
|
||||||
|
if (debounceTimer) clearTimeout(debounceTimer);
|
||||||
|
|
||||||
|
debounceTimer = setTimeout(() => {
|
||||||
|
console.log(`📂 Asset changed: ${filename}`);
|
||||||
|
try {
|
||||||
|
cpSync(dir, dest, { recursive: true });
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Sync failed:', e);
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
watchDir('src/i18n', 'dist/i18n');
|
||||||
|
watchDir('public', 'dist');
|
||||||
|
|
||||||
|
console.log('👀 Watching for changes...');
|
||||||
}
|
}
|
||||||
|
|
||||||
build().catch(console.error);
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,13 @@
|
||||||
{
|
{
|
||||||
"name": "gemini-watermark-remover",
|
"name": "gemini-watermark-remover",
|
||||||
|
"description": "Automatically removes watermarks from Gemini AI generated images",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
"author": "journey-ad",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/journey-ad/gemini-watermark-remover.git"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "node build.js",
|
"dev": "node build.js",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue