diff --git a/packages/generator-joplin/generators/app/templates/package_TEMPLATE.json b/packages/generator-joplin/generators/app/templates/package_TEMPLATE.json index c81c3e364..a986baf8c 100644 --- a/packages/generator-joplin/generators/app/templates/package_TEMPLATE.json +++ b/packages/generator-joplin/generators/app/templates/package_TEMPLATE.json @@ -2,7 +2,7 @@ "name": "<%= packageName %>", "version": "1.0.0", "scripts": { - "dist": "webpack --joplin-plugin-config buildMain && webpack --joplin-plugin-config buildExtraScripts && webpack --joplin-plugin-config createArchive", + "dist": "webpack --env joplin-plugin-config=buildMain && webpack --env joplin-plugin-config=buildExtraScripts && webpack --env joplin-plugin-config=createArchive", "prepare": "npm run dist", "update": "npm install -g generator-joplin && yo joplin --update" }, @@ -14,18 +14,16 @@ "publish" ], "devDependencies": { - "@types/node": "^14.0.14", + "@types/node": "^18.7.13", "chalk": "^4.1.0", - "copy-webpack-plugin": "^6.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "on-build-webpack": "^0.1.0", - "tar": "^6.0.5", - "ts-loader": "^7.0.5", - "typescript": "^3.9.3", - "webpack": "^4.43.0", - "webpack-cli": "^3.3.11", - "yargs": "^16.2.0", + "copy-webpack-plugin": "^11.0.0", + "fs-extra": "^10.1.0", + "glob": "^8.0.3", + "tar": "^6.1.11", + "ts-loader": "^9.3.1", + "typescript": "^4.8.2", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", "@joplin/lib": "~2.9" } } diff --git a/packages/generator-joplin/generators/app/templates/webpack.config.js b/packages/generator-joplin/generators/app/templates/webpack.config.js index e9bf6de34..2fc2fdf67 100644 --- a/packages/generator-joplin/generators/app/templates/webpack.config.js +++ b/packages/generator-joplin/generators/app/templates/webpack.config.js @@ -11,7 +11,6 @@ const crypto = require('crypto'); const fs = require('fs-extra'); const chalk = require('chalk'); const CopyPlugin = require('copy-webpack-plugin'); -const WebpackOnBuildPlugin = require('on-build-webpack'); const tar = require('tar'); const glob = require('glob'); const execSync = require('child_process').execSync; @@ -35,6 +34,16 @@ const manifest = readManifest(manifestPath); const pluginArchiveFilePath = path.resolve(publishDir, `${manifest.id}.jpl`); const pluginInfoFilePath = path.resolve(publishDir, `${manifest.id}.json`); +const { builtinModules } = require('node:module'); + +// Webpack5 doesn't polyfill by default and displays a warning when attempting to require() built-in +// node modules. Set these to false to prevent Webpack from warning about not polyfilling these modules. +// We don't need to polyfill because the plugins run in Electron's Node environment. +const moduleFallback = {}; +for (const moduleName of builtinModules) { + moduleFallback[moduleName] = false; +} + function validatePackageJson() { const content = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); if (!content.name || content.name.indexOf('joplin-plugin-') !== 0) { @@ -164,6 +173,7 @@ const pluginConfig = Object.assign({}, baseConfig, { alias: { api: path.resolve(__dirname, 'api'), }, + fallback: moduleFallback, // JSON files can also be required from scripts so we include this. // https://github.com/joplin/plugin-bibtex/pull/2 extensions: ['.js', '.tsx', '.ts', '.json'], @@ -198,6 +208,7 @@ const extraScriptConfig = Object.assign({}, baseConfig, { alias: { api: path.resolve(__dirname, 'api'), }, + fallback: moduleFallback, extensions: ['.js', '.tsx', '.ts', '.json'], }, }); @@ -205,11 +216,18 @@ const extraScriptConfig = Object.assign({}, baseConfig, { const createArchiveConfig = { stats: 'errors-only', entry: './dist/index.js', + resolve: { + fallback: moduleFallback, + }, output: { filename: 'index.js', path: publishDir, }, - plugins: [new WebpackOnBuildPlugin(onBuildCompleted)], + plugins: [{ + apply(compiler) { + compiler.hooks.done.tap('archiveOnBuildListener', onBuildCompleted); + }, + }], }; function resolveExtraScriptPath(name) { @@ -250,11 +268,8 @@ function buildExtraScriptConfigs(userConfig) { return output; } -function main(processArgv) { - const yargs = require('yargs/yargs'); - const argv = yargs(processArgv).argv; - - const configName = argv['joplin-plugin-config']; +function main(environ) { + const configName = environ['joplin-plugin-config']; if (!configName) throw new Error('A config file must be specified via the --joplin-plugin-config flag'); // Webpack configurations run in parallel, while we need them to run in @@ -292,19 +307,22 @@ function main(processArgv) { return configs[configName]; } -let exportedConfigs = []; -try { - exportedConfigs = main(process.argv); -} catch (error) { - console.error(chalk.red(error.message)); - process.exit(1); -} +module.exports = (env) => { + let exportedConfigs = []; -if (!exportedConfigs.length) { - // Nothing to do - for example where there are no external scripts to - // compile. - process.exit(0); -} + try { + exportedConfigs = main(env); + } catch (error) { + console.error(error.message); + process.exit(1); + } -module.exports = exportedConfigs; + if (!exportedConfigs.length) { + // Nothing to do - for example where there are no external scripts to + // compile. + process.exit(0); + } + + return exportedConfigs; +};