* chore: get ready for release * chore: update pnpm-lock.yaml * chore(docs): update CHANGELOG.md * chore: fix lint warnings and add notes --------- Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
209 lines
7.0 KiB
TypeScript
209 lines
7.0 KiB
TypeScript
/// <reference types="vitest" />
|
|
import { crx } from '@crxjs/vite-plugin';
|
|
import react from '@vitejs/plugin-react-swc';
|
|
import { resolve } from 'path';
|
|
import UnoCSS from 'unocss/vite';
|
|
import Icons from 'unplugin-icons/vite';
|
|
import type { Plugin, ResolvedConfig, Rollup, ViteDevServer } from 'vite';
|
|
import { defineConfig } from 'vite';
|
|
import inspect from 'vite-plugin-inspect';
|
|
|
|
import packageJson from './package.json';
|
|
import manifest from './src/manifest';
|
|
import vitePluginRunCommandOnDemand from './utils/plugins/run-command-on-demand';
|
|
|
|
const root = resolve(__dirname, 'src');
|
|
const pagesDir = resolve(root, 'pages');
|
|
const assetsDir = resolve(root, 'assets');
|
|
const publicDir = resolve(__dirname, 'public');
|
|
|
|
const isBeta = !!process.env.BETA;
|
|
if (isBeta) {
|
|
process.env.VITE_BETA_BUILD = 'true';
|
|
}
|
|
process.env.VITE_PACKAGE_VERSION = packageJson.version;
|
|
|
|
export const preambleCode = `
|
|
import RefreshRuntime from "__BASE__@react-refresh"
|
|
RefreshRuntime.injectIntoGlobalHook(window)
|
|
window.$RefreshReg$ = () => {}
|
|
window.$RefreshSig$ = () => (type) => type
|
|
window.__vite_plugin_react_preamble_installed__ = true
|
|
`;
|
|
|
|
const isOutputChunk = (input: Rollup.OutputAsset | Rollup.OutputChunk): input is Rollup.OutputChunk => 'code' in input;
|
|
|
|
const renameFile = (source: string, destination: string): Plugin => {
|
|
if (typeof source !== 'string' || typeof destination !== 'string') {
|
|
throw new Error('Invalid arguments for renameFile');
|
|
}
|
|
|
|
return {
|
|
name: 'crx:rename-file',
|
|
apply: 'build',
|
|
enforce: 'post',
|
|
generateBundle(options, bundle) {
|
|
const file = bundle[source];
|
|
if (!file) return;
|
|
file.fileName = destination;
|
|
},
|
|
};
|
|
};
|
|
|
|
const fixManifestOptionsPage = (): Plugin => ({
|
|
name: 'fix-manifest-options-page',
|
|
apply: 'build',
|
|
enforce: 'post',
|
|
generateBundle(_, bundle) {
|
|
for (const fileName of Object.keys(bundle)) {
|
|
if (fileName.startsWith('assets/crx-manifest')) {
|
|
const chunk = bundle[fileName];
|
|
if (!chunk) continue;
|
|
|
|
if (isOutputChunk(chunk)) {
|
|
chunk.code = chunk.code.replace(
|
|
/"options_page":"src\/pages\/options\/index.html"/,
|
|
`"options_page":"options.html"`
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
});
|
|
|
|
let config: ResolvedConfig;
|
|
let server: ViteDevServer;
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig({
|
|
plugins: [
|
|
react(),
|
|
UnoCSS(),
|
|
Icons({ compiler: 'jsx', jsx: 'react' }),
|
|
crx({ manifest }),
|
|
fixManifestOptionsPage(),
|
|
inspect(),
|
|
{
|
|
name: 'public-transform',
|
|
apply: 'serve',
|
|
transform(code, id) {
|
|
if (id.endsWith('.tsx') || id.endsWith('.ts') || id.endsWith('?url')) {
|
|
return code.replace(
|
|
/(['"])(\/public\/.*?)(['"])/g,
|
|
(_, quote1, path, quote2) => `chrome.runtime.getURL(${quote1}${path}${quote2})`
|
|
);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'public-transform',
|
|
apply: 'build',
|
|
transform(code, id) {
|
|
if (id.endsWith('.tsx') || id.endsWith('.ts') || id.endsWith('?url')) {
|
|
return code.replace(
|
|
/(['"])(__VITE_ASSET__.*?__)(['"])/g,
|
|
(_, quote1, path, quote2) => `chrome.runtime.getURL(${quote1}${path}${quote2})`
|
|
);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'public-css-dev-transform',
|
|
apply: 'serve',
|
|
enforce: 'post',
|
|
transform(code, id) {
|
|
if (process.env.NODE_ENV === 'development' && (id.endsWith('.css') || id.endsWith('.scss'))) {
|
|
return code.replace(
|
|
/url\((.*?)\)/g,
|
|
(_, path) =>
|
|
`url(\\"" + chrome.runtime.getURL(${path
|
|
.replaceAll(`\\"`, `"`)
|
|
.replace(/public\//, '')}) + "\\")`
|
|
);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'public-transform2',
|
|
// enforce: 'post',
|
|
transform(code, id) {
|
|
if (id.replace(/\?used$/, '').endsWith('.scss')) {
|
|
const transformedCode = code.replace(
|
|
/(__VITE_ASSET__.*?__)/g,
|
|
(_, path) => `chrome-extension://__MSG_@@extension_id__${path}`
|
|
);
|
|
return transformedCode;
|
|
}
|
|
return code;
|
|
},
|
|
},
|
|
renameFile('src/pages/debug/index.html', 'debug.html'),
|
|
renameFile('src/pages/options/index.html', 'options.html'),
|
|
renameFile('src/pages/calendar/index.html', 'calendar.html'),
|
|
renameFile('src/pages/report/index.html', 'report.html'),
|
|
vitePluginRunCommandOnDemand({
|
|
afterServerStart: 'pnpm gulp forceDisableUseDynamicUrl',
|
|
closeBundle: 'pnpm gulp forceDisableUseDynamicUrl',
|
|
}),
|
|
],
|
|
resolve: {
|
|
alias: {
|
|
src: root,
|
|
'@assets': assetsDir,
|
|
'@pages': pagesDir,
|
|
'@public': publicDir,
|
|
'@shared': resolve(root, 'shared'),
|
|
'@background': resolve(pagesDir, 'background'),
|
|
'@views': resolve(root, 'views'),
|
|
},
|
|
},
|
|
server: {
|
|
strictPort: true,
|
|
port: 5173,
|
|
hmr: {
|
|
clientPort: 5173,
|
|
},
|
|
proxy: {
|
|
'/debug.html': {
|
|
target: 'http://localhost:5173',
|
|
rewrite: path => path.replace('debug', 'src/pages/debug/index'),
|
|
},
|
|
'/calendar.html': {
|
|
target: 'http://localhost:5173',
|
|
rewrite: path => path.replace('calendar', 'src/pages/calendar/index'),
|
|
},
|
|
'/options.html': {
|
|
target: 'http://localhost:5173',
|
|
rewrite: path => path.replace('options', 'src/pages/options/index'),
|
|
},
|
|
'/report.html': {
|
|
target: 'http://localhost:5173',
|
|
rewrite: path => path.replace('report', 'src/pages/report/index'),
|
|
},
|
|
},
|
|
},
|
|
build: {
|
|
target: ['chrome120', 'edge120', 'firefox120'],
|
|
emptyOutDir: true,
|
|
reportCompressedSize: false,
|
|
rollupOptions: {
|
|
input: {
|
|
debug: 'src/pages/debug/index.html',
|
|
calendar: 'src/pages/calendar/index.html',
|
|
options: 'src/pages/options/index.html',
|
|
report: 'src/pages/report/index.html',
|
|
},
|
|
output: {
|
|
chunkFileNames: `assets/[name]-[hash].js`,
|
|
assetFileNames: `assets/[name]-[hash][extname]`,
|
|
},
|
|
},
|
|
},
|
|
test: {
|
|
coverage: {
|
|
provider: 'v8',
|
|
},
|
|
},
|
|
});
|