101 lines
3.2 KiB
JavaScript
101 lines
3.2 KiB
JavaScript
// @ts-check
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
|
|
import rollupPluginReplace from '@rollup/plugin-replace';
|
|
import rollupPluginTypescript from '@rollup/plugin-typescript';
|
|
import * as rollup from 'rollup';
|
|
/** @type {any} */
|
|
/** @type {any} */
|
|
import typescript from 'typescript';
|
|
|
|
|
|
import {absolutePath} from './paths.js';
|
|
import {createTask} from './task.js';
|
|
|
|
async function getVersion() {
|
|
const file = await fs.promises.readFile(new URL('../package.json', import.meta.url), 'utf8');
|
|
const p = JSON.parse(file);
|
|
return p.version;
|
|
}
|
|
|
|
/** @type {string[]} */
|
|
let watchFiles = [];
|
|
|
|
async function bundleAPIModule({debug, watch}, moduleType, dest) {
|
|
const src = absolutePath('src/api/index.ts');
|
|
const bundle = await rollup.rollup({
|
|
input: src,
|
|
onwarn: (error) => {
|
|
throw error;
|
|
},
|
|
plugins: [
|
|
// @ts-expect-error This expression is not callable
|
|
rollupPluginTypescript({
|
|
rootDir: absolutePath('.'),
|
|
typescript,
|
|
tsconfig: absolutePath('src/api/tsconfig.json'),
|
|
noImplicitAny: debug ? false : true,
|
|
noUnusedLocals: debug ? false : true,
|
|
strictNullChecks: debug ? false : true,
|
|
strictPropertyInitialization: false,
|
|
removeComments: debug ? false : true,
|
|
sourceMap: debug ? true : false,
|
|
inlineSources: debug ? true : false,
|
|
noEmitOnError: watch ? false : true,
|
|
outDir: absolutePath('.'),
|
|
cacheDir: debug ? `${fs.realpathSync(os.tmpdir())}/darkreader_api_typescript_cache` : undefined,
|
|
}),
|
|
// @ts-expect-error This expression is not callable
|
|
rollupPluginReplace({
|
|
preventAssignment: true,
|
|
__DEBUG__: false,
|
|
__CHROMIUM_MV2__: false,
|
|
__CHROMIUM_MV3__: false,
|
|
__FIREFOX_MV2__: false,
|
|
__THUNDERBIRD__: false,
|
|
__TEST__: false,
|
|
__PLUS__: false,
|
|
}),
|
|
].filter(Boolean),
|
|
});
|
|
watchFiles = bundle.watchFiles;
|
|
await bundle.write({
|
|
banner: `/**\n * Dark Reader v${await getVersion()}\n * https://darkreader.org/\n */\n`,
|
|
// TODO: Consider removing next line
|
|
esModule: true,
|
|
file: dest,
|
|
strict: true,
|
|
format: moduleType,
|
|
name: 'DarkReader',
|
|
sourcemap: debug ? 'inline' : false,
|
|
});
|
|
}
|
|
|
|
async function bundleAPI({debug, watch}) {
|
|
await bundleAPIModule({debug, watch}, 'umd', 'darkreader.js');
|
|
await bundleAPIModule({debug, watch}, 'esm', 'darkreader.mjs');
|
|
}
|
|
|
|
const bundleAPITask = createTask(
|
|
'bundle-api',
|
|
bundleAPI,
|
|
).addWatcher(
|
|
() => {
|
|
return watchFiles;
|
|
},
|
|
async (changedFiles, watcher) => {
|
|
const oldWatchFiles = watchFiles;
|
|
await bundleAPI({debug: true, watch: true});
|
|
|
|
watcher.unwatch(
|
|
oldWatchFiles.filter((oldFile) => !watchFiles.includes(oldFile))
|
|
);
|
|
watcher.add(
|
|
watchFiles.filter((newFile) => oldWatchFiles.includes(newFile))
|
|
);
|
|
},
|
|
);
|
|
|
|
export default bundleAPITask;
|