import fs from "fs"; import chalk from "chalk"; import { execSync } from "child_process"; import { dependencies } from "../../package.json"; if (dependencies) { const dependenciesKeys = Object.keys(dependencies); const nativeDeps = fs.readdirSync("node_modules").filter(folder => fs.existsSync(`node_modules/${folder}/binding.gyp`)); if (nativeDeps.length === 0) { process.exit(0); } try { // Find the reason for why the dependency is installed. If it is installed // because of a devDependency then that is okay. Warn when it is installed // because of a dependency const { dependencies: dependenciesObject } = JSON.parse(execSync(`npm ls ${nativeDeps.join(" ")} --json`).toString()); const rootDependencies = Object.keys(dependenciesObject); const filteredRootDependencies = rootDependencies.filter(rootDependency => dependenciesKeys.includes(rootDependency)); if (filteredRootDependencies.length > 0) { const plural = filteredRootDependencies.length > 1; console.log(` ${chalk.whiteBright.bgYellow.bold("Webpack does not work with native dependencies.")} ${chalk.bold(filteredRootDependencies.join(", "))} ${plural ? "are native dependencies" : "is a native dependency"} and should be installed inside of the "./release/app" folder. First, uninstall the packages from "./package.json": ${chalk.whiteBright.bgGreen.bold("npm uninstall your-package")} ${chalk.bold('Then, instead of installing the package to the root "./package.json":')} ${chalk.whiteBright.bgRed.bold("npm install your-package")} ${chalk.bold('Install the package to "./release/app/package.json"')} ${chalk.whiteBright.bgGreen.bold("cd ./release/app && npm install your-package")} Read more about native dependencies at: ${chalk.bold("https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure")} `); process.exit(1); } } catch (e) { console.log("Native dependencies could not be checked"); } }