UNPKG

13.6 kBJavaScriptView Raw
1'use strict';
2
3/* global process:false */
4
5var _ = require('underscore');
6
7module.exports = function(grunt) {
8 require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
9 grunt.registerTask('runlog', function() {
10 grunt.log.write('http://localhost:8282/example/demo.html');
11 });
12
13 grunt.registerTask('awsconfig', function() {
14 var awsConfig;
15 try {
16 awsConfig = grunt.file.readJSON('grunt-aws.json');
17 }
18 catch (e) {
19 awsConfig = {};
20 }
21
22 awsConfig.key = (process.env.AWS_ACCESS_KEY_ID || awsConfig.key);
23 awsConfig.secret = (process.env.AWS_SECRET_ACCESS_KEY || awsConfig.secret);
24 awsConfig.bucket = (process.env.SK_JS_S3_BUCKET || awsConfig.bucket);
25
26 grunt.config.set('aws', awsConfig);
27 });
28
29 // Project configuration
30 grunt.initConfig({
31 // Metadata
32 pkg: grunt.file.readJSON('package.json'),
33 license: grunt.file.read('LICENSE'),
34 banner: '/*! \n\t<%= pkg.name %> <%= pkg.version %> \n\t<%= license %> \n*/\n',
35 // Task configuration
36 clean: ['dist/*'],
37 karma: {
38 unit: {
39 configFile: 'karma.conf.js',
40 singleRun: false,
41 browsers: ['PhantomJS', 'Chrome'],
42 reporters: ['progress']
43 },
44 ci: {
45 configFile: 'karma.conf.js',
46 singleRun: true,
47 browsers: ['PhantomJS']
48 }
49 },
50
51 watch: {
52 dev: {
53 files: ['src/js/**/*.js', '*.html', 'src/templates/*.tpl', 'src/stylesheets/*.less', 'config/config.json', 'example/template/*'],
54 tasks: ['devbuild'],
55 options: {
56 spawn: false,
57 }
58 },
59 min: {
60 files: ['src/js/**/*.js', '*.html', 'src/templates/*.tpl', 'src/stylesheets/*.less', 'config/config.json', 'example/template/*'],
61 tasks: ['devbuild:min'],
62 options: {
63 spawn: false,
64 },
65 }
66 },
67
68 uglify: {
69 options: {
70 banner: '<%= banner %>'
71 },
72 dist: {
73 src: 'dist/supportkit.js',
74 dest: 'dist/supportkit.min.js'
75 }
76 },
77
78 replace: {
79 dist: {
80 src: 'dist/supportkit.js',
81 dest: 'dist/supportkit.js',
82 replacements: [{
83 from: /var ROOT_URL = '.*';/,
84 to: 'var ROOT_URL = "<%= config.ROOT_URL %>";'
85 }]
86 },
87 demo: {
88 src: 'example/template/demo.html',
89 dest: 'example/demo.html',
90 replacements: [{
91 from: /APP_TOKEN/,
92 to: '<%= config.APP_TOKEN %>'
93 }, {
94 from: /GIVEN_NAME/,
95 to: '<%= config.GIVEN_NAME %>'
96 }, {
97 from: /JWT/,
98 to: '<%= config.JWT %>'
99 }, {
100 from: /USER_ID/,
101 to: '<%= config.USER_ID %>'
102 }, {
103 from: /SURNAME/,
104 to: '<%= config.SURNAME %>'
105 }, {
106 from: /EMAIL/,
107 to: '<%= config.EMAIL %>'
108 }, {
109 from: /WIDGET_CODE/,
110 to: '<%= config.WIDGET_CODE %>'
111 }]
112 }
113 },
114
115 'http-server': {
116 'dev': {
117 root: '.',
118 port: 8282,
119 host: '127.0.0.1',
120 showDir: true,
121 autoIndex: true,
122 ext: 'html',
123 runInBackground: false
124 }
125 },
126
127 browserify: {
128 dist: {
129 files: {
130 'dist/supportkit.js': ['src/js/main.js'],
131 }
132 },
133 options: {
134 browserifyOptions: {
135 debug: true,
136 'transform': [
137 'browserify-shim'
138 ],
139 standalone: 'SupportKit'
140 }
141 }
142 },
143 compress: {
144 main: {
145 options: {
146 mode: 'gzip',
147 level: 5
148 },
149 src: 'dist/supportkit.min.js',
150 dest: 'dist/supportkit.min.js.gz'
151 }
152 },
153
154 s3: {
155 options: {
156 key: '<%= aws.key %>',
157 secret: '<%= aws.secret %>',
158 bucket: '<%= aws.bucket %>',
159 access: 'public-read'
160 },
161 js: {
162 // Files to be uploaded.
163 upload: [{
164 src: 'dist/supportkit.min.js',
165 dest: 'supportkit.min.js'
166 }, {
167 src: 'dist/supportkit.min.js.gz',
168 dest: 'supportkit.min.js.gz',
169 options: {
170 gzip: true,
171 headers: {
172 'Content-Type': 'text/javascript'
173 }
174 }
175 }]
176 },
177 images: {
178 upload: [
179 {
180 src: 'src/images/**',
181 dest: 'images/',
182 options: {
183 gzip: true
184 }
185 }
186 ]
187 }
188 },
189
190 concurrent: {
191 dev: ['http-server', 'watch:dev'],
192 min: ['http-server', 'watch:min'],
193 options: {
194 logConcurrentOutput: true
195 }
196 },
197
198 cloudfront: {
199 options: {
200 region: 'us-east-1', // your AWS region
201 distributionId: 'E1RI234SLR5ORA', // DistributionID where files are stored
202 credentials: {
203 accessKeyId: '<%= aws.key %>',
204 secretAccessKey: '<%= aws.secret %>'
205 },
206 listInvalidations: true, // if you want to see the status of invalidations
207 listDistributions: false, // if you want to see your distributions list in the console
208 version: '1.0' // if you want to invalidate a specific version (file-1.0.js)
209 },
210 prod: {
211 options: {
212 distributionId: 'E1RI234SLR5ORA'
213 },
214 CallerReference: Date.now().toString(),
215 Paths: {
216 Quantity: 2,
217 Items: ['/supportkit.min.js', '/supportkit.min.js.gz']
218 }
219 }
220 },
221
222 release: {
223 options: {
224 npm: true,
225 bump: false,
226 commit: true,
227 push: false,
228 remote: 'https://github.com/supportkit/supportkit-js.git',
229 github: {
230 repo: 'supportkit/supportkit-js', //put your user/repo here
231 accessTokenVar: 'GITHUB_ACCESS_TOKEN',
232 releaseNotes: 'release_notes'
233 }
234 }
235 },
236
237 exec: {
238 createRelease: {
239 cmd: function() {
240 return [
241 'git checkout -b r/' + this.option('globalVersion')
242 ].join(' && ');
243 }
244 },
245 cleanRelease: {
246 cmd: function() {
247 return [
248 'git checkout master',
249 'git branch -D r/' + this.option('globalVersion'),
250 'git tag -d ' + this.option('globalVersion')
251 ].join(' && ');
252 }
253 },
254 commitFiles: {
255 cmd: function() {
256 return [
257 'git commit -am "Release v' + this.option('globalVersion') + ' [ci skip]"'
258 ].join(' && ');
259 }
260 },
261 push: {
262 cmd: function() {
263 return [
264 'git push origin master',
265 'git checkout integration',
266 'git merge master --no-ff',
267 'git push origin integration'
268 ].join(' && ');
269 }
270 },
271 addDist: {
272 cmd: function() {
273 return [
274 'git add --force dist/supportkit.js',
275 'git add --force dist/supportkit.min.js'
276 ].join(' && ');
277 }
278 }
279 },
280
281 gitinfo: {
282 commands: {
283 'status.porcelain': ['status', '--porcelain']
284 }
285 }
286 });
287
288 grunt.registerTask('checkBranchStatus', 'A task that ensures the correct branch is checked out and there are no working changes.', function() {
289 var gitInfo = grunt.config.get('gitinfo');
290
291 if (gitInfo.status.porcelain || gitInfo.local.branch.current.name !== 'master') {
292 grunt.log.error('Error. Please make sure you have master checked out and there are no working changes.');
293 grunt.log.error('Git Status:', '\n' + gitInfo.status.porcelain);
294 grunt.log.error('Git Branch: ', '\n ' + gitInfo.local.branch.current.name);
295 return false;
296 }
297
298 if (!process.env.GITHUB_ACCESS_TOKEN) {
299 grunt.log.error('Please set your github access token as env variables (GITHUB_ACCESS_TOKEN)');
300 return false;
301 }
302 });
303
304 grunt.registerTask('versionBump', function() {
305 var semver = require('semver'),
306 VERSION_REGEXP = /(\bversion[\'\"]?\s*[:=]\s*[\'\"])([\da-z\.-]+)([\'\"])/i,
307 files = ['package.json', 'bower.json', 'src/js/main.js'],
308 fullVersion = grunt.option('version'),
309 versionType = grunt.option('versionType'),
310 globalVersion;
311
312 files.forEach(function(file) {
313 var version = null;
314 var content = grunt.file.read(file).replace(VERSION_REGEXP, function(match, prefix, parsedVersion, suffix) {
315 version = fullVersion || semver.inc(parsedVersion, versionType);
316 return prefix + version + suffix;
317 });
318
319 if (!globalVersion) {
320 globalVersion = version;
321 } else if (globalVersion !== version) {
322 grunt.warn('Bumping multiple files with different versions!');
323 }
324
325 grunt.file.write(file, content);
326 grunt.log.ok('Version bumped to ' + version + (files.length > 1 ? ' (in ' + file + ')' : ''));
327 });
328
329 grunt.option('globalVersion', globalVersion);
330
331 try {
332 grunt.file.read('release_notes/v' + globalVersion + '.md');
333 }
334 catch (err) {
335 grunt.log.error('Release notes not found.');
336 grunt.log.error('Please ensure release notes exist in the release_notes folder. (v' + globalVersion + '.md)');
337 return false;
338 }
339 });
340
341 grunt.registerTask('publish', 'Publishes a build to github and NPM, accepting a version as argument', function(version) {
342 if (!version || ['major', 'minor', 'patch'].indexOf(version) > -1) {
343 grunt.option('versionType', version || 'patch');
344 } else {
345 grunt.option('version', version);
346 }
347
348 grunt.task.run('branchCheck', 'publish:prepare', 'publish:release', 'publish:cleanup');
349 });
350
351 grunt.registerTask('loadConfig', 'Loads config from config folder (uses default if none present', function() {
352 var defaultConfig = grunt.file.readJSON('config/default/config.json');
353 var config = {};
354
355 try {
356 config = grunt.file.readJSON('config/config.json');
357 }
358 catch (err) {
359 grunt.log.warn('You might want to create a config with your app token at config/config.json');
360 }
361
362 var merged = _.extend(defaultConfig, config);
363 grunt.config.set('config', merged);
364 });
365
366 grunt.registerTask('setMinMode', function() {
367 grunt.config.set('config.WIDGET_CODE', 'supportkit.min.js');
368 });
369
370 grunt.registerTask('build', ['clean', 'browserify', 'uglify', 'compress']);
371 grunt.registerTask('devbuild', ['clean', 'browserify', 'loadConfig', 'replace']);
372 grunt.registerTask('devbuild:min', ['clean', 'browserify', 'loadConfig', 'setMinMode', 'replace', 'uglify']);
373 grunt.registerTask('deploy', ['build', 'awsconfig', 's3:js', 'cloudfront:prod']);
374 grunt.registerTask('run', ['runlog', 'devbuild', 'concurrent:dev']);
375 grunt.registerTask('run:min', ['runlog', 'devbuild:min', 'concurrent:min']);
376 grunt.registerTask('test', ['karma:unit']);
377 grunt.registerTask('test:ci', ['karma:ci']);
378 grunt.registerTask('default', ['run']);
379
380 grunt.registerTask('publish:prepare', ['versionBump', 'exec:commitFiles', 'exec:createRelease', 'build', 'exec:addDist']);
381 grunt.registerTask('publish:release', ['release']);
382 grunt.registerTask('publish:cleanup', ['exec:cleanRelease', 'exec:push']);
383
384 grunt.registerTask('branchCheck', 'Checks that you are publishing from Master branch with no working changes', ['gitinfo', 'checkBranchStatus']);
385
386 grunt.registerTask('cdnify', ['awsconfig', 's3:images']);
387};