ionic-cordova-gulp-seed
Version:
Ionic & Cordova & Gulp seed with organized code, tests, bower support and some other stuff. Originated from ionic-angular-cordova-seed.
265 lines (212 loc) • 10 kB
text/coffeescript
gulp = require("gulp")
gutil = require("gulp-util")
extend = require("extend")
exec = require("sync-exec")
os = require("os")
module.exports = new class GulpConfig
constructor: ->
@_GLOBALS_DEFAULTS = {
defaults: {
# If true, then we'll mark this app release as a debug version
# (for example, we'll add ".dbg" to BUNDLE_NAME,
# if we're running/emulating a --debug version of the cordova app)
SET_AS_DEBUG: null
DEBUG: false
BUNDLE_VERSION: "1.0.0"
AVAILABLE_PLATFORMS: ["ios", "android"]
# The name of your angular app you're going to use in `angular.module("")`
ANGULAR_APP_NAME: "ionicstarter"
# Base path to this project's directory. Generated automatically.
APP_ROOT: exec("pwd").stdout.trim() + "/"
# By default, we compile all html/css/js files into www/ directory.
BUILD_DIR: (GLOBALS) ->
if !!+GLOBALS.TMP_BUILD_DIR
"#{os.tmpdir()}/ionic#{GLOBALS.DEPLOY_TIME}/"
else
"www"
# However, you can set this flag to true, and we'll change BUILD_DIR to a random directory.
# Could be useful f.e. in unit/e2e tests
TMP_BUILD_DIR: false
# Should we compress assets (.css and .js files, soon also images)?
COMPRESS_ASSETS: false
# Marks the current code version. Used in uploading sourcemaps to Rollbar.
# By default: sha-code of the recent git commit.
CODE_VERSION: exec("git rev-parse HEAD").stdout.trim()
# This is only for convenience.
# It will equal to "android" or "ios",
# while the gulp is running a task building the app for given platform
CORDOVA_PLATFORM: null
# Current timestamp, used to get rid of unwanted http 304 requests.
DEPLOY_TIME: Date.now()
# Used in server/weinre tasks as an actual IP for the server.
HTTP_SERVER_IP: (->
# Try to detect IP address in user's network.
# If not, fallback to 127.0.0.1 .
localIp = exec("(ifconfig wlan 2>/dev/null || ifconfig en0) | grep inet | grep -v inet6 | awk '{print $2}' | sed 's/addr://g'").stdout.trim()
localIp = "127.0.0.1" unless parseInt(localIp) > 0
localIp
)()
# By default, application runs on :4400 port.
HTTP_SERVER_PORT: 4400
REMOTE_LIVERELOAD: true
# Optionally, you can define a proxy server:
# all requests to "http://localhost:4400/api/xxx"
# will be redirected to "https://ionic.starter.com/xxx"
# PROXY_ADDRESS: "https://ionic.starter.com"
# PROXY_ROUTE: "/api"
PROXY_ADDRESS: null
PROXY_ROUTE: null
# If true, we'll open the app in the browser after running the server.
OPEN_IN_BROWSER: true
# Report errors to Rollbar (rollbar.com)
ROLLBAR_CLIENT_ACCESS_TOKEN: null # "aaa"
ROLLBAR_SERVER_ACCESS_TOKEN: null # "bbb"
# If you want to upload sourcemaps to Rollbar, just set a random URL prefix
# (we'll modify payloads on iOS/Android so the URL to js scripts will be always the same)
ROLLBAR_SOURCEMAPS_URL_PREFIX: "https://ionicstarter.com"
# Important: leave it as false, even if you want to have the sourcemaps uploaded.
# gulp.task("deploy:rollbar-sourcemaps") automatically sets it as true - only when it's needed.
# (you want to upload them only on release tasks, don't you?)
UPLOAD_SOURCEMAPS_TO_ROLLBAR: false
# If defined, we'll deploy the app to testfairy after compiling the release.
# TESTFAIRY_API_KEY: "123"
# TESTFAIRY_TESTER_GROUPS: "IonicStarterTesters"
TESTFAIRY_API_KEY: null
TESTFAIRY_TESTER_GROUPS: null
},
development: {
ENV: "development"
BUNDLE_ID: "com.jtomaszewski.ionicstarter.development"
BUNDLE_NAME: "IonicStarterDev"
# Automatically connect to weinre on application's startup
# (this way you can debug your application on your PC even if it's running from mobile ;) )
WEINRE_ADDRESS: (GLOBALS) ->
"#{GLOBALS.HTTP_SERVER_IP}:31173"
},
production: {
ENV: "production"
BUNDLE_ID: "com.jtomaszewski.ionicstarter.production"
BUNDLE_NAME: "IonicStarter"
COMPRESS_ASSETS: true
# If those 2 variables are defined, the app will be deployed to the remote server after compiling the release.
# ANDROID_DEPLOY_APPBIN_PATH: "deploy@ionicstarter.com:/u/apps/ionicstarter/shared/public/uploads/ionicstarter-production.apk"
# ANDROID_DEPLOY_APPBIN_URL: "http://ionicstarter.com/uploads/ionicstarter-production.apk"
# If those 2 variables are defined, the app will be deployed to the remote server after compiling the release.
# IOS_DEPLOY_APPBIN_PATH: "deploy@ionicstarter.com:/u/apps/ionicstarter/shared/public/uploads/ionicstarter-production.ipa"
# IOS_DEPLOY_APPBIN_URL: "http://ionicstarter.com/uploads/ionicstarter-production.ipa"
# Required for the release to be signed with correct certificate.
IOS_PROVISIONING_PROFILE: "keys/ios/ionicstarterstaging.mobileprovision"
# CORDOVA_GOOGLE_ANALYTICS_ID: "UA-123123-2"
# GOOGLE_ANALYTICS_ID: "UA-123123-1"
# GOOGLE_ANALYTICS_HOST: "ionicstarter.com"
}
}
# _PUBLIC_GLOBALS_KEYS defines which @GLOBALS
# will be actually passed into the frontend's application.
# (rest of globals are visible only in gulp and shell scripts)
#
# The filtered globals will be available under GulpConfig.PUBLIC_GLOBALS.
@_PUBLIC_GLOBALS_KEYS = [
"ANGULAR_APP_NAME"
"BUNDLE_NAME"
"BUNDLE_VERSION"
"CODE_VERSION"
"CORDOVA_GOOGLE_ANALYTICS_ID"
"DEPLOY_TIME"
"ENV"
"GOOGLE_ANALYTICS_HOST"
"GOOGLE_ANALYTICS_ID"
"ROLLBAR_CLIENT_ACCESS_TOKEN"
"ROLLBAR_SOURCEMAPS_URL_PREFIX"
"WEINRE_ADDRESS"
]
@_PUBLIC_GLOBALS_KEYS = @_PUBLIC_GLOBALS_KEYS.concat([
"HTTP_SERVER_IP"
"HTTP_SERVER_PORT"
]) unless gulp.env.appstore || gulp.env.release
# _SHELL_GLOBALS_KEYS defines which @GLOBALS
# will be passed to some of the shell tasks (f.e. those in tasks/cordova.coffee).
#
# The filtered globals will be available under GulpConfig.SHELL_GLOBALS.
@_SHELL_GLOBALS_KEYS = [
"BUNDLE_ID"
"BUNDLE_NAME"
"BUNDLE_VERSION"
"IOS_PROVISIONING_PROFILE"
]
@_regenerateGlobals()
@PATHS = {
assets: ['assets/**', '!assets/**/*.ejs']
assets_ejs: ['assets/**/*.ejs']
watched_assets: ['assets/fonts/**', 'assets/images/**', 'assets/js/**', '!assets/*.ejs']
styles: ['app/css/**/*.scss']
scripts:
vendor: [
"assets/components/urijs/src/URI.js"
"assets/components/ionic/release/js/ionic.js"
"assets/components/angular/angular.js"
"assets/components/angular-animate/angular-animate.js"
"assets/components/angular-sanitize/angular-sanitize.js"
"assets/components/angular-ui-router/release/angular-ui-router.js"
"assets/components/ionic/release/js/ionic-angular.js"
# Here add any vendor files that should be included in vendor.js
# (f.e. bower components)
# Google Analytics support (for both in-browser and Cordova app)
"assets/components/angulartics/src/angulartics.js"
"assets/components/angulartics/src/angulartics-ga.js"
"assets/components/angulartics/src/angulartics-ga-cordova.js"
]
app: [
'app/js/config/**/*.coffee' # initialize & configure the angular's app
'app/js/*/**/*.coffee' # include all angular submodules (like controllers, directives, services)
'app/js/routes.coffee' # app.config - set routes
]
tests:
e2e: [
'test/e2e/*_test.coffee'
]
templates: ['app/templates/**/*.jade']
views: ['app/**/*.jade', '!app/templates/**/*.jade']
}
@DESTINATIONS = {
assets: "#{@GLOBALS.BUILD_DIR}"
styles: "#{@GLOBALS.BUILD_DIR}/css"
scripts: "#{@GLOBALS.BUILD_DIR}/js"
views: "#{@GLOBALS.BUILD_DIR}"
livereload: [
"#{@GLOBALS.BUILD_DIR}/**/*"
"!#{@GLOBALS.BUILD_DIR}/**/*.map"
"!#{@GLOBALS.BUILD_DIR}/config.xml"
]
unnecessary_assets: [
"#{@GLOBALS.BUILD_DIR}/**/*.map"
]
}
updateGlobalsDefaults: (GLOBALS_DEFAULTS) ->
extend true, @_GLOBALS_DEFAULTS, GLOBALS_DEFAULTS
@_regenerateGlobals()
filterPublicGlobals: (@_PUBLIC_GLOBALS_KEYS) ->
@PUBLIC_GLOBALS = {}
for key in @_PUBLIC_GLOBALS_KEYS
@PUBLIC_GLOBALS[key] = @GLOBALS[key] if @GLOBALS[key]?
filterShellGlobals: (@_SHELL_GLOBALS_KEYS) ->
@SHELL_GLOBALS = {}
for key in @_SHELL_GLOBALS_KEYS
@SHELL_GLOBALS[key] = @GLOBALS[key] if @GLOBALS[key]?
_regenerateGlobals: ->
@GLOBALS = require('extend') true, {}, @_GLOBALS_DEFAULTS.defaults, (@_GLOBALS_DEFAULTS[gutil.env.env || "development"] || {})
Object.keys(@GLOBALS).forEach (k) =>
# If a @GLOBALS[k] is a function,
# then let's use it as a dynamic getter
# (More information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
if typeof @GLOBALS[k] == "function"
getter = @GLOBALS[k]
Object.defineProperty @GLOBALS, k, get: => getter(@GLOBALS)
# You can replace any of @GLOBALS by defining ENV variable in your command line,
# f.e. `BUNDLE_ID="com.different.bundleid" gulp`
@GLOBALS[k] = process.env[k] if process.env[k]?
# You can also do this in this way:
# `gulp --BUNDLE_ID="com.different.bundleid"`
@GLOBALS[k] = gulp.env[k] if gulp.env[k]?
@filterPublicGlobals(@_PUBLIC_GLOBALS_KEYS)
@filterShellGlobals(@_SHELL_GLOBALS_KEYS)