0
|
1 /* global module:false */
|
|
2 module.exports = function(grunt) {
|
|
3
|
|
4 var fs, files, opts, spawn, builds = {};
|
|
5
|
|
6 opts = {
|
|
7 baseUrl: "src",
|
|
8 name: "../build/REPLACE",
|
|
9 out: "dist/REPLACE.js",
|
|
10 mainConfigFile: "build/config/production.js"
|
|
11 };
|
|
12
|
|
13 fs = require( 'fs' );
|
|
14 files = fs.readdirSync( "build/custom/" );
|
|
15
|
|
16 files.forEach(function( file ) {
|
|
17 if( /\.js$/.test(file) ){
|
|
18 var name = file.replace(/\.js$/, ""),
|
|
19 o = Object.create(opts);
|
|
20
|
|
21 builds[name] = {
|
|
22 options: o
|
|
23 };
|
|
24
|
|
25 builds[name].options.name = o.name.replace("REPLACE", "custom/" + name );
|
|
26 builds[name].options.out = o.out.replace("REPLACE", name );
|
|
27 }
|
|
28 });
|
|
29
|
|
30 builds.production = {
|
|
31 options: {
|
|
32 baseUrl: "src",
|
|
33 name: "../build/production",
|
|
34 out: "dist/production.js",
|
|
35 mainConfigFile: "build/config/production.js"
|
|
36 }
|
|
37 };
|
|
38
|
|
39 // NOTE config includes development
|
|
40 builds.development = {
|
|
41 options: {
|
|
42 baseUrl: "src",
|
|
43 // NOTE uses the same meta-module as production
|
|
44 name: "../build/development",
|
|
45 out: "dist/development.js",
|
|
46 mainConfigFile: "build/config/development.js"
|
|
47 }
|
|
48 };
|
|
49
|
|
50 // Project configuration.
|
|
51 grunt.initConfig({
|
|
52 pkg: grunt.file.readJSON( 'package.json' ),
|
|
53
|
|
54 meta: {
|
|
55 banner: '/*! Shoestring - v<%= pkg.version %> - ' +
|
|
56 '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
|
|
57 '* http://github.com/filamentgroup/shoestring/\n' +
|
|
58 '* Copyright (c) <%= grunt.template.today("yyyy") %> ' +
|
|
59 'Scott Jehl, Filament Group, Inc; Licensed MIT & GPLv2 */ \n'
|
|
60 },
|
|
61
|
|
62 qunit: {
|
|
63 files: ['test/unit/*.html']
|
|
64 },
|
|
65
|
|
66 requirejs: builds,
|
|
67
|
|
68 // NOTE purely for the banner
|
|
69 concat: {
|
|
70 options: {
|
|
71 banner: '<%= meta.banner %>',
|
|
72 stripBanners: true
|
|
73 },
|
|
74
|
|
75 production: {
|
|
76 src: ['dist/production.js'],
|
|
77 dest: 'dist/shoestring.js'
|
|
78 },
|
|
79
|
|
80 development: {
|
|
81 src: ['dist/development.js'],
|
|
82 dest: 'dist/shoestring-dev.js'
|
|
83 }
|
|
84 },
|
|
85
|
|
86 uglify: {
|
|
87 all: {
|
|
88 options: {
|
|
89 banner: '<%= meta.banner %>',
|
|
90 report: 'gzip'
|
|
91 },
|
|
92
|
|
93 files: {
|
|
94 'dist/shoestring.min.js': ['dist/shoestring.js'],
|
|
95 'dist/shoestring-dev.min.js': ['dist/shoestring-dev.js']
|
|
96 }
|
|
97 }
|
|
98 },
|
|
99
|
|
100 jshint: {
|
|
101 all: {
|
|
102 options: {
|
|
103 jshintrc: ".jshintrc",
|
|
104 },
|
|
105
|
|
106 src: ['Gruntfile.js', 'src/**/*.js']
|
|
107 }
|
|
108 },
|
|
109 watch: {
|
|
110 js: {
|
|
111 files: [
|
|
112 'src/**'
|
|
113 ],
|
|
114 tasks: 'default'
|
|
115 }
|
|
116 }
|
|
117 });
|
|
118
|
|
119 spawn = require('child_process').spawn;
|
|
120
|
|
121 grunt.registerTask('docs', function() {
|
|
122 var doxx, srcs, args = [], done = this.async();
|
|
123
|
|
124 for(var i in arguments){
|
|
125 args.push(arguments[i]);
|
|
126 }
|
|
127
|
|
128 srcs = args.length ? srcs = args.join(":") : "src";
|
|
129
|
|
130 doxx = spawn( 'node', ['node_modules/.bin/doxx', '--source', srcs, '--target', 'dist/docs']);
|
|
131
|
|
132 doxx.on( 'close', function( code ) {
|
|
133 console.log( "doxx completed with exit code: " + code );
|
|
134 done();
|
|
135 });
|
|
136 });
|
|
137
|
|
138 // These plugins provide necessary tasks.
|
|
139 grunt.loadNpmTasks('grunt-contrib-concat');
|
|
140 grunt.loadNpmTasks('grunt-contrib-uglify');
|
|
141 grunt.loadNpmTasks('grunt-contrib-qunit');
|
|
142 grunt.loadNpmTasks('grunt-contrib-jshint');
|
|
143 grunt.loadNpmTasks('grunt-contrib-requirejs');
|
|
144 grunt.loadNpmTasks('grunt-contrib-watch');
|
|
145
|
|
146 // Default task.
|
|
147 grunt.registerTask('build', 'requirejs concat uglify'.split(' ') );
|
|
148 grunt.registerTask('test', 'jshint qunit'.split(' ') );
|
|
149 grunt.registerTask('default', 'build test'.split(' ') );
|
|
150 };
|