'use strict'; module.exports = function(grunt) { require('load-grunt-tasks')(grunt); // Project Configuration grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), exec: { appConfig: { command: 'node ./util/buildAppConfig.js' }, externalServices: { command: 'node ./util/buildExternalServices.js' }, clean: { command: 'rm -Rf bower_components node_modules' }, cordovaclean: { command: 'make -C cordova clean' }, macos: { command: 'sh webkitbuilds/build-macos.sh sign' }, coveralls: { command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js' }, chrome: { command: 'make -C chrome-app ' }, wpinit: { command: 'make -C cordova wp-init', }, wpcopy: { command: 'make -C cordova wp-copy', }, iosdebug: { command: 'npm run build:ios', }, ios: { command: 'npm run build:ios-release', }, xcode: { command: 'npm run open:ios', }, androiddebug: { command: 'npm run build:android', }, android: { command: 'npm run build:android-release', }, androidrun: { command: 'npm run run:android && npm run log:android', }, androidbuild: { command: 'cd cordova/project && cordova build android --release', }, androidsign: { command: 'rm -f cordova/project/platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../copay.keystore -signedjar cordova/project/platforms/android/build/outputs/apk/android-release-signed.apk cordova/project/platforms/android/build/outputs/apk/android-release-unsigned.apk copay_play && ../android-sdk-macosx/build-tools/21.1.1/zipalign -v 4 cordova/project/platforms/android/build/outputs/apk/android-release-signed.apk cordova/project/platforms/android/build/outputs/apk/android-release-signed-aligned.apk ', stdin: true, }, desktopsign: { cmd: 'gpg -u 1112CFA1 --output webkitbuilds/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/<%= pkg.title %>-linux.zip && gpg -u 1112CFA1 --output webkitbuilds/<%= pkg.title %>-win.exe.sig --detach-sig webkitbuilds/<%= pkg.title %>-win.exe' }, desktopverify: { cmd: 'gpg --verify webkitbuilds/<%= pkg.title %>-linux.zip.sig webkitbuilds/<%= pkg.title %>-linux.zip && gpg --verify webkitbuilds/<%= pkg.title %>-win.exe.sig webkitbuilds/<%= pkg.title %>-win.exe' }, }, watch: { options: { dateFormat: function(time) { grunt.log.writeln('The watch finished in ' + time + 'ms at ' + (new Date()).toString()); grunt.log.writeln('Waiting for more changes...'); }, }, css: { files: ['src/css/*.css'], tasks: ['concat:css'] }, sass: { files: ['src/sass/**/**/*.scss'], tasks: ['sass', 'concat:css'] }, main: { files: [ 'src/js/init.js', 'src/js/app.js', 'src/js/directives/*.js', 'src/js/filters/*.js', 'src/js/routes.js', 'src/js/services/*.js', 'src/js/models/*.js', 'src/js/controllers/**/*.js' ], tasks: ['concat:js'] } }, sass: { dist: { options: { style: 'compact', sourcemap: 'none' }, files: [{ expand: true, src: ['src/sass/main.scss'], dest: './', ext: '.css' }] } }, concat: { options: { sourceMap: false, sourceMapStyle: 'link' // embed, link, inline }, angular: { src: [ 'bower_components/qrcode-generator/js/qrcode.js', 'bower_components/moment/min/moment-with-locales.js', 'bower_components/angular-moment/angular-moment.js', 'bower_components/ng-lodash/build/ng-lodash.js', 'bower_components/angular-qrcode/angular-qrcode.js', 'bower_components/angular-gettext/dist/angular-gettext.js', 'bower_components/ng-csv/build/ng-csv.js', 'bower_components/ionic-toast/dist/ionic-toast.bundle.min.js', 'bower_components/angular-clipboard/angular-clipboard.js', 'bower_components/angular-md5/angular-md5.js', 'bower_components/angular-mocks/angular-mocks.js', 'bower_components/ngtouch/src/ngTouch.js', 'angular-bitauth/angular-bitauth.js', 'angular-bitcore-wallet-client/angular-bitcore-wallet-client.js' ], dest: 'www/lib/angular.js' }, js: { src: [ 'src/js/app.js', 'src/js/routes.js', 'src/js/directives/*.js', 'src/js/filters/*.js', 'src/js/models/*.js', 'src/js/services/*.js', 'src/js/controllers/**/*.js', 'src/js/translations.js', 'src/js/appConfig.js', 'src/js/externalServices.js', 'src/js/init.js', 'src/js/trezor-url.js', 'bower_components/trezor-connect/login.js', 'node_modules/bezier-easing/dist/bezier-easing.min.js', 'node_modules/cordova-plugin-qrscanner/dist/cordova-plugin-qrscanner-lib.min.js' ], dest: 'www/js/copay.js' }, css: { src: ['src/sass/*.css', 'src/css/*.css'], dest: 'www/css/copay.css' } }, uglify: { options: { mangle: false }, prod: { files: { 'www/js/copay.js': ['www/js/copay.js'], 'www/lib/angular.js': ['www/lib/angular.js'] } } }, nggettext_extract: { pot: { files: { 'i18n/po/template.pot': [ 'www/index.html', 'www/views/**/*.html', 'src/js/routes.js', 'src/js/services/*.js', 'src/js/controllers/**/*.js' ] } }, }, nggettext_compile: { all: { options: { module: 'copayApp' }, files: { 'src/js/translations.js': ['i18n/po/*.po'] } }, }, copy: { ionic_fonts: { expand: true, flatten: true, src: 'bower_components/ionic/release/fonts/ionicons.*', dest: 'www/fonts/' }, ionic_js: { expand: true, flatten: true, src: 'bower_components/ionic/release/js/ionic.bundle.min.js', dest: 'www/lib/' }, linux: { files: [{ expand: true, cwd: 'webkitbuilds/', src: ['.desktop', '../www/img/app/favicon.ico', '../resources/<%= pkg.name %>/linux/512x512.png'], dest: 'webkitbuilds/<%= pkg.title %>/linux64/', flatten: true, filter: 'isFile' }], } }, nwjs: { options: { appName: '<%= pkg.title %>', platforms: ['win64', 'osx64', 'linux64'], buildDir: './webkitbuilds', version: '0.16.0', macIcns: './resources/<%= pkg.name %>/mac/app.icns', exeIco: './www/img/app/logo.ico' }, src: ['./package.json', './www/**/*'] }, compress: { linux: { options: { archive: './webkitbuilds/<%= pkg.title %>-linux.zip' }, expand: true, cwd: './webkitbuilds/<%= pkg.title %>/linux64/', src: ['**/*'], dest: '<%= pkg.title %>-linux/' } }, browserify: { dist: { files: { 'angular-bitcore-wallet-client/angular-bitcore-wallet-client.js': ['angular-bitcore-wallet-client/index.js'], 'angular-bitauth/angular-bitauth.js': ['angular-bitauth/index.js'] }, } } }); grunt.registerTask('default', ['nggettext_compile', 'exec:appConfig', 'exec:externalServices', 'browserify', 'sass', 'concat', 'copy:ionic_fonts', 'copy:ionic_js']); grunt.registerTask('prod', ['default', 'uglify']); grunt.registerTask('translate', ['nggettext_extract']); grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']); grunt.registerTask('macos', ['prod', 'nwjs', 'exec:macos']); grunt.registerTask('chrome', ['exec:chrome']); grunt.registerTask('wp', ['prod', 'exec:wp']); grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']); grunt.registerTask('wp-init', ['default', 'exec:wpinit']); grunt.registerTask('ios', ['exec:ios']); grunt.registerTask('ios-debug', ['exec:iosdebug']); grunt.registerTask('ios-run', ['exec:xcode']); grunt.registerTask('cordovaclean', ['exec:cordovaclean']); grunt.registerTask('android-debug', ['exec:androiddebug', 'exec:androidrun']); grunt.registerTask('android', ['exec:android']); grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']); grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']); };