const path = require('path'); const fs = require('fs-extra'); const CopyPlugin = require('copy-webpack-plugin'); const WebpackOnBuildPlugin = require('on-build-webpack'); const tar = require('tar'); const glob = require('glob'); function readManifest(manifestPath) { const content = fs.readFileSync(manifestPath, 'utf8'); const output = JSON.parse(content); if (!output.id) throw new Error(`Manifest plugin ID is not set in ${manifestPath}`); return output; } function createPluginArchive(sourceDir, destPath) { const distFiles = glob.sync(`${sourceDir}/**/*`, { nodir: true }) .map(f => f.substr(sourceDir.length + 1)); if (!distFiles.length) { // Usually means there's an error, which is going to be printed by // webpack console.info('Plugin archive was not created because the "dist" directory is empty'); return; } fs.removeSync(destPath); tar.create( { strict: true, portable: true, file: destPath, cwd: sourceDir, sync: true, }, distFiles ); console.info(`Plugin archive has been created in ${destPath}`); } const distDir = path.resolve(__dirname, 'dist'); const srcDir = path.resolve(__dirname, 'src'); const manifestPath = `${srcDir}/manifest.json`; const manifest = readManifest(manifestPath); const archiveFilePath = path.resolve(__dirname, `${manifest.id}.jpl`); fs.removeSync(distDir); module.exports = { mode: 'production', entry: './src/index.ts', target: 'node', module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { alias: { api: path.resolve(__dirname, 'api'), }, extensions: ['.tsx', '.ts', '.js'], }, output: { filename: 'index.js', path: distDir, }, plugins: [ new CopyPlugin({ patterns: [ { from: '**/*', context: path.resolve(__dirname, 'src'), to: path.resolve(__dirname, 'dist'), globOptions: { ignore: [ '**/*.ts', '**/*.tsx', ], }, }, ], }), new WebpackOnBuildPlugin(function() { createPluginArchive(distDir, archiveFilePath); }), ], };