webpacker-electron 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6a19dff91639322ec84b6bda44ad1bd6eb3c63b46de1d772364fd11c958a9030
4
+ data.tar.gz: 06f7eec37a5c5681da7b83ffae1558da61cbaa6f18af70a3933913a2cf36016b
5
+ SHA512:
6
+ metadata.gz: f6b23f497b1eb37f2415e4bae735aadb9538eee018bb2ea9ec45f517371d0c922fb5b56cbe9e818d1ba42161cc446467bece1293d6ada80296d607f783857000
7
+ data.tar.gz: 686884c0190c08bf9c780eb0a00f8e84b43de45a03102e11014fb0813c852246ceca1c0efcfa8aeb37a04ab06716e6315d12fa5ed861b5acc17d2dfae41d7962
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2021 hpneo
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # Webpacker::Electron
2
+ Webpacker::Electron makes it easy to reuse your webpack-based JavaScript application files within an Electron app.
3
+
4
+ ## Installation
5
+ Add this line to your application's `Gemfile`:
6
+
7
+ ```ruby
8
+ gem 'webpacker-electron'
9
+ ```
10
+
11
+ And then execute:
12
+ ```bash
13
+ bundle
14
+ ```
15
+
16
+ Or install it yourself as:
17
+
18
+ ```ruby
19
+ bundle add webpacker-electron
20
+ ```
21
+
22
+ Finally, run the following to install Webpacker::Electron:
23
+
24
+ ```bash
25
+ bundle exec rails webpacker:install:electron
26
+ ```
27
+
28
+ This command will create the following files:
29
+
30
+ * `config/electron-builder.yml`: Configuration file for [`electron-builder`](https://www.electron.build/).
31
+ * `config/webpack/electron/main/development.js`: Configuration file for Electron's main process (in development mode).
32
+ * `config/webpack/electron/main/production.js`: Configuration file for Electron's main process (in production mode).
33
+ * `config/webpack/electron/renderer/development.js`: Configuration file for Electron's renderer process (in development mode).
34
+ * `config/webpack/electron/renderer/production.js`: Configuration file for Electron's renderer process (in production mode).
35
+ * `lib/javascript/babel.js`: Babel configuration specific for Electron's main process.
36
+ * `public/electron.html`: Template for the renderer process, for both webpack dev server and production build.
37
+ * `src/packs/electron/main.js`: JavaScript pack for Electron's main process.
38
+ * `src/packs/electron/renderer.js`: JavaScript pack for Electron's renderer process.
39
+
40
+ It also updates the following files:
41
+
42
+ * `.gitignore`: Ignores `public/dist` and `public/packs-electron`.
43
+ * `config/webpack/environment.js`: Ignore Electron's related packs.
44
+
45
+ It also installs the following packages:
46
+
47
+ * `@babel/register`
48
+ * `dotenv`
49
+ * `dotenv-webpack`
50
+ * `electron`
51
+ * `electron-builder`
52
+ * `electron-devtools-installer`
53
+ * `electron-notarize`
54
+ * `electron-debug`
55
+ * `electron-log`
56
+ * `electron-updater`
57
+ * `concurrently`
58
+ * `cross-env`
59
+
60
+ ## Usage
61
+ Once installed, you can start your JavaScript app in Rails as an Electron app with the following command:
62
+
63
+ ```bash
64
+ bundle exec rails webpacker:start:electron
65
+ ```
66
+
67
+ This task will run a webpack dev server for the renderer pack. Also, it will run `rails webpacker:start:electron:main` to start the actual Electron app.
68
+
69
+ ### Package the Electron app
70
+
71
+ To package the JavaScript application into an Electron app, run the following:
72
+
73
+ ```bash
74
+ rails webpacker:package:electron
75
+ ```
76
+
77
+ First, it will compile the main and renderer packs for Electron, and then it will put the resulting output in an Electron app using `electron-builder`.
78
+
79
+ The app will be generated in `public/dist`.
80
+
81
+ ## Contributing
82
+ Contribution directions go here.
83
+
84
+ ## License
85
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/setup"
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ require "rake/testtask"
6
+
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << 'test'
9
+ t.pattern = 'test/**/*_test.rb'
10
+ t.verbose = false
11
+ end
12
+
13
+ task default: :test
@@ -0,0 +1,52 @@
1
+ appId: com.worktimelabs.meet
2
+ productName: Worktime Meetings
3
+ extends: null
4
+ directories:
5
+ app: "."
6
+ buildResources: public/assets
7
+ output: public/dist/
8
+ files:
9
+ - "package.json"
10
+ - "!node_modules"
11
+ - from: public/packs-electron/
12
+ to: "."
13
+ filter: "**/main.production.js"
14
+ - from: public/packs-electron/
15
+ to: "."
16
+ filter: "**/index.html"
17
+ - from: public/packs-electron/
18
+ to: packs-electron/
19
+ filter: "**/*"
20
+ afterSign: lib/javascript/notarize.js
21
+ asar: true
22
+ extraMetadata:
23
+ main: "./main.production.js"
24
+ mac:
25
+ target:
26
+ - dmg
27
+ type: distribution
28
+ hardenedRuntime: true
29
+ entitlements: assets/entitlements.mac.plist
30
+ entitlementsInherit: assets/entitlements.mac.plist
31
+ gatekeeperAssess: false
32
+ dmg:
33
+ contents:
34
+ - x: 130
35
+ y: 220
36
+ - x: 410
37
+ y: 220
38
+ type: link
39
+ path: /Applications
40
+ win:
41
+ target:
42
+ - nsis
43
+ linux:
44
+ target:
45
+ - AppImage
46
+ category: Development
47
+ # extraResources:
48
+ # - ./assets/**
49
+ publish:
50
+ provider: github
51
+ owner: ableco
52
+ repo: worktime-meetings
@@ -0,0 +1,5 @@
1
+ process.env.NODE_ENV = process.env.NODE_ENV || "development";
2
+
3
+ const environment = require("../../environment");
4
+
5
+ module.exports = environment.toWebpackConfig();
@@ -0,0 +1,30 @@
1
+ process.env.NODE_ENV = process.env.NODE_ENV || "production";
2
+
3
+ const path = require("path");
4
+ const { config } = require("@rails/webpacker");
5
+ const environment = require("../../environment");
6
+
7
+ environment.entry.delete("application");
8
+
9
+ const electronConfig = {
10
+ target: "electron-main",
11
+ entry: {
12
+ electron: path.resolve(
13
+ config.source_path,
14
+ config.source_entry_path,
15
+ "electron/main.js",
16
+ ),
17
+ },
18
+ output: {
19
+ path: path.resolve(config.outputPath, "../", "packs-electron"),
20
+ filename: "main.production.js",
21
+ },
22
+ node: {
23
+ __dirname: false,
24
+ __filename: false,
25
+ },
26
+ };
27
+
28
+ environment.config.merge(electronConfig);
29
+
30
+ module.exports = environment.toWebpackConfig();
@@ -0,0 +1,70 @@
1
+ /* eslint-disable unicorn/no-process-exit */
2
+ process.env.NODE_ENV = process.env.NODE_ENV || "development";
3
+
4
+ const port = process.env.ELECTRON_PORT || 1212;
5
+ const publicPath = `http://localhost:${port}/`;
6
+
7
+ const path = require("path");
8
+ const { spawn } = require("child_process");
9
+ const webpack = require("webpack");
10
+ const DotEnvPlugin = require("dotenv-webpack");
11
+ const HtmlWebpackPlugin = require("html-webpack-plugin");
12
+ const { config } = require("@rails/webpacker");
13
+ const environment = require("../../environment");
14
+
15
+ environment.entry.delete("application");
16
+
17
+ const electronConfig = {
18
+ target: "electron-renderer",
19
+ entry: {
20
+ electron: path.resolve(
21
+ "./",
22
+ config.source_path,
23
+ config.source_entry_path,
24
+ "electron/renderer.js",
25
+ ),
26
+ },
27
+ output: {
28
+ publicPath,
29
+ path: path.resolve(config.outputPath, "../", "packs-electron"),
30
+ filename: "renderer.development.js",
31
+ },
32
+ node: {
33
+ __dirname: false,
34
+ __filename: false,
35
+ },
36
+ plugins: [
37
+ new DotEnvPlugin(),
38
+ new webpack.LoaderOptionsPlugin({
39
+ debug: true,
40
+ }),
41
+ new HtmlWebpackPlugin({
42
+ title: "Worktime Meetings",
43
+ template: path.resolve(config.outputPath, "../", "electron.html"),
44
+ }),
45
+ ],
46
+ devServer: {
47
+ port,
48
+ publicPath,
49
+ contentBase: path.resolve(config.outputPath, "../", "packs-electron"),
50
+ historyApiFallback: {
51
+ verbose: true,
52
+ disableDotRule: false,
53
+ },
54
+ before() {
55
+ console.log("Starting Main Process...");
56
+
57
+ spawn("bin/rails", ["webpacker:start:electron:main"], {
58
+ shell: true,
59
+ env: process.env,
60
+ stdio: "inherit",
61
+ })
62
+ .on("close", (code) => process.exit(code))
63
+ .on("error", (spawnError) => console.error(spawnError));
64
+ },
65
+ },
66
+ };
67
+
68
+ environment.config.merge(electronConfig);
69
+
70
+ module.exports = environment.toWebpackConfig();
@@ -0,0 +1,37 @@
1
+ process.env.NODE_ENV = process.env.NODE_ENV || "production";
2
+
3
+ const path = require("path");
4
+ const DotEnvPlugin = require("dotenv-webpack");
5
+ const HtmlWebpackPlugin = require("html-webpack-plugin");
6
+ const { config } = require("@rails/webpacker");
7
+ const environment = require("../../environment");
8
+
9
+ environment.entry.delete("application");
10
+
11
+ const electronConfig = {
12
+ target: "electron-renderer",
13
+ entry: {
14
+ electron: path.resolve(
15
+ "./",
16
+ config.source_path,
17
+ config.source_entry_path,
18
+ "electron/renderer.js",
19
+ ),
20
+ },
21
+ output: {
22
+ path: path.resolve(config.outputPath, "../", "packs-electron"),
23
+ publicPath: "/packs-electron/",
24
+ filename: "renderer.production.js",
25
+ },
26
+ plugins: [
27
+ new DotEnvPlugin(),
28
+ new HtmlWebpackPlugin({
29
+ title: "Worktime Meetings",
30
+ template: path.resolve(config.outputPath, "../", "electron.html"),
31
+ }),
32
+ ],
33
+ };
34
+
35
+ environment.config.merge(electronConfig);
36
+
37
+ module.exports = environment.toWebpackConfig();
@@ -0,0 +1,23 @@
1
+ const path = require("path");
2
+
3
+ require("@babel/register")({
4
+ extensions: [".es6", ".es", ".jsx", ".js", ".mjs", ".ts", ".tsx"],
5
+ cwd: path.join(__dirname, "../.."),
6
+ overrides: [
7
+ {
8
+ test: "./src/packs/electron",
9
+ presets: [
10
+ [
11
+ "@babel/preset-env",
12
+ {
13
+ forceAllTransforms: true,
14
+ useBuiltIns: "entry",
15
+ corejs: 3,
16
+ modules: "auto",
17
+ exclude: ["transform-typeof-symbol"],
18
+ },
19
+ ],
20
+ ],
21
+ },
22
+ ],
23
+ });
@@ -0,0 +1,40 @@
1
+ const { notarize } = require("electron-notarize");
2
+ const YAML = require("yaml");
3
+ const fs = require("fs");
4
+ const { promisify } = require("util");
5
+
6
+ const readFile = promisify(fs.readFile);
7
+
8
+ exports.default = async function notarizeMacOS(context) {
9
+ const { electronPlatformName, appOutDir } = context;
10
+ if (electronPlatformName !== "darwin") {
11
+ return;
12
+ }
13
+
14
+ if (!process.env.CI) {
15
+ console.warn("Skipping notarizing step. Packaging is not running in CI");
16
+ return;
17
+ }
18
+
19
+ if (!("APPLE_ID" in process.env && "APPLE_ID_PASS" in process.env)) {
20
+ console.warn(
21
+ "Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set",
22
+ );
23
+ return;
24
+ }
25
+
26
+ const electronBuilderConfig = await readFile(
27
+ "../../config/electron-builder.yml",
28
+ "utf8",
29
+ );
30
+ const buildInfo = YAML.parse(electronBuilderConfig);
31
+
32
+ const appName = context.packager.appInfo.productFilename;
33
+
34
+ await notarize({
35
+ appBundleId: buildInfo.appId,
36
+ appPath: `${appOutDir}/${appName}.app`,
37
+ appleId: process.env.APPLE_ID,
38
+ appleIdPassword: process.env.APPLE_ID_PASS,
39
+ });
40
+ };
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Electron App</title>
6
+ </head>
7
+ <body>
8
+ </body>
9
+ </html>
@@ -0,0 +1,217 @@
1
+ /* eslint-disable no-console */
2
+ /**
3
+ * This module executes inside of electron's main process. You can start
4
+ * electron renderer process from here and communicate with the other processes
5
+ * through IPC.
6
+ */
7
+ import "core-js/stable";
8
+ import "regenerator-runtime/runtime";
9
+ import path from "path";
10
+ import { app, session, protocol, BrowserWindow, shell } from "electron";
11
+ import { autoUpdater } from "electron-updater";
12
+ import log from "electron-log";
13
+ import fs from "fs";
14
+ import { promisify } from "util";
15
+
16
+ const stat = promisify(fs.stat);
17
+
18
+ const FILE_NOT_FOUND = -6;
19
+
20
+ const getPath = async (path_) => {
21
+ try {
22
+ const result = await stat(path_);
23
+
24
+ if (result.isFile()) {
25
+ return path_;
26
+ }
27
+
28
+ if (result.isDirectory()) {
29
+ return getPath(path.join(path_, "index.html"));
30
+ }
31
+ } catch (_) {}
32
+ };
33
+
34
+ function serve(baseOptions) {
35
+ const options = Object.assign(
36
+ {
37
+ isCorsEnabled: true,
38
+ scheme: "app",
39
+ },
40
+ baseOptions,
41
+ );
42
+
43
+ if (!options.directory) {
44
+ throw new Error("The `directory` option is required");
45
+ }
46
+
47
+ options.directory = path.resolve(app.getAppPath(), options.directory);
48
+
49
+ const handler = async (request, callback) => {
50
+ const indexPath = path.join(options.directory, "index.html");
51
+ const filePath = path.join(
52
+ options.directory,
53
+ decodeURIComponent(new URL(request.url).pathname),
54
+ );
55
+ const resolvedPath = await getPath(filePath);
56
+ const fileExtension = path.extname(filePath);
57
+
58
+ if (
59
+ resolvedPath ||
60
+ !fileExtension ||
61
+ fileExtension === ".html" ||
62
+ fileExtension === ".asar"
63
+ ) {
64
+ callback({
65
+ path: resolvedPath || indexPath,
66
+ });
67
+ } else {
68
+ callback({ error: FILE_NOT_FOUND });
69
+ }
70
+ };
71
+
72
+ protocol.registerSchemesAsPrivileged([
73
+ {
74
+ scheme: options.scheme,
75
+ privileges: {
76
+ standard: true,
77
+ secure: true,
78
+ allowServiceWorkers: true,
79
+ supportFetchAPI: true,
80
+ corsEnabled: options.isCorsEnabled,
81
+ },
82
+ },
83
+ ]);
84
+
85
+ app.on("ready", () => {
86
+ const protocolSession = options.partition
87
+ ? session.fromPartition(options.partition)
88
+ : session.defaultSession;
89
+
90
+ protocolSession.protocol.registerFileProtocol(options.scheme, handler);
91
+ });
92
+
93
+ return async (window_) => {
94
+ await window_.loadURL(`${options.scheme}://-`);
95
+ };
96
+ }
97
+
98
+ const loadURL = serve({
99
+ directory: ".",
100
+ });
101
+
102
+ export default class AppUpdater {
103
+ constructor() {
104
+ log.transports.file.level = "info";
105
+ autoUpdater.logger = log;
106
+ autoUpdater.checkForUpdatesAndNotify();
107
+ }
108
+ }
109
+
110
+ let mainWindow = null;
111
+
112
+ if (process.env.NODE_ENV === "production") {
113
+ const sourceMapSupport = require("source-map-support");
114
+ sourceMapSupport.install();
115
+ }
116
+
117
+ if (
118
+ process.env.NODE_ENV === "development" ||
119
+ process.env.DEBUG_PROD === "true"
120
+ ) {
121
+ require("electron-debug")();
122
+ }
123
+
124
+ const installExtensions = async () => {
125
+ const installer = require("electron-devtools-installer");
126
+ const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
127
+ const extensions = ["REACT_DEVELOPER_TOOLS"];
128
+
129
+ return installer
130
+ .default(
131
+ extensions.map((name) => installer[name]),
132
+ forceDownload,
133
+ )
134
+ .catch(console.log);
135
+ };
136
+
137
+ const createWindow = async () => {
138
+ if (
139
+ process.env.NODE_ENV === "development" ||
140
+ process.env.DEBUG_PROD === "true"
141
+ ) {
142
+ await installExtensions();
143
+ }
144
+
145
+ const RESOURCES_PATH = app.isPackaged
146
+ ? path.join(process.resourcesPath, "assets")
147
+ : path.join(__dirname, "../assets");
148
+
149
+ const getAssetPath = (...paths) => {
150
+ return path.join(RESOURCES_PATH, ...paths);
151
+ };
152
+
153
+ mainWindow = new BrowserWindow({
154
+ show: false,
155
+ width: 1024,
156
+ height: 728,
157
+ icon: getAssetPath("icon.png"),
158
+ webPreferences: {
159
+ nodeIntegration: true,
160
+ devTools: true,
161
+ },
162
+ });
163
+
164
+ if (process.env.NODE_ENV === "development") {
165
+ mainWindow.loadURL("http://localhost:1212");
166
+ } else {
167
+ loadURL(mainWindow);
168
+ }
169
+ // @TODO: Use 'ready-to-show' event
170
+ // https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event
171
+ mainWindow.webContents.on("did-finish-load", () => {
172
+ if (!mainWindow) {
173
+ throw new Error('"mainWindow" is not defined');
174
+ }
175
+ if (process.env.START_MINIMIZED) {
176
+ mainWindow.minimize();
177
+ } else {
178
+ mainWindow.show();
179
+ mainWindow.focus();
180
+ }
181
+ });
182
+
183
+ mainWindow.webContents.session.clearStorageData();
184
+
185
+ mainWindow.on("closed", () => {
186
+ mainWindow = null;
187
+ });
188
+
189
+ // Open urls in the user's browser
190
+ mainWindow.webContents.on("new-window", (event, url) => {
191
+ event.preventDefault();
192
+ shell.openExternal(url);
193
+ });
194
+
195
+ // Remove this if your app does not use auto updates
196
+ new AppUpdater();
197
+ };
198
+
199
+ /**
200
+ * Add event listeners...
201
+ */
202
+
203
+ app.on("window-all-closed", () => {
204
+ // Respect the OSX convention of having the application in memory even
205
+ // after all windows have been closed
206
+ if (process.platform !== "darwin") {
207
+ app.quit();
208
+ }
209
+ });
210
+
211
+ app.whenReady().then(createWindow).catch(console.log);
212
+
213
+ app.on("activate", () => {
214
+ // On macOS it's common to re-create a window in the app when the
215
+ // dock icon is clicked and there are no other windows open.
216
+ if (mainWindow === null) createWindow();
217
+ });
@@ -0,0 +1 @@
1
+ import "../application.js";
@@ -0,0 +1,67 @@
1
+ require "webpacker/configuration"
2
+
3
+ say "Checking for package's name and version"
4
+ package = JSON.parse(File.read(Rails.root.join("package.json")))
5
+
6
+ if package["name"].present? && package["version"].present?
7
+ say "Adding Electron to #{package['name']}@#{package['version']}", :blue
8
+ else
9
+ say "Couldn't find a name or version for this application. Add a 'name' or 'version' in your package.json", :red
10
+ return
11
+ end
12
+
13
+ say "Copying Webpacker configuration files for Electron"
14
+
15
+ directory "#{__dir__}/config/webpack/electron", "config/webpack/electron"
16
+ copy_file "#{__dir__}/config/electron-builder.yml", "config/electron-builder.yml"
17
+ copy_file "#{__dir__}/lib/javascript/babel.js", "lib/javascript/babel.js"
18
+ copy_file "#{__dir__}/lib/javascript/notarize.js", "lib/javascript/notarize.js"
19
+
20
+ say "Updating webpack environment configuration to ignore Electron packs"
21
+
22
+ unless File.read(Rails.root.join("config/webpack/environment.js")).include?(".filter((key) => key.match(/^electron/))")
23
+ insert_into_file Rails.root.join("config/webpack/environment.js"), after: "const { environment } = require(\"@rails/webpacker\");\n" do
24
+ <<~JS
25
+
26
+ Object.keys(environment.entry)
27
+ .filter((key) => key.match(/^electron/))
28
+ .forEach((entry) => {
29
+ environment.entry.delete(entry);
30
+ });
31
+
32
+ JS
33
+ end
34
+ end
35
+
36
+ if File.exists?(Rails.root.join(".gitignore"))
37
+ unless File.read(Rails.root.join(".gitignore")).include?("public/packs-electron")
38
+ append_to_file Rails.root.join(".gitignore") do
39
+ <<~TEXT
40
+
41
+ # Electron
42
+ public/packs-electron
43
+ public/dist
44
+
45
+ TEXT
46
+ end
47
+ end
48
+ end
49
+
50
+ say "Creating dist directories for Electron builds"
51
+
52
+ empty_directory "public/packs-electron"
53
+ empty_directory "public/dist"
54
+ empty_directory "public/assets/icons"
55
+
56
+ say "Copying Electron packs and entry files to #{Webpacker.config.source_entry_path}"
57
+
58
+ directory "#{__dir__}/src/packs/electron", "#{Webpacker.config.source_entry_path}/electron"
59
+ copy_file "#{__dir__}/public/electron.html", "public/electron.html"
60
+
61
+ say "Installing all Electron dependencies"
62
+
63
+ run "yarn add --dev electron electron-builder electron-notarize electron-devtools-installer @babel/register dotenv dotenv-webpack html-webpack-plugin@4.5.1 concurrently cross-env yaml"
64
+ run "yarn add electron-updater electron-log electron-debug"
65
+ run "yarn run electron-builder install-app-deps"
66
+
67
+ say "Webpacker now supports Electron 🎉", :green
@@ -0,0 +1,66 @@
1
+ bin_path = ENV["BUNDLE_BIN"] || Rails.root.join("bin")
2
+
3
+ namespace :webpacker do
4
+ desc "Install everything needed for Electron"
5
+ task "install:electron": ["webpacker:check_yarn"] do |task|
6
+ prefix = task.name.split(/#|webpacker:install/).first
7
+ install_template_path = template_path("../install/template.rb")
8
+
9
+ if Rails::VERSION::MAJOR >= 5
10
+ Kernel.exec "#{RbConfig.ruby} #{bin_path}/rails #{prefix}app:template LOCATION=#{install_template_path}"
11
+ else
12
+ Kernel.exec "#{RbConfig.ruby} #{bin_path}/rake #{prefix}rails:template LOCATION=#{install_template_path}"
13
+ end
14
+ end
15
+
16
+ desc "Start Electron app"
17
+ task "start:electron": ["webpacker:verify_install", :environment] do
18
+ webpacker_config_path = Webpacker.config.config_path.dirname.join("webpack", "electron")
19
+
20
+ Dir.chdir(Rails.root) do
21
+ Kernel.exec "yarn run cross-env NODE_ENV=development webpack-dev-server --config #{webpacker_config_path.join('renderer', 'development.js')}"
22
+ end
23
+ end
24
+
25
+ desc "Start Electron main process"
26
+ task "start:electron:main": ["webpacker:verify_install", :environment] do
27
+ source_entry_path = Webpacker.config.source_entry_path.join("electron")
28
+
29
+ Dir.chdir(Rails.root) do
30
+ Kernel.exec "yarn run cross-env NODE_ENV=development electron -r ./lib/javascript/babel #{source_entry_path.join('main.js')}"
31
+ end
32
+ end
33
+
34
+ desc "Compile JavaScript packs using webpack for Electron"
35
+ task "compile:electron": ["webpacker:verify_install", :environment] do
36
+ webpacker_config_path = Webpacker.config.config_path.dirname.join("webpack", "electron")
37
+
38
+ compile_electron_main = "yarn run cross-env RAILS_ENV=production NODE_ENV=production webpack --config #{webpacker_config_path.join('main', 'production.js')}"
39
+ compile_electron_renderer = "yarn run cross-env RAILS_ENV=production NODE_ENV=production webpack --config #{webpacker_config_path.join('renderer', 'production.js')}"
40
+
41
+ Dir.chdir(Rails.root) do
42
+ Kernel.exec "yarn run concurrently \"#{compile_electron_main}\" \"#{compile_electron_renderer}\""
43
+ end
44
+ end
45
+
46
+ desc "Package Electron app"
47
+ task "package:electron": ["webpacker:verify_install", :environment] do
48
+ electron_builder_config_path = Rails.root.join("config", "electron-builder.yml")
49
+
50
+ if Rails::VERSION::MAJOR >= 5
51
+ compile_task = "#{RbConfig.ruby} #{bin_path}/rails webpacker:compile:electron"
52
+ else
53
+ compile_task = "#{RbConfig.ruby} #{bin_path}/rake webpacker:compile:electron"
54
+ end
55
+
56
+ Dir.chdir(Rails.root) do
57
+ Kernel.exec "rm -rf public/dist && #{compile_task} && yarn run electron-builder build --config #{electron_builder_config_path} --publish never"
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def template_path(template)
65
+ File.expand_path(template, __dir__).freeze
66
+ end
@@ -0,0 +1,8 @@
1
+ require "webpacker/electron/version"
2
+ require "webpacker/electron/railtie"
3
+
4
+ module Webpacker
5
+ module Electron
6
+ # Your code goes here...
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ module Webpacker
2
+ module Electron
3
+ class Railtie < ::Rails::Railtie
4
+ railtie_name :"webpacker-electron"
5
+
6
+ rake_tasks do
7
+ path = File.expand_path(__dir__)
8
+ Dir.glob("#{path}/../../tasks/**/*.rake").each { |f| load f }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Webpacker
2
+ module Electron
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webpacker-electron
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Able
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: webpacker
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.76'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.76'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-able
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.2
69
+ description: Use webpacker configuration to build Electron apps using the same codebase.
70
+ email:
71
+ - engineering@able.co
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - MIT-LICENSE
77
+ - README.md
78
+ - Rakefile
79
+ - lib/install/config/electron-builder.yml
80
+ - lib/install/config/webpack/electron/main/development.js
81
+ - lib/install/config/webpack/electron/main/production.js
82
+ - lib/install/config/webpack/electron/renderer/development.js
83
+ - lib/install/config/webpack/electron/renderer/production.js
84
+ - lib/install/lib/javascript/babel.js
85
+ - lib/install/lib/javascript/notarize.js
86
+ - lib/install/public/electron.html
87
+ - lib/install/src/packs/electron/main.js
88
+ - lib/install/src/packs/electron/renderer.js
89
+ - lib/install/template.rb
90
+ - lib/tasks/webpacker.rake
91
+ - lib/webpacker/electron.rb
92
+ - lib/webpacker/electron/railtie.rb
93
+ - lib/webpacker/electron/version.rb
94
+ homepage: https://github.com/ableco/webpacker-electron
95
+ licenses:
96
+ - MIT
97
+ metadata:
98
+ allowed_push_host: https://rubygems.org
99
+ homepage_uri: https://github.com/ableco/webpacker-electron
100
+ source_code_uri: https://github.com/ableco/webpacker-electron
101
+ changelog_uri: https://github.com/ableco/webpacker-electron/blob/master/CHANGELOG.md
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubygems_version: 3.1.4
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Electron integration for Webpacker.
121
+ test_files: []