diff --git a/.gitignore b/.gitignore index 8d2c0503..f341aee4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules/* !node_modules/boost dist/ compiled +/secret diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f67746b8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,2 @@ +本製品をインストール、または使用することによって、お客様は利用規約( +https://b00st.io/regulations.html)より拘束されることに承諾されたものとします。利用規約に同意されない場合、Boostnoteは、お客様に本製品のインストール、使用のいずれも許諾できません。 diff --git a/gruntfile.js b/gruntfile.js new file mode 100644 index 00000000..81ba0a3a --- /dev/null +++ b/gruntfile.js @@ -0,0 +1,141 @@ +const path = require('path') +const ChildProcess = require('child_process') +const packager = require('electron-packager') +const archiver = require('archiver') +const fs = require('fs') + +module.exports = function (grunt) { + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + auth_code: grunt.file.readJSON('secret/auth_code.json'), + 'create-windows-installer': { + x64: { + appDirectory: path.join(__dirname, 'dist', 'Boostnote-win32-x64'), + outputDirectory: path.join(__dirname, 'dist'), + authors: 'MAISIN&CO., Inc.', + exe: 'Boostnote.exe', + loadingGif: path.join(__dirname, 'resources/install.gif'), + iconUrl: path.join(__dirname, 'resources/app.ico'), + setupIcon: path.join(__dirname, 'resources/dmg.ico'), + certificateFile: grunt.config.get('auth_code.win_cert_path'), + certificatePassword: grunt.config.get('auth_code.win_cert_pw'), + noMsi: true, + remoteReleases: 'https://github.com/BoostIO/boost-releases/releases/download/v0.4.10/' + } + } + }) + grunt.loadNpmTasks('grunt-electron-installer') + + grunt.registerTask('compile', function () { + var done = this.async() + var execPath = path.join('node_modules', '.bin', 'webpack') + ' --config webpack.config.production.js' + grunt.log.writeln(execPath) + var compileProcess = ChildProcess.exec(execPath, + { + env: Object.assign({}, process.env, { + BABEL_ENV: 'production' + }) + }, function (err, stdout, stderr) { + grunt.log.writeln(stdout) + if (err) { + grunt.log.writeln(err) + grunt.log.writeln(stderr) + done(false) + return + } + done() + }) + }) + + grunt.registerTask('zip', function (platform) { + var done = this.async() + var archive = archiver.create('zip', {}) + switch (platform) { + case 'win': + archive.file(path.join('dist/Setup.exe'), { name:'Boostnote-installer-win32-x64.exe' }) + default: + done() + return + } + archive.finalize() + var writeStream = fs.createWriteStream(path.join('dist/Boostnote-installer-win32-x64.zip')) + archive.pipe(writeStream) + writeStream.on('close', function () { + grunt.log.writeln('Zipped!') + done() + }) + }) + + grunt.registerTask('pack', function (platform) { + grunt.log.writeln(path.join(__dirname, 'dist')) + var done = this.async() + var opts = { + name: 'Boostnote', + arch: 'x64', + dir: __dirname, + version: '0.35.4', + 'app-version': grunt.config.get('pkg.version'), + 'app-bundle-id': 'com.maisin.boost', + asar: true, + prune: true, + overwrite: true, + out: path.join(__dirname, 'dist'), + ignore: /submodules\/ace\/(?!src-min)|submodules\/ace\/(?=src-min-noconflict)|node_modules\/devicon\/icons|dist|.env/ + } + switch (platform) { + case 'win': + Object.assign(opts, { + platform: 'win32', + icon: path.join(__dirname, 'resources/app.ico'), + 'version-string': { + CompanyName: 'MAISIN&CO., Inc.', + LegalCopyright: '© 2015 MAISIN&CO., Inc. All rights reserved.', + FileDescription: 'Boostnote', + OriginalFilename: 'Boostnote', + FileVersion: grunt.config.get('pkg.version'), + ProductVersion: grunt.config.get('pkg.version'), + ProductName: 'Boostnote', + InternalName: 'Boostnote' + } + }) + packager(opts, function (err, appPath) { + if (err) { + grunt.log.writeln(err) + done(err) + return + } + done() + }) + break + case 'osx': + Object.assign(opts, { + platform: 'darwin', + icon: path.join(__dirname, 'resources/app.icns'), + 'app-category-type': 'public.app-category.developer-tools' + }) + packager(opts, function (err, appPath) { + if (err) { + grunt.log.writeln(err) + done(err) + return + } + done() + }) + break + } + }) + + grunt.registerTask('build', function (platform) { + if (!platform) { + platform = process.platform === 'darwin' ? 'osx' : process.platform === 'win32' ? 'win' : null + } + switch (platform) { + case 'win': + grunt.task.run(['pack:win', 'create-windows-installer', 'zip:win']) + } + }) + // Default task(s). + grunt.registerTask('default', ['build']) +} diff --git a/package.json b/package.json index 0129153e..0bf10a43 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,12 @@ { "name": "boost", "version": "0.4.6", - "description": "Boost App", + "description": "Boostnote", "main": "index.js", "scripts": { "start": "electron ./index.js", "hot": "electron ./index.js --hot", "webpack": "webpack-dev-server --hot --inline --config webpack.config.js", - "compile": "webpack --config webpack.config.production.js", - "pack:osx": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite --out=\"dist\"", "codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" dist/Boost-darwin-x64/Boost.app", "build:osx": "electron-builder \"dist/Boost-darwin-x64/Boost.app\" --platform=osx --out=\"dist\" --config=\"./builder-config.json\"", "release": "electron-release --app=\"dist/Boost-darwin-x64/Boost.app\" --token=$(cat .env/.github-token) --repo=\"BoostIO/boost-releases\"" @@ -55,12 +53,15 @@ "superagent-promise": "^1.0.3" }, "devDependencies": { + "archiver": "^0.20.0", "babel-loader": "^5.3.2", "babel-plugin-react-transform": "^1.1.1", "css-loader": "^0.19.0", "electron-packager": "^5.1.0", "electron-prebuilt": "^0.35.1", "electron-release": "^2.2.0", + "grunt": "^0.4.5", + "grunt-electron-installer": "^1.2.0", "nib": "^1.1.0", "react": "^0.14.0", "react-dom": "^0.14.0", diff --git a/webpack.config.production.js b/webpack.config.production.js index b7077f66..7fe46fb3 100644 --- a/webpack.config.production.js +++ b/webpack.config.production.js @@ -1,15 +1,18 @@ var webpack = require('webpack') -module.exports = { - entry: { - main: './browser/main/index.js', - finder: './browser/finder/index.js' - }, - output: { - path: 'compiled', - filename: '[name].js', - // sourceMapFilename: '[name].map', - libraryTarget: 'commonjs2' - }, +var path = require('path') +var JsonpTemplatePlugin = webpack.JsonpTemplatePlugin +var FunctionModulePlugin = require('webpack/lib/FunctionModulePlugin') +var NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin') + +var opt = { + path: path.join(__dirname, 'compiled'), + filename: '[name].js', + sourceMapFilename: '[name].map', + libraryTarget: 'commonjs2', + publicPath: 'http://localhost:8080/assets/' +} + +config = { module: { loaders: [ { @@ -24,11 +27,26 @@ module.exports = { } ] }, + entry: { + main: './browser/main/index.js', + finder: './browser/finder/index.js' + }, + output: opt, + resolve: { + extensions: ['', '.js', '.jsx'], + packageMains: ['webpack', 'browser', 'web', 'browserify', ['jam', 'main'], 'main'], + alias: { + 'boost': path.resolve(__dirname, 'lib') + } + }, plugins: [ + new webpack.NoErrorsPlugin(), + new NodeTargetPlugin(), new webpack.optimize.OccurenceOrderPlugin(), new webpack.DefinePlugin({ 'process.env': { - 'NODE_ENV': JSON.stringify('production') + 'NODE_ENV': JSON.stringify('production'), + 'BABEL_ENV': JSON.stringify('production') } }), new webpack.optimize.UglifyJsPlugin({ @@ -49,8 +67,14 @@ module.exports = { 'highlight.js', 'markdown-it-emoji', 'fs-jetpack' - ], - resolve: { - extensions: ['', '.js', '.jsx', 'styl'] - } + ] } + +config.target = function renderer (compiler) { + compiler.apply( + new JsonpTemplatePlugin(opt), + new FunctionModulePlugin(opt) + ) +} + +module.exports = config