Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / jsbuilder / src / Project.js
1 Project = Ext.extend(Object, {
2     constructor : function(projectFile, builder) {
3         var fileName = projectFile.split(/\\|\//i).pop(),
4             dir = projectFile.replace(fileName, ''),
5             contents, config;
6
7         if (!Fs.exists(projectFile)) {
8             throw 'Project file doesn\'t exist';
9         }
10
11         contents = Fs.readFile(projectFile);
12         try {
13             config = JSON.parse(contents);
14         }
15         catch (e) {
16             throw 'The JSB file is not valid JSON.\n' + e.toString();
17         }
18
19         Ext.apply(config, {
20             targets: config.targets || config.pkgs || [],
21             name: config.projectName,
22             license: config.licenseText,
23             jsbDir: Fs.getFullPath(dir),
24             jsbFile: fileName,
25             packages: config.packages || [],
26             builds: config.builds || [],
27             // If the JSB file contains a deployDir property, append that to the -d deployDir
28             deployDir: builder.get('deployDir') + Fs.sep + (config.deployDir || ''),
29             resources: config.resources || []
30         });
31
32         this.builder = builder;
33         this.config = config;
34
35         this.parseTargets();
36     },
37
38     parseTargets : function() {
39         // Split targets up into packages and builds for backwards compatibility
40         this.get('targets').forEach(function(item) {
41             if (item.packages) {
42                 this.get('builds').push(item);
43             }
44             else {
45                 this.get('packages').push(item);
46             }
47         }, this);
48
49         // Convert each package config object into an actual Package instance
50         this.set('packages', this.get('packages').map(function(item) {
51             return new Package(item, this);
52         }, this));
53
54         // Convert each build config object into an actual Build instance
55         this.set('builds', this.get('builds').map(function(item) {
56             return new Build(item, this);
57         }, this));
58     },
59
60     getPackageById : function(id) {
61         var ret = false;
62         this.get('packages').forEach(function(pkg) {
63             if (pkg.get('id') == id) {
64                 ret = pkg;
65             }
66         });
67         return ret;
68     },
69
70     /**
71      * Creates the directory we are going to deploy to.
72      */
73     makeDeployDir: function() {
74         var project = this.project,
75             deployDir = Fs.mkdir(this.get('deployDir'));
76
77         this.set('deployDir', deployDir);
78
79         if (this.get('verbose')) {
80             this.log('Created the deploy directory ' + deployDir);
81         }
82     },
83
84     build : function() {
85         this.makeDeployDir();
86         this.createPackages();
87         this.createBuilds();
88         this.copyResources();
89
90         if (this.builder.get('verbose')) {
91             Logger.log('');
92         }
93         Logger.log('Done building!\n');
94     },
95
96     createPackages : function() {
97         this.get('packages').forEach(function(pkg) {
98             pkg.create();
99         });
100     },
101
102     createBuilds : function() {
103         this.get('builds').forEach(function(build) {
104             build.create();
105         });
106     },
107
108     copyResources : function() {
109         if (this.builder.get('verbose')) {
110             Logger.log('');
111         }
112
113         Logger.log('Copy resources...');
114
115         this.get('resources').forEach(function(resource) {
116             var filters = resource.filters,
117                 srcDir = this.get('jsbDir') + Fs.sep + resource.src,
118                 dest = resource.dest || resource.src;
119
120             dest = dest || '';
121             dest = this.get('deployDir') + Fs.sep + dest;
122
123             // TODO: Implement filters
124             if (this.builder.get('verbose')) {
125                 Logger.log('  + ' + resource.src + ' -> ' + dest);
126             }
127
128             Fs.copy(srcDir, dest);
129         }, this);
130     },
131
132     get : function(key) {
133         return this.config[key] || false;
134     },
135
136     set : function(key, value, ifNotExists) {
137         if (ifNotExists && this.get(key) !== false) {
138             return;
139         }
140         this.config[key] = value;
141     },
142
143     compressTarget : function(target) {
144         if (this.builder.get('nocompress') || !target.get('compress')) {
145             return;
146         }
147
148         Logger.log('  * Compress and obfuscate ' + target.get('target') + '...');
149
150         var destination = target.get('targetPath'),
151             source = destination + '-temp-' + Date.now() * Math.random(),
152             command = this.getCompressor() + '-o ' + destination + ' ' + source;
153             
154         Fs.copy(destination, source);
155         Cmd.execute(command);
156         // If we don't wait, it won't copy from the temp file.
157         if (Platform.isWindows) {
158             system.sleep(5000);
159         }
160         Fs.remove(source);
161     },
162
163     getCompressor : function() {
164         return 'java -jar ' + system.script.replace(Fs.getPath('bin/JSBuilder.js'), '') + Fs.getPath('ycompressor/ycompressor.jar') + ' --type js ';
165     },
166
167     getSourceFiles: function() {
168         Logger.log('<!--');
169         Logger.log('    Source files');
170         Logger.log('-->');
171         Logger.log('');
172
173         this.get('builds').forEach(function(build) {
174             if (build.get('packages')) {
175                 Logger.log('<!-- build: ' + build.get('name') + ' -->');
176
177                 build.get('packages').forEach(function(pkg) {
178                     pkg = build.project.getPackageById(pkg);
179
180                     Logger.log('<!-- package: ' + pkg.get('name') + ' -->');
181
182                     pkg.get('files').forEach(function(file) {
183                         Logger.log('<script type="text/javascript" src="../../' + file.path + file.name + '"></script>');
184                     });
185
186                     Logger.log('');
187                 });
188
189                 Logger.log('');
190             }
191         });
192     },
193
194     getSpecFiles: function() {
195         Logger.log('<!--');
196         Logger.log('    Spec files');
197         Logger.log('-->');
198         Logger.log('');
199
200         this.get('builds').forEach(function(build) {
201             if (build.get('packages')) {
202                 Logger.log('<!-- build: ' + build.get('name') + ' -->');
203
204                 build.get('packages').forEach(function(pkg) {
205                     pkg = build.project.getPackageById(pkg);
206
207                     Logger.log('<!-- package: ' + pkg.get('name') + ' -->');
208
209                     pkg.get('files').forEach(function(file) {
210                         Logger.log('<script type="text/javascript" src="spec/' + file.path.replace('src/', '') + file.name + '"></script>');
211                     });
212
213                     Logger.log('');
214                 });
215
216                 Logger.log('');
217             }
218         });
219     }
220 });