UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

278 lines (230 loc) 13.8 kB
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <base data-ice="baseUrl" href="../../"> <title data-ice="title">api/import.js | API Document</title> <link type="text/css" rel="stylesheet" href="css/style.css"> <link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css"> <script src="script/prettify/prettify.js"></script> <script src="script/manual.js"></script> </head> <body class="layout-container" data-ice="rootContainer"> <header> <a href="./">Home</a> <a href="identifiers.html">Reference</a> <a href="source.html">Source</a> <a data-ice="repoURL" href="https://github.com/electron-userland/electron-forge" class="repo-url-github">Repository</a> <div class="search-box"> <span> <img src="./image/search.png"> <span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span> </span> <ul class="search-result"></ul> </div> </header> <nav class="navigation" data-ice="nav"><div> <ul> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-import">import</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-init">init</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-install">install</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-lint">lint</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-make">make</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-package">package</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-publish">publish</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-start">start</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-ImportOptions">ImportOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-InitOptions">InitOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-InstallOptions">InstallOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-LintOptions">LintOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-MakeOptions">MakeOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-PackageOptions">PackageOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-PublishOptions">PublishOptions</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-StartOptions">StartOptions</a></span></span></li> </ul> </div> </nav> <div class="content" data-ice="content"><h1 data-ice="title">api/import.js</h1> <pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import debug from &apos;debug&apos;; import fs from &apos;fs-promise&apos;; import inquirer from &apos;inquirer&apos;; import path from &apos;path&apos;; import { spawn as yarnOrNPMSpawn, hasYarn } from &apos;yarn-or-npm&apos;; import initGit from &apos;../init/init-git&apos;; import { deps, devDeps } from &apos;../init/init-npm&apos;; import asyncOra from &apos;../util/ora-handler&apos;; import installDepList from &apos;../util/install-dependencies&apos;; import readPackageJSON from &apos;../util/read-package-json&apos;; import confirmIfInteractive from &apos;../util/confirm-if-interactive&apos;; const d = debug(&apos;electron-forge:import&apos;); /** * @typedef {Object} ImportOptions * @property {string} [dir=process.cwd()] The path to the app to be imported * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually */ /** * Attempt to import a given module directory to the Electron Forge standard. * * - Replaces the prebuilt electron package with the one that integrates with `electron-compile` * - Sets up `git` and the correct NPM dependencies * - Adds a template forge config to `package.json` * * @param {ImportOptions} providedOptions - Options for the import method * @return {Promise} Will resolve when the import process is complete */ export default async (providedOptions = {}) =&gt; { const { dir, interactive } = Object.assign({ dir: process.cwd(), interactive: false, }, providedOptions); asyncOra.interactive = interactive; d(`Attempting to import project in: ${dir}`); if (!await fs.exists(dir) || !await fs.exists(path.resolve(dir, &apos;package.json&apos;))) { console.error(`We couldn&apos;t find a project in: ${dir}`.red); process.exit(1); } // eslint-disable-next-line max-len const confirm = await confirmIfInteractive(interactive, `WARNING: We will now attempt to import: &quot;${dir}&quot;. This will involve modifying some files, are you sure you want to continue?`); if (!confirm) { process.exit(1); } await initGit(dir); let packageJSON = await readPackageJSON(dir); if (packageJSON.config &amp;&amp; packageJSON.config.forge) { console.warn(&apos;It looks like this project is already configured for &quot;electron-forge&quot;&apos;.green); const shouldContinue = await confirmIfInteractive(interactive, &apos;Are you sure you want to continue?&apos;); if (!shouldContinue) { process.exit(0); } } // eslint-disable-next-line max-len const shouldChangeMain = await confirmIfInteractive(interactive, &apos;Do you want us to change the &quot;main&quot; attribute of your package.json? If you are currently using babel and pointing to a &quot;build&quot; directory say yes.&apos;, false); if (shouldChangeMain) { const { newMain } = await inquirer.createPromptModule()({ type: &apos;input&apos;, name: &apos;newMain&apos;, default: packageJSON.main, message: &apos;Enter the relative path to your uncompiled main file&apos;, }); packageJSON.main = newMain; } packageJSON.dependencies = packageJSON.dependencies || {}; packageJSON.devDependencies = packageJSON.devDependencies || {}; const keys = Object.keys(packageJSON.dependencies).concat(Object.keys(packageJSON.devDependencies)); const buildToolPackages = { &apos;electron-builder&apos;: &apos;provides mostly equivalent functionality&apos;, &apos;electron-download&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-installer-debian&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-installer-dmg&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-installer-flatpak&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-installer-redhat&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-osx-sign&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-packager&apos;: &apos;already uses this module as a transitive dependency&apos;, &apos;electron-winstaller&apos;: &apos;already uses this module as a transitive dependency&apos;, }; let electronName; for (const key of keys) { if (key === &apos;electron&apos; || key === &apos;electron-prebuilt&apos;) { delete packageJSON.dependencies[key]; delete packageJSON.devDependencies[key]; electronName = key; } else if (buildToolPackages[key]) { const explanation = buildToolPackages[key]; // eslint-disable-next-line max-len const shouldRemoveDependency = await confirmIfInteractive(interactive, `Do you want us to remove the &quot;${key}&quot; dependency in package.json? Electron Forge ${explanation}.`); if (shouldRemoveDependency) { delete packageJSON.dependencies[key]; delete packageJSON.devDependencies[key]; } } } const writeChanges = async () =&gt; { await asyncOra(&apos;Writing modified package.json file&apos;, async () =&gt; { await fs.writeFile(path.resolve(dir, &apos;package.json&apos;), `${JSON.stringify(packageJSON, null, 2)}\n`); }); }; let electronVersion; if (electronName) { const electronPackageJSON = await readPackageJSON(path.resolve(dir, &apos;node_modules&apos;, electronName)); electronVersion = electronPackageJSON.version; packageJSON.devDependencies[&apos;electron-prebuilt-compile&apos;] = electronVersion; } await writeChanges(); if (electronName) { await asyncOra(&apos;Pruning deleted modules&apos;, async () =&gt; { await new Promise((resolve) =&gt; { d(&apos;attempting to prune node_modules in:&apos;, dir); const child = yarnOrNPMSpawn(hasYarn() ? [] : [&apos;prune&apos;], { cwd: dir, stdio: &apos;ignore&apos;, }); child.on(&apos;exit&apos;, () =&gt; resolve()); }); }); await asyncOra(&apos;Installing dependencies&apos;, async () =&gt; { d(&apos;deleting old dependencies forcefully&apos;); await fs.remove(path.resolve(dir, &apos;node_modules/.bin/electron&apos;)); await fs.remove(path.resolve(dir, &apos;node_modules/.bin/electron.cmd&apos;)); await fs.remove(path.resolve(dir, &apos;node_modules&apos;, electronName)); d(&apos;installing dependencies&apos;); await installDepList(dir, deps); d(&apos;installing devDependencies&apos;); await installDepList(dir, devDeps, true); d(&apos;installing electron-prebuilt-compile&apos;); await installDepList(dir, [`electron-prebuilt-compile@${electronVersion}`], false, true); }); } packageJSON = await readPackageJSON(dir); packageJSON.config = packageJSON.config || {}; const templatePackageJSON = await readPackageJSON(path.resolve(__dirname, &apos;../tmpl&apos;)); packageJSON.config.forge = templatePackageJSON.config.forge; await writeChanges(); await asyncOra(&apos;Fixing .gitignore&apos;, async () =&gt; { if (await fs.exists(path.resolve(dir, &apos;.gitignore&apos;))) { const gitignore = await fs.readFile(path.resolve(dir, &apos;.gitignore&apos;)); if (!gitignore.includes(&apos;out&apos;)) { await fs.writeFile(path.resolve(dir, &apos;.gitignore&apos;), `${gitignore}\nout/`); } } }); let babelConfig = packageJSON.babel; const babelPath = path.resolve(dir, &apos;.babelrc&apos;); if (!babelConfig &amp;&amp; await fs.exists(babelPath)) { babelConfig = JSON.parse(await fs.readFile(babelPath, &apos;utf8&apos;)); } if (babelConfig) { await asyncOra(&apos;Porting original babel config&apos;, async () =&gt; { let compileConfig = {}; const compilePath = path.resolve(dir, &apos;.compilerc&apos;); if (await fs.exists(compilePath)) { compileConfig = JSON.parse(await fs.readFile(compilePath, &apos;utf8&apos;)); } await fs.writeFile(compilePath, JSON.stringify(Object.assign(compileConfig, { &apos;application/javascript&apos;: babelConfig, }), null, 2)); }); console.info(&apos;NOTE: You might be able to remove your `.compilerc` file completely if you are only using the `es2015` and `react` presets&apos;.yellow); } console.info(` We have ATTEMPTED to convert your app to be in a format that electron-forge understands. Nothing much will have changed but we added the ${&apos;&quot;electron-prebuilt-compile&quot;&apos;.cyan} dependency. This is \ the dependency you must version bump to get newer versions of Electron. We also tried to import any build tooling you already had but we can&apos;t get everything. You might need to convert any CLI/gulp/grunt tasks yourself. Also please note if you are using \`preload\` scripts you need to follow the steps outlined \ at https://github.com/electron-userland/electron-forge/wiki/Using-%27preload%27-scripts Thanks for using ${&apos;&quot;electron-forge&quot;&apos;.green}!!!`); }; </code></pre> </div> <footer class="footer"> Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(0.5.2)</span><img src="./image/esdoc-logo-mini-black.png"></a> </footer> <script src="script/search_index.js"></script> <script src="script/search.js"></script> <script src="script/pretty-print.js"></script> <script src="script/inherited-summary.js"></script> <script src="script/test-summary.js"></script> <script src="script/inner-link.js"></script> <script src="script/patch-for-local.js"></script> </body> </html>