import * as rollup from 'rollup'; import commonjs from '@rollup/plugin-commonjs'; import nodeResolve from '@rollup/plugin-node-resolve'; import uglify from '@rollup/plugin-terser'; import replace from '@rollup/plugin-replace'; import chokidar from 'chokidar'; import path from 'path'; import { relative } from './util.js'; import { promises as fs } from 'fs'; const pkgPath = relative(import.meta, '..', 'package.json'); const pkgString = (await fs.readFile(pkgPath)).toString(); const pkg = JSON.parse(pkgString); const isProd = process.env.NODE_ENV === 'production'; const version = process.env.VERSION || pkg.version; /** * @param {{ * input: string, * output?: string, * globalName?: string, * plugins?: Array * }} opts */ async function build(opts) { await rollup .rollup({ input: opts.input, plugins: [ ...(opts.plugins || []), commonjs(), nodeResolve(), replace({ __VERSION__: version, }), ], onwarn(message) { if (message.code === 'UNRESOLVED_IMPORT') { throw new Error( `Could not resolve module ` + message.source + `. Try running 'npm install' or using rollup's 'external' option if this is an external dependency. ` + `Module ${message.source} is imported in ${message.importer}` ); } }, }) .then(bundle => { const dest = 'lib/' + (opts.output || opts.input); console.log(dest); return bundle.write({ format: 'iife', output: opts.globalName ? { name: opts.globalName } : {}, file: dest, strict: false, }); }); } async function buildCore() { const promises = []; promises.push( build({ input: 'src/core/index.js', output: 'docsify.js', }) ); if (isProd) { promises.push( build({ input: 'src/core/index.js', output: 'docsify.min.js', plugins: [uglify()], }) ); } await Promise.all(promises); } async function buildAllPlugin() { const plugins = [ { name: 'search', input: 'search/index.js' }, { name: 'ga', input: 'ga.js' }, { name: 'gtag', input: 'gtag.js' }, { name: 'matomo', input: 'matomo.js' }, { name: 'emoji', input: 'emoji.js' }, { name: 'external-script', input: 'external-script.js' }, { name: 'front-matter', input: 'front-matter/index.js' }, { name: 'zoom-image', input: 'zoom-image.js' }, { name: 'disqus', input: 'disqus.js' }, { name: 'gitalk', input: 'gitalk.js' }, ]; const promises = plugins.map(item => { return build({ input: 'src/plugins/' + item.input, output: 'plugins/' + item.name + '.js', }); }); if (isProd) { plugins.forEach(item => { promises.push( build({ input: 'src/plugins/' + item.input, output: 'plugins/' + item.name + '.min.js', plugins: [uglify()], }) ); }); } await Promise.all(promises); } async function main() { if (!isProd) { chokidar .watch(['src/core', 'src/plugins'], { atomic: true, awaitWriteFinish: { stabilityThreshold: 1000, pollInterval: 100, }, }) .on('change', p => { console.log('[watch] ', p); const dirs = p.split(path.sep); if (dirs[1] === 'core') { buildCore(); } else if (dirs[2]) { const name = path.basename(dirs[2], '.js'); const input = `src/plugins/${name}${ /\.js/.test(dirs[2]) ? '' : '/index' }.js`; build({ input, output: 'plugins/' + name + '.js', }); } }) .on('ready', () => { console.log('[start]'); buildCore(); buildAllPlugin(); }); } else { await Promise.all([buildCore(), buildAllPlugin()]); } } main().catch(e => { console.error(e); process.exit(1); });