diff --git a/.gitignore b/.gitignore index 7b4c1bf3..83583094 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ pids # Compiled binary addons (http://nodejs.org/api/addons.html) /build +# Generated files +/generated + # Dependency directory # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git node_modules diff --git a/Makefile b/Makefile index eee3d056..e0f7326a 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,10 @@ # Build configuration # --------------------------------------------------------------------- +# A non-existing target to force rules to rebuild +# See https://stackoverflow.com/a/816416 +.FORCE: + # This directory will be completely deleted by the `clean` rule BUILD_DIRECTORY ?= dist @@ -276,13 +280,16 @@ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-cli-$(APPLICATION_VERSION)-$(PLATFORM)-$( assets/dmg/background.tiff: assets/dmg/background.png assets/dmg/background@2x.png tiffutil -cathidpicheck $^ -out $@ -$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION).dmg: assets/dmg/background.tiff \ +build/js/gui.js: .FORCE + webpack + +$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION).dmg: assets/dmg/background.tiff build/js/gui.js \ | $(BUILD_DIRECTORY) TARGET_ARCH=$(TARGET_ARCH) build --mac dmg $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.version=$(APPLICATION_VERSION) \ --extraMetadata.packageType=dmg -$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-mac.zip: assets/dmg/background.tiff \ +$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-mac.zip: assets/dmg/background.tiff build/js/gui.js \ | $(BUILD_DIRECTORY) TARGET_ARCH=$(TARGET_ARCH) build --mac zip $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.version=$(APPLICATION_VERSION) \ @@ -290,14 +297,14 @@ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-mac.zip: assets/dm APPLICATION_NAME_ELECTRON = $(APPLICATION_NAME_LOWERCASE)-electron -$(BUILD_DIRECTORY)/$(APPLICATION_NAME_ELECTRON)-$(APPLICATION_VERSION_REDHAT).$(TARGET_ARCH_REDHAT).rpm: \ +$(BUILD_DIRECTORY)/$(APPLICATION_NAME_ELECTRON)-$(APPLICATION_VERSION_REDHAT).$(TARGET_ARCH_REDHAT).rpm: build/js/gui.js \ | $(BUILD_DIRECTORY) build --linux rpm $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.name=$(APPLICATION_NAME_ELECTRON) \ --extraMetadata.version=$(APPLICATION_VERSION_REDHAT) \ --extraMetadata.packageType=rpm -$(BUILD_DIRECTORY)/$(APPLICATION_NAME_ELECTRON)_$(APPLICATION_VERSION_DEBIAN)_$(TARGET_ARCH_DEBIAN).deb: \ +$(BUILD_DIRECTORY)/$(APPLICATION_NAME_ELECTRON)_$(APPLICATION_VERSION_DEBIAN)_$(TARGET_ARCH_DEBIAN).deb: build/js/gui.js \ | $(BUILD_DIRECTORY) build --linux deb $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.name=$(APPLICATION_NAME_ELECTRON) \ @@ -310,7 +317,7 @@ else ELECTRON_BUILDER_LINUX_UNPACKED_DIRECTORY = linux-$(TARGET_ARCH_ELECTRON_BUILDER)-unpacked endif -$(BUILD_DIRECTORY)/$(ELECTRON_BUILDER_LINUX_UNPACKED_DIRECTORY)/$(APPLICATION_NAME_ELECTRON): | $(BUILD_DIRECTORY) +$(BUILD_DIRECTORY)/$(ELECTRON_BUILDER_LINUX_UNPACKED_DIRECTORY)/$(APPLICATION_NAME_ELECTRON): build/js/gui.js | $(BUILD_DIRECTORY) build --dir --linux $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.name=$(APPLICATION_NAME_ELECTRON) \ --extraMetadata.version=$(APPLICATION_VERSION) \ @@ -343,13 +350,13 @@ $(BUILD_DIRECTORY)/$(APPLICATION_NAME_LOWERCASE)-$(APPLICATION_VERSION)-$(PLATFO | $(BUILD_DIRECTORY) ./scripts/build/zip-file.sh -f $< -s $(PLATFORM) -o $@ -$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-Portable-$(APPLICATION_VERSION)-$(TARGET_ARCH).exe: \ +$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-Portable-$(APPLICATION_VERSION)-$(TARGET_ARCH).exe: build/js/gui.js \ | $(BUILD_DIRECTORY) TARGET_ARCH=$(TARGET_ARCH) build --win portable $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.version=$(APPLICATION_VERSION) \ --extraMetadata.packageType=portable -$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-Setup-$(APPLICATION_VERSION)-$(TARGET_ARCH).exe: \ +$(BUILD_DIRECTORY)/$(APPLICATION_NAME)-Setup-$(APPLICATION_VERSION)-$(TARGET_ARCH).exe: build/js/gui.js \ | $(BUILD_DIRECTORY) TARGET_ARCH=$(TARGET_ARCH) build --win nsis $(ELECTRON_BUILDER_OPTIONS) \ --extraMetadata.version=$(APPLICATION_VERSION) \ @@ -377,6 +384,7 @@ TARGETS = \ clean \ distclean \ changelog \ + webpack \ package-electron \ package-cli \ cli-develop \ @@ -387,6 +395,8 @@ TARGETS = \ changelog: versionist +webpack: build/js/gui.js + package-electron: TARGET_ARCH=$(TARGET_ARCH) build --dir $(ELECTRON_BUILDER_OPTIONS) @@ -517,7 +527,7 @@ sass: node-sass lib/gui/app/scss/main.scss > lib/gui/css/main.css lint-js: - eslint lib tests scripts bin versionist.conf.js + eslint lib tests scripts bin versionist.conf.js webpack.config.js lint-sass: sass-lint lib/gui/scss diff --git a/electron-builder.yml b/electron-builder.yml index c20c8e22..11cbbdfd 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -6,6 +6,9 @@ nodeGypRebuild: true publish: null files: - lib + - "!lib/gui/app" + - lib/gui/app/index.html + - generated - build/**/*.node - assets/icon.png - node_modules/**/* diff --git a/lib/gui/app/app.js b/lib/gui/app/app.js index 69dc49ac..41b73921 100644 --- a/lib/gui/app/app.js +++ b/lib/gui/app/app.js @@ -26,14 +26,6 @@ var angular = require('angular') /* eslint-enable no-var */ -// Temporary: will be taken care of Webpack automatically soon -// eslint-disable-next-line node/no-deprecated-api -require.extensions['.html'] = (module, filename) => { - module.exports = require('fs').readFileSync(filename, { - encoding: 'utf8' - }) -} - const electron = require('electron') const Bluebird = require('bluebird') const semver = require('semver') diff --git a/lib/gui/app/components/svg-icon.js b/lib/gui/app/components/svg-icon.js index a0a65699..b7f70a6a 100644 --- a/lib/gui/app/components/svg-icon.js +++ b/lib/gui/app/components/svg-icon.js @@ -48,11 +48,22 @@ class SVGIcon extends react.Component { * @returns {react.Element} */ render () { + // __dirname behaves strangely inside a Webpack bundle, + // so we need to provide different base directories + // depending on whether __dirname is absolute or not, + // which helps detecting a Webpack bundle. + // We use global.__dirname inside a Webpack bundle since + // that's the only way to get the "real" __dirname. + const baseDirectory = path.isAbsolute(__dirname) + ? path.join(__dirname, '..') + // eslint-disable-next-line no-underscore-dangle + : global.__dirname + // This means the path to the icon should be // relative to *this directory*. // TODO: There might be a way to compute the path // relatively to the `index.html`. - const imagePath = path.join(__dirname, this.props.path) + const imagePath = path.join(baseDirectory, 'assets', this.props.path) let contents = '' diff --git a/lib/gui/app/index.html b/lib/gui/app/index.html index d2fdecf9..1f9c1a68 100644 --- a/lib/gui/app/index.html +++ b/lib/gui/app/index.html @@ -1,13 +1,13 @@
- +