|HWe%X!rUF@nhBB#=^K(_KflU4V
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
gKKK7D8}FFy{Cfhg7$ 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');
+ }
+}
diff --git a/.erb/scripts/check-node-env.js b/.erb/scripts/check-node-env.js
new file mode 100644
index 00000000..0e74b115
--- /dev/null
+++ b/.erb/scripts/check-node-env.js
@@ -0,0 +1,16 @@
+import chalk from 'chalk';
+
+export default function checkNodeEnv(expectedEnv) {
+ if (!expectedEnv) {
+ throw new Error('"expectedEnv" not set');
+ }
+
+ if (process.env.NODE_ENV !== expectedEnv) {
+ console.log(
+ chalk.whiteBright.bgRed.bold(
+ `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
+ )
+ );
+ process.exit(2);
+ }
+}
diff --git a/.erb/scripts/check-port-in-use.js b/.erb/scripts/check-port-in-use.js
new file mode 100644
index 00000000..3ade730a
--- /dev/null
+++ b/.erb/scripts/check-port-in-use.js
@@ -0,0 +1,16 @@
+import chalk from 'chalk';
+import detectPort from 'detect-port';
+
+const port = process.env.PORT || '1212';
+
+detectPort(port, (err, availablePort) => {
+ if (port !== String(availablePort)) {
+ throw new Error(
+ chalk.whiteBright.bgRed.bold(
+ `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`
+ )
+ );
+ } else {
+ process.exit(0);
+ }
+});
diff --git a/.erb/scripts/clean.js b/.erb/scripts/clean.js
new file mode 100644
index 00000000..b03b0baf
--- /dev/null
+++ b/.erb/scripts/clean.js
@@ -0,0 +1,17 @@
+import rimraf from 'rimraf';
+import process from 'process';
+import webpackPaths from '../configs/webpack.paths';
+
+const args = process.argv.slice(2);
+const commandMap = {
+ dist: webpackPaths.distPath,
+ release: webpackPaths.releasePath,
+ dll: webpackPaths.dllPath,
+};
+
+args.forEach((x) => {
+ const pathToRemove = commandMap[x];
+ if (pathToRemove !== undefined) {
+ rimraf.sync(pathToRemove);
+ }
+});
diff --git a/.erb/scripts/delete-source-maps.js b/.erb/scripts/delete-source-maps.js
new file mode 100644
index 00000000..3d051eab
--- /dev/null
+++ b/.erb/scripts/delete-source-maps.js
@@ -0,0 +1,8 @@
+import path from 'path';
+import rimraf from 'rimraf';
+import webpackPaths from '../configs/webpack.paths';
+
+export default function deleteSourceMaps() {
+ rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
+ rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
+}
diff --git a/.erb/scripts/electron-rebuild.js b/.erb/scripts/electron-rebuild.js
new file mode 100644
index 00000000..0bea3279
--- /dev/null
+++ b/.erb/scripts/electron-rebuild.js
@@ -0,0 +1,20 @@
+import { execSync } from 'child_process';
+import fs from 'fs';
+import { dependencies } from '../../release/app/package.json';
+import webpackPaths from '../configs/webpack.paths';
+
+if (
+ Object.keys(dependencies || {}).length > 0 &&
+ fs.existsSync(webpackPaths.appNodeModulesPath)
+) {
+ const electronRebuildCmd =
+ '../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .';
+ const cmd =
+ process.platform === 'win32'
+ ? electronRebuildCmd.replace(/\//g, '\\')
+ : electronRebuildCmd;
+ execSync(cmd, {
+ cwd: webpackPaths.appPath,
+ stdio: 'inherit',
+ });
+}
diff --git a/.erb/scripts/link-modules.ts b/.erb/scripts/link-modules.ts
new file mode 100644
index 00000000..6cc31e66
--- /dev/null
+++ b/.erb/scripts/link-modules.ts
@@ -0,0 +1,9 @@
+import fs from 'fs';
+import webpackPaths from '../configs/webpack.paths';
+
+const { srcNodeModulesPath } = webpackPaths;
+const { appNodeModulesPath } = webpackPaths;
+
+if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
+ fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
+}
diff --git a/.erb/scripts/notarize.js b/.erb/scripts/notarize.js
new file mode 100644
index 00000000..4fd3bb8f
--- /dev/null
+++ b/.erb/scripts/notarize.js
@@ -0,0 +1,30 @@
+const { notarize } = require('electron-notarize');
+const { build } = require('../../package.json');
+
+exports.default = async function notarizeMacos(context) {
+ const { electronPlatformName, appOutDir } = context;
+ if (electronPlatformName !== 'darwin') {
+ return;
+ }
+
+ if (process.env.CI !== 'true') {
+ console.warn('Skipping notarizing step. Packaging is not running in CI');
+ return;
+ }
+
+ if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) {
+ console.warn(
+ 'Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set'
+ );
+ return;
+ }
+
+ const appName = context.packager.appInfo.productFilename;
+
+ await notarize({
+ appBundleId: build.appId,
+ appPath: `${appOutDir}/${appName}.app`,
+ appleId: process.env.APPLE_ID,
+ appleIdPassword: process.env.APPLE_ID_PASS,
+ });
+};
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..7cad5358
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,33 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Coverage directory used by tools like istanbul
+coverage
+.eslintcache
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
+
+# OSX
+.DS_Store
+
+release/app/dist
+release/build
+.erb/dll
+
+.idea
+npm-debug.log.*
+*.css.d.ts
+*.sass.d.ts
+*.scss.d.ts
+
+# eslint ignores hidden directories by default:
+# https://github.com/eslint/eslint/issues/8429
+!.erb
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..408c21ef
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,30 @@
+module.exports = {
+ extends: 'erb',
+ rules: {
+ // A temporary hack related to IDE not resolving correct package.json
+ 'import/no-extraneous-dependencies': 'off',
+ 'import/no-unresolved': 'error',
+ // Since React 17 and typescript 4.1 you can safely disable the rule
+ 'react/react-in-jsx-scope': 'off',
+ },
+ parserOptions: {
+ ecmaVersion: 2020,
+ sourceType: 'module',
+ project: './tsconfig.json',
+ tsconfigRootDir: __dirname,
+ createDefaultProgram: true,
+ },
+ settings: {
+ 'import/resolver': {
+ // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
+ node: {},
+ webpack: {
+ config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
+ },
+ typescript: {},
+ },
+ 'import/parsers': {
+ '@typescript-eslint/parser': ['.ts', '.tsx'],
+ },
+ },
+};
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..20570f2f
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,12 @@
+* text eol=lf
+*.exe binary
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.ico binary
+*.icns binary
+*.eot binary
+*.otf binary
+*.ttf binary
+*.woff binary
+*.woff2 binary
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..da134307
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Coverage directory used by tools like istanbul
+coverage
+.eslintcache
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
+
+# OSX
+.DS_Store
+
+release/app/dist
+release/build
+.erb/dll
+
+.idea
+npm-debug.log.*
+*.css.d.ts
+*.sass.d.ts
+*.scss.d.ts
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..36af2198
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..d9165248
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["dbaeumer.vscode-eslint", "EditorConfig.EditorConfig"]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 00000000..acd2b9fb
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,30 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Electron: Main",
+ "type": "node",
+ "request": "launch",
+ "protocol": "inspector",
+ "runtimeExecutable": "npm",
+ "runtimeArgs": [
+ "run start:main --inspect=5858 --remote-debugging-port=9223"
+ ],
+ "preLaunchTask": "Start Webpack Dev"
+ },
+ {
+ "name": "Electron: Renderer",
+ "type": "chrome",
+ "request": "attach",
+ "port": 9223,
+ "webRoot": "${workspaceFolder}",
+ "timeout": 15000
+ }
+ ],
+ "compounds": [
+ {
+ "name": "Electron: All",
+ "configurations": ["Electron: Main", "Electron: Renderer"]
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..4a58cba0
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,30 @@
+{
+ "files.associations": {
+ ".eslintrc": "jsonc",
+ ".prettierrc": "jsonc",
+ ".eslintignore": "ignore"
+ },
+
+ "eslint.validate": [
+ "javascript",
+ "javascriptreact",
+ "html",
+ "typescriptreact"
+ ],
+
+ "javascript.validate.enable": false,
+ "javascript.format.enable": false,
+ "typescript.format.enable": false,
+
+ "search.exclude": {
+ ".git": true,
+ ".eslintcache": true,
+ ".erb/dll": true,
+ "release/{build,app/dist}": true,
+ "node_modules": true,
+ "npm-debug.log.*": true,
+ "test/**/__snapshots__": true,
+ "package-lock.json": true,
+ "*.{css,sass,scss}.d.ts": true
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 00000000..42cb7401
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,25 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "label": "Start Webpack Dev",
+ "script": "start:renderer",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ },
+ "isBackground": true,
+ "problemMatcher": {
+ "owner": "custom",
+ "pattern": {
+ "regexp": "____________"
+ },
+ "background": {
+ "activeOnStart": true,
+ "beginsPattern": "Compiling\\.\\.\\.$",
+ "endsPattern": "(Compiled successfully|Failed to compile)\\.$"
+ }
+ }
+ }
+ ]
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..5310ab55
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,533 @@
+# 2.1.0
+
+- Migrate to `css-minifier-webpack-plugin`
+
+# 2.0.1
+
+## Fixes
+
+- Fix broken css linking in production build
+
+# 2.0.0
+
+## Breaking Changes
+
+- drop redux
+- remove counter example app
+- simplify directory structure
+- move `dll` dir to `.erb` dir
+- fix icon/font import paths
+- migrate to `react-refresh` from `react-hot-loader`
+- migrate to webpack@5
+- migrate to electron@11
+- remove e2e tests and testcafe integration
+- rename `app` dir to more conventional `src` dir
+- rename `resources` dir to `assets`
+- simplify npm scripts
+- drop stylelint
+- simplify styling of boilerplate app
+- remove `START_HOT` env variable
+- notarize support
+- landing page boilerplate
+- docs updates
+- restore removed debugging support
+
+# 1.4.0
+
+- Migrate to `eslint-config-erb@2`
+- Rename `dev` npm script to `start`
+- GitHub Actions: only publish GitHub releases when on master branch
+
+# 1.3.1
+
+- Fix sass building bug ([#2540](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2540))
+- Fix CI bug related to E2E tests and network timeouts
+- Move automated dependency PRs to `next` ([#2554](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2554))
+- Bump dependencies to patch semver
+
+# 1.3.0
+
+- Fixes E2E tests ([#2516](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2516))
+- Fixes preload entrypoint ([#2503](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2503))
+- Downgrade to `electron@8`
+- Bump dependencies to latest semver
+
+# 1.2.0
+
+- Migrate to redux toolkit
+- Lazy load routes with react suspense
+- Drop support for azure-pipelines and use only github actions
+- Bump all deps to latest semver
+- Remove `test-e2e` script from tests (blocked on release of https://github.com/DevExpress/testcafe-browser-provider-electron/pull/65)
+- Swap `typed-css-modules-webpack-plugin` for `typings-for-css-modules-loader`
+- Use latest version of `eslint-config-erb`
+- Remove unnecessary file extensions from ts exclude
+- Add experimental support for vscode debugging
+- Revert https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365 as default for users, provide as opt in option
+
+# 1.1.0
+
+- Fix #2402
+- Simplify configs (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2406)
+
+# 1.0.0
+
+- Migrate to TypeScript from Flow ([#2363](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2363))
+- Use browserslist for `@babel/preset-env` targets ([#2368](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2368))
+- Use preload script, disable `nodeIntegration` in renderer process for [improved security](https://www.electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) ([#2365](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365))
+- Add support for azure pipelines ([#2369](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2369))
+- Disable sourcemaps in production
+
+# 0.18.1 (2019.12.12)
+
+- Fix HMR env bug ([#2343](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2343))
+- Bump all deps to latest semver
+- Bump to `electron@7`
+
+# 0.18.0 (2019.11.19)
+
+- Bump electron to `electron@6` (`electron@7` introduces breaking changes to testcafe end to end tests)
+- Revert back to [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure)
+- Bump all deps to latest semver
+
+# 0.17.1 (2018.11.20)
+
+- Fix `yarn test-e2e` and testcafe for single package.json structure
+- Fixes incorrect path in `yarn start` script
+- Bumped deps
+- Bump g++ in travis
+- Change clone arguments to clone only master
+- Change babel config to target current electron version
+
+For full change list, see https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2021
+
+# 0.17.0 (2018.10.30)
+
+- upgraded to `babel@7` (thanks to @vikr01 🎉🎉🎉)
+- migrated from [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure) (thanks to @HyperSprite!)
+- initial auto update support (experimental)
+- migrate from greenkeeper to [renovate](https://renovatebot.com)
+- added issue template
+- use `babel-preset-env` to target current electron version
+- add [opencollective](https://opencollective.com/electron-react-boilerplate-594) banner message display in postinstall script (help support ERB 🙏)
+- fix failing ci issues
+
+# 0.16.0 (2018.10.3)
+
+- removed unused dependencies
+- migrate from `react-redux-router` to `connect-react-router`
+- move webpack configs to `./webpack` dir
+- use `g++` on travis when testing linux
+- migrate from `spectron` to `testcafe` for e2e tests
+- add linting support for config styles
+- changed stylelint config
+- temporarily disabled flow in appveyor to make ci pass
+- added necessary infra to publish releases from ci
+
+# 0.15.0 (2018.8.25)
+
+- Performance: cache webpack uglify results
+- Feature: add start minimized feature
+- Feature: lint and fix styles with prettier and stylelint
+- Feature: add greenkeeper support
+
+# 0.14.0 (2018.5.24)
+
+- Improved CI timings
+- Migrated README commands to yarn from npm
+- Improved vscode config
+- Updated all dependencies to latest semver
+- Fix `electron-rebuild` script bug
+- Migrated to `mini-css-extract-plugin` from `extract-text-plugin`
+- Added `optimize-css-assets-webpack-plugin`
+- Run `prettier` on json, css, scss, and more filetypes
+
+# 0.13.3 (2018.5.24)
+
+- Add git precommit hook, when git commit will use `prettier` to format git add code
+- Add format code function in `lint-fix` npm script which can use `prettier` to format project js code
+
+# 0.13.2 (2018.1.31)
+
+- Hot Module Reload (HMR) fixes
+- Bumped all dependencies to latest semver
+- Prevent error propagation of `CheckNativeDeps` script
+
+# 0.13.1 (2018.1.13)
+
+- Hot Module Reload (HMR) fixes
+- Bumped all dependencies to latest semver
+- Fixed electron-rebuild script
+- Fixed tests scripts to run on all platforms
+- Skip redux logs in console in test ENV
+
+# 0.13.0 (2018.1.6)
+
+#### Additions
+
+- Add native dependencies check on postinstall
+- Updated all dependencies to latest semver
+
+# 0.12.0 (2017.7.8)
+
+#### Misc
+
+- Removed `babel-polyfill`
+- Renamed and alphabetized npm scripts
+
+#### Breaking
+
+- Changed node dev `__dirname` and `__filename` to node built in fn's (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/1035)
+- Renamed `src/bundle.js` to `src/renderer.prod.js` for consistency
+- Renamed `dll/vendor.js` to `dll/renderer.dev.dll.js` for consistency
+
+#### Additions
+
+- Enable node_modules cache on CI
+
+# 0.11.2 (2017.5.1)
+
+Yay! Another patch release. This release mostly includes refactorings and router bug fixes. Huge thanks to @anthonyraymond!
+
+⚠️ Windows electron builds are failing because of [this issue](https://github.com/electron/electron/issues/9321). This is not an issue with the boilerplate ⚠️
+
+#### Breaking
+
+- **Renamed `./src/main.development.js` => `./src/main.{dev,prod}.js`:** [#963](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/963)
+
+#### Fixes
+
+- **Fixed reloading when not on `/` path:** [#958](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/958) [#949](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/949)
+
+#### Additions
+
+- **Added support for stylefmt:** [#960](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/960)
+
+# 0.11.1 (2017.4.23)
+
+You can now debug the production build with devtools like so:
+
+```
+DEBUG_PROD=true npm run package
+```
+
+🎉🎉🎉
+
+#### Additions
+
+- **Added support for debugging production build:** [#fab245a](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/941/commits/fab245a077d02a09630f74270806c0c534a4ff95)
+
+#### Bug Fixes
+
+- **Fixed bug related to importing native dependencies:** [#933](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/933)
+
+#### Improvements
+
+- **Updated all deps to latest semver**
+
+# 0.11.0 (2017.4.19)
+
+Here's the most notable changes since `v0.10.0`. Its been about a year since a release has been pushed. Expect a new release to be published every 3-4 weeks.
+
+#### Breaking Changes
+
+- **Dropped support for node < 6**
+- **Refactored webpack config files**
+- **Migrate to two-package.json project structure**
+- **Updated all devDeps to latest semver**
+- **Migrated to Jest:** [#768](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/768)
+- **Migrated to `react-router@4`**
+- **Migrated to `electron-builder@4`**
+- **Migrated to `webpack@2`**
+- **Migrated to `react-hot-loader@3`**
+- **Changed default live reload server PORT to `1212` from `3000`**
+
+#### Additions
+
+- **Added support for Yarn:** [#451](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/451)
+- **Added support for Flow:** [#425](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/425)
+- **Added support for stylelint:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
+- **Added support for electron-builder:** [#876](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/876)
+- **Added optional support for SASS:** [#880](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/880)
+- **Added support for eslint-plugin-flowtype:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
+- **Added support for appveyor:** [#280](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/280)
+- **Added support for webpack dlls:** [#860](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/860)
+- **Route based code splitting:** [#884](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/884)
+- **Added support for Webpack Bundle Analyzer:** [#922](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/922)
+
+#### Improvements
+
+- **Parallelize renderer and main build processes when running `npm run build`**
+- **Dynamically generate electron app menu**
+- **Improved vscode integration:** [#856](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/856)
+
+#### Bug Fixes
+
+- **Fixed hot module replacement race condition bug:** [#917](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/917) [#920](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/920)
+
+# 0.10.0 (2016.4.18)
+
+#### Improvements
+
+- **Use Babel in main process with Webpack build:** [#201](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/201)
+- **Change targets to built-in support by webpack:** [#197](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/197)
+- **use es2015 syntax for webpack configs:** [#195](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/195)
+- **Open application when webcontent is loaded:** [#192](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/192)
+- **Upgraded dependencies**
+
+#### Bug fixed
+
+- **Fix `npm list electron-prebuilt` in package.js:** [#188](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/188)
+
+# 0.9.0 (2016.3.23)
+
+#### Improvements
+
+- **Added [redux-logger](https://github.com/fcomb/redux-logger)**
+- **Upgraded [react-router-redux](https://github.com/reactjs/react-router-redux) to v4**
+- **Upgraded dependencies**
+- **Added `npm run dev` command:** [#162](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/162)
+- **electron to v0.37.2**
+
+#### Breaking Changes
+
+- **css module as default:** [#154](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/154).
+- **set default NODE_ENV to production:** [#140](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/140)
+
+# 0.8.0 (2016.2.17)
+
+#### Bug fixed
+
+- **Fix lint errors**
+- **Fix Webpack publicPath for production builds**: [#119](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/119).
+- **package script now chooses correct OS icon extension**
+
+#### Improvements
+
+- **babel 6**
+- **Upgrade Dependencies**
+- **Enable CSS source maps**
+- **Add json-loader**: [#128](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/128).
+- **react-router 2.0 and react-router-redux 3.0**
+
+# 0.7.1 (2015.12.27)
+
+#### Bug fixed
+
+- **Fixed npm script on windows 10:** [#103](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/103).
+- **history and react-router version bump**: [#109](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/109), [#110](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/110).
+
+#### Improvements
+
+- **electron 0.36**
+
+# 0.7.0 (2015.12.16)
+
+#### Bug fixed
+
+- **Fixed process.env.NODE_ENV variable in webpack:** [#74](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/74).
+- **add missing object-assign**: [#76](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/76).
+- **packaging in npm@3:** [#77](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/77).
+- **compatibility in windows:** [#100](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/100).
+- **disable chrome debugger in production env:** [#102](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/102).
+
+#### Improvements
+
+- **redux**
+- **css-modules**
+- **upgrade to react-router 1.x**
+- **unit tests**
+- **e2e tests**
+- **travis-ci**
+- **upgrade to electron 0.35.x**
+- **use es2015**
+- **check dev engine for node and npm**
+
+# 0.6.5 (2015.11.7)
+
+#### Improvements
+
+- **Bump style-loader to 0.13**
+- **Bump css-loader to 0.22**
+
+# 0.6.4 (2015.10.27)
+
+#### Improvements
+
+- **Bump electron-debug to 0.3**
+
+# 0.6.3 (2015.10.26)
+
+#### Improvements
+
+- **Initialize ExtractTextPlugin once:** [#64](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/64).
+
+# 0.6.2 (2015.10.18)
+
+#### Bug fixed
+
+- **Babel plugins production env not be set properly:** [#57](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/57).
+
+# 0.6.1 (2015.10.17)
+
+#### Improvements
+
+- **Bump electron to v0.34.0**
+
+# 0.6.0 (2015.10.16)
+
+#### Breaking Changes
+
+- **From react-hot-loader to react-transform**
+
+# 0.5.2 (2015.10.15)
+
+#### Improvements
+
+- **Run tests with babel-register:** [#29](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/29).
+
+# 0.5.1 (2015.10.12)
+
+#### Bug fixed
+
+- **Fix #51:** use `path.join(__dirname` instead of `./`.
+
+# 0.5.0 (2015.10.11)
+
+#### Improvements
+
+- **Simplify webpack config** see [#50](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/50).
+
+#### Breaking Changes
+
+- **webpack configs**
+- **port changed:** changed default port from 2992 to 3000.
+- **npm scripts:** remove `start-dev` and `dev-server`. rename `hot-dev-server` to `hot-server`.
+
+# 0.4.3 (2015.9.22)
+
+#### Bug fixed
+
+- **Fix #45 zeromq crash:** bump version of `electron-prebuilt`.
+
+# 0.4.2 (2015.9.15)
+
+#### Bug fixed
+
+- **run start-hot breaks chrome refresh(CTRL+R) (#42)**: bump `electron-debug` to `0.2.1`
+
+# 0.4.1 (2015.9.11)
+
+#### Improvements
+
+- **use electron-prebuilt version for packaging (#33)**
+
+# 0.4.0 (2015.9.5)
+
+#### Improvements
+
+- **update dependencies**
+
+# 0.3.0 (2015.8.31)
+
+#### Improvements
+
+- **eslint-config-airbnb**
+
+# 0.2.10 (2015.8.27)
+
+#### Features
+
+- **custom placeholder icon**
+
+#### Improvements
+
+- **electron-renderer as target:** via [webpack-target-electron-renderer](https://github.com/chentsulin/webpack-target-electron-renderer)
+
+# 0.2.9 (2015.8.18)
+
+#### Bug fixed
+
+- **Fix hot-reload**
+
+# 0.2.8 (2015.8.13)
+
+#### Improvements
+
+- **bump electron-debug**
+- **babelrc**
+- **organize webpack scripts**
+
+# 0.2.7 (2015.7.9)
+
+#### Bug fixed
+
+- **defaultProps:** fix typos.
+
+# 0.2.6 (2015.7.3)
+
+#### Features
+
+- **menu**
+
+#### Bug fixed
+
+- **package.js:** include webpack build.
+
+# 0.2.5 (2015.7.1)
+
+#### Features
+
+- **NPM Script:** support multi-platform
+- **package:** `--all` option
+
+# 0.2.4 (2015.6.9)
+
+#### Bug fixed
+
+- **Eslint:** typo, [#17](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/17) and improve `.eslintrc`
+
+# 0.2.3 (2015.6.3)
+
+#### Features
+
+- **Package Version:** use latest release electron version as default
+- **Ignore Large peerDependencies**
+
+#### Bug fixed
+
+- **Npm Script:** typo, [#6](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/6)
+- **Missing css:** [#7](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/7)
+
+# 0.2.2 (2015.6.2)
+
+#### Features
+
+- **electron-debug**
+
+#### Bug fixed
+
+- **Webpack:** add `.json` and `.node` to extensions for imitating node require.
+- **Webpack:** set `node_modules` to externals for native module support.
+
+# 0.2.1 (2015.5.30)
+
+#### Bug fixed
+
+- **Webpack:** #1, change build target to `atom`.
+
+# 0.2.0 (2015.5.30)
+
+#### Features
+
+- **Ignore:** `test`, `tools`, `release` folder and devDependencies in `package.json`.
+- **Support asar**
+- **Support icon**
+
+# 0.1.0 (2015.5.27)
+
+#### Features
+
+- **Webpack:** babel, react-hot, ...
+- **Flux:** actions, api, components, containers, stores..
+- **Package:** darwin (osx), linux and win32 (windows) platform.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..2562267e
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at electronreactboilerplate@gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..c2885de6
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-present Electron React Boilerplate
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..40e5114a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,153 @@
+
+
+
+
+
+ Electron React Boilerplate uses Electron, React, React Router, Webpack and React Fast Refresh.
+
+
+
+
+
+
+[![Build Status][github-actions-status]][github-actions-url]
+[![Github Tag][github-tag-image]][github-tag-url]
+[](https://discord.gg/Fjy3vfgy5q)
+
+[](#backers)
+[](#sponsors)
+[![StackOverflow][stackoverflow-img]][stackoverflow-url]
+
+
+
+## Install
+
+Clone the repo and install dependencies:
+
+```bash
+git clone --depth 1 --branch main https://github.com/electron-react-boilerplate/electron-react-boilerplate.git your-project-name
+cd your-project-name
+npm install
+```
+
+**Having issues installing? See our [debugging guide](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/400)**
+
+## Starting Development
+
+Start the app in the `dev` environment:
+
+```bash
+npm start
+```
+
+## Packaging for Production
+
+To package apps for the local platform:
+
+```bash
+npm run package
+```
+
+## Docs
+
+See our [docs and guides here](https://electron-react-boilerplate.js.org/docs/installation)
+
+## Community
+
+Join our Discord: https://discord.gg/Fjy3vfgy5q
+
+## Donations
+
+**Donations will ensure the following:**
+
+- 🔨 Long term maintenance of the project
+- 🛣 Progress on the [roadmap](https://electron-react-boilerplate.js.org/docs/roadmap)
+- 🐛 Quick responses to bug reports and help requests
+
+## Backers
+
+Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/electron-react-boilerplate-594#backer)]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Sponsors
+
+Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/electron-react-boilerplate-594-594#sponsor)]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Maintainers
+
+- [Amila Welihinda](https://github.com/amilajack)
+- [John Tran](https://github.com/jooohhn)
+- [C. T. Lin](https://github.com/chentsulin)
+- [Jhen-Jie Hong](https://github.com/jhen0409)
+
+## License
+
+MIT © [Electron React Boilerplate](https://github.com/electron-react-boilerplate)
+
+[github-actions-status]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/workflows/Test/badge.svg
+[github-actions-url]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/actions
+[github-tag-image]: https://img.shields.io/github/tag/electron-react-boilerplate/electron-react-boilerplate.svg?label=version
+[github-tag-url]: https://github.com/electron-react-boilerplate/electron-react-boilerplate/releases/latest
+[stackoverflow-img]: https://img.shields.io/badge/stackoverflow-electron_react_boilerplate-blue.svg
+[stackoverflow-url]: https://stackoverflow.com/questions/tagged/electron-react-boilerplate
diff --git a/assets/assets.d.ts b/assets/assets.d.ts
new file mode 100644
index 00000000..a0938fb1
--- /dev/null
+++ b/assets/assets.d.ts
@@ -0,0 +1,31 @@
+type Styles = Record;
+
+declare module '*.svg' {
+ const content: string;
+ export default content;
+}
+
+declare module '*.png' {
+ const content: string;
+ export default content;
+}
+
+declare module '*.jpg' {
+ const content: string;
+ export default content;
+}
+
+declare module '*.scss' {
+ const content: Styles;
+ export default content;
+}
+
+declare module '*.sass' {
+ const content: Styles;
+ export default content;
+}
+
+declare module '*.css' {
+ const content: Styles;
+ export default content;
+}
diff --git a/assets/entitlements.mac.plist b/assets/entitlements.mac.plist
new file mode 100644
index 00000000..dad3e20e
--- /dev/null
+++ b/assets/entitlements.mac.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.cs.allow-unsigned-executable-memory
+
+ com.apple.security.cs.allow-jit
+
+
+
diff --git a/assets/icon.icns b/assets/icon.icns
new file mode 100644
index 0000000000000000000000000000000000000000..c2213ce890a3d807acf6eaebc03b783ea246ecfa
GIT binary patch
literal 111909
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%0DnZe&`x56GYq2ef!@%dNjOv(emfk>^ZaJ
zgZa(r-{SJ#ldwGZP~*?Pkv59U>e`Rqe%qy!hFfM6I-N$vKQn*c`~A;nsm5?Q?WHgN
zT+_4u4f(6Zb6}}0s6rcCW;FR8{O}ExS)xeE$Zf?d)fFpt`c(qpxRBO!F|_&P;h|+;
zInn{vH7#pNEmyRt@^mK8OXz>Uf
z0GAi+e@rEcV2yriqDo(jXhjJo`3^PDaGJ^suK_NwOwr*5S?D8
z;Ig{x^Opg}7k|-~24J8q?n>8bxKH1#)$!ssjCY$TjkavDn&*kkC0Zazue=ye^V0fH%}lu}bB|pF$Q~OHOZpaE(s9Bm~XFd8kvv4Ks-W}Phz;X(stsi{h!$lbx
z&q_2W^W%sQ@y1zpe_4l7JqpWnK0Jz$24MN!vzAd<*08Gg>Wiv+S3qwAEa%TFksJ#l
z24NJIrIR1RiY@_T_m{!h%or^58%!!Ht
za8zKKe@lW@yyl6jG)8ZRU+R)b+88X;b3Qtr@~4`V_Z=7-tTv>B$y$6$G;cH^@&HfVrW-vgy<=gz`9mDd6wF(kC3olyQLz)YnQ?|nTVfZ2EcVDW>az)Wf%%-i!t1flqEfVq75{9@fh
zYKSQr1!ht+L(})KV|4(#e;xzowVlWv*{z&s%Z-Hh&ays~5H^x3nghj+f_z8_6PQ*HoYhD9|!2FyRd?~lJ2
z1LpWYM8_$>e9!)OR|7D=_{ov`#(+5*Mg9Cy3~^>p-#!Y=#iM?!r0@Jz=$j`BpndEa
z3!eMt`w#zBr1miB+^5EwbK
zLYFWa?Dh@C^?$)RmXN-hjN#Mo*PtRrS|F#Oz
z=+BqH;``6f$jFRuGDM-*e#}+%9gi#cUBx2=PYlxhkl*P$(y?DxF+Wy7G!*pYRJc^3FaGKDbqamaPp7X@=*>S}{sLw7
zlJ?)5W{hG4(+d4v|N5!z`4tR^C^T{VPZJ2-&^N$nh(b$$T7|FRCzat4jVwP+o~yV}
z8J|(;=ZAlaKqL6*9YCyP2>ld+uHXfVI12rJr~bP{Blxqwjj~rVfZzAOb;1?g0}uu5
z75ZOp`)?Vp;=RAQMy_O_FZ^eTAi~PS;qb^3Z(=T?EH}j
z$a^PV&mMkH@?HJ0IzY+YQ~wXSQibug=Y9ZQKnt(p&s!#ak6g)+p!;A9ey)>hMDdAl
zW)lC6T*(l1d)pysrfcr=Q3pD_4p{F{2Iap$(An{SXx|9IRNp-pw^;871pXm%U;v-v
ze#yAj>^gb=;@1~W?taC~{|X{6euP@dpd`gj`|Sf-j?@0*P9^f@N0~#?52XH>C}Y&u
zvOtKywdcCe*M64NDSrDLtMZDk{cjbzCGglIwhr&SC!T$N&6XWIH@&v{g{S6w+d6|m
zUq4Ee+pKcm>Nnq98$^j~-+J@q`PR0^_C08-%fGC>?-hL6;V-$j)amzl1EH`SnG*8*
zyna{p-}fAxiSe5Gt;i>DN0aO|HGOOGA5eUi#~bPH>h1IPPVVdN>IMg5!|fB){`C*H
zuX{AK8BK1v{Eqv{R~9a$9loxv-rkQZ6~tn+R2Z1dy$#y-eB$z1^(+pd3UaZR1)J#@DhZ(IEO{)5Hd
za97W0mfrdEd&53^dsAI?RYgT*Rb6A7%^U8WH@~l2?n(igh_`O{&UJGB9S9w*`9Vbw?s{S3;l><0ty&FM1u_
z*t2KTqc1*U@v&Xfld=b7_01uLnrFyZj|@z46qc
zFBiOmrY>8sU@^MI7KXgxo<3h)wxl;WO+mBMG!=XonN{xI-Y{f|I8>?gpIiOp%V^pY
zPc2`&zB16&6%Kdzx+_c≷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