X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/7a654f8d43fdb43d78b63d90528bed6e86b608cc..3789b528d8dd8aad4558e38e22d775bcab1cbd36:/jsbuilder/src/Project.js diff --git a/jsbuilder/src/Project.js b/jsbuilder/src/Project.js new file mode 100644 index 00000000..0fb4067a --- /dev/null +++ b/jsbuilder/src/Project.js @@ -0,0 +1,220 @@ +Project = Ext.extend(Object, { + constructor : function(projectFile, builder) { + var fileName = projectFile.split(/\\|\//i).pop(), + dir = projectFile.replace(fileName, ''), + contents, config; + + if (!Fs.exists(projectFile)) { + throw 'Project file doesn\'t exist'; + } + + contents = Fs.readFile(projectFile); + try { + config = JSON.parse(contents); + } + catch (e) { + throw 'The JSB file is not valid JSON.\n' + e.toString(); + } + + Ext.apply(config, { + targets: config.targets || config.pkgs || [], + name: config.projectName, + license: config.licenseText, + jsbDir: Fs.getFullPath(dir), + jsbFile: fileName, + packages: config.packages || [], + builds: config.builds || [], + // If the JSB file contains a deployDir property, append that to the -d deployDir + deployDir: builder.get('deployDir') + Fs.sep + (config.deployDir || ''), + resources: config.resources || [] + }); + + this.builder = builder; + this.config = config; + + this.parseTargets(); + }, + + parseTargets : function() { + // Split targets up into packages and builds for backwards compatibility + this.get('targets').forEach(function(item) { + if (item.packages) { + this.get('builds').push(item); + } + else { + this.get('packages').push(item); + } + }, this); + + // Convert each package config object into an actual Package instance + this.set('packages', this.get('packages').map(function(item) { + return new Package(item, this); + }, this)); + + // Convert each build config object into an actual Build instance + this.set('builds', this.get('builds').map(function(item) { + return new Build(item, this); + }, this)); + }, + + getPackageById : function(id) { + var ret = false; + this.get('packages').forEach(function(pkg) { + if (pkg.get('id') == id) { + ret = pkg; + } + }); + return ret; + }, + + /** + * Creates the directory we are going to deploy to. + */ + makeDeployDir: function() { + var project = this.project, + deployDir = Fs.mkdir(this.get('deployDir')); + + this.set('deployDir', deployDir); + + if (this.get('verbose')) { + this.log('Created the deploy directory ' + deployDir); + } + }, + + build : function() { + this.makeDeployDir(); + this.createPackages(); + this.createBuilds(); + this.copyResources(); + + if (this.builder.get('verbose')) { + Logger.log(''); + } + Logger.log('Done building!\n'); + }, + + createPackages : function() { + this.get('packages').forEach(function(pkg) { + pkg.create(); + }); + }, + + createBuilds : function() { + this.get('builds').forEach(function(build) { + build.create(); + }); + }, + + copyResources : function() { + if (this.builder.get('verbose')) { + Logger.log(''); + } + + Logger.log('Copy resources...'); + + this.get('resources').forEach(function(resource) { + var filters = resource.filters, + srcDir = this.get('jsbDir') + Fs.sep + resource.src, + dest = resource.dest || resource.src; + + dest = dest || ''; + dest = this.get('deployDir') + Fs.sep + dest; + + // TODO: Implement filters + if (this.builder.get('verbose')) { + Logger.log(' + ' + resource.src + ' -> ' + dest); + } + + Fs.copy(srcDir, dest); + }, this); + }, + + get : function(key) { + return this.config[key] || false; + }, + + set : function(key, value, ifNotExists) { + if (ifNotExists && this.get(key) !== false) { + return; + } + this.config[key] = value; + }, + + compressTarget : function(target) { + if (this.builder.get('nocompress') || !target.get('compress')) { + return; + } + + Logger.log(' * Compress and obfuscate ' + target.get('target') + '...'); + + var destination = target.get('targetPath'), + source = destination + '-temp-' + Date.now() * Math.random(), + command = this.getCompressor() + '-o ' + destination + ' ' + source; + + Fs.copy(destination, source); + Cmd.execute(command); + // If we don't wait, it won't copy from the temp file. + if (Platform.isWindows) { + system.sleep(5000); + } + Fs.remove(source); + }, + + getCompressor : function() { + return 'java -jar ' + system.script.replace(Fs.getPath('bin/JSBuilder.js'), '') + Fs.getPath('ycompressor/ycompressor.jar') + ' --type js '; + }, + + getSourceFiles: function() { + Logger.log(''); + Logger.log(''); + + this.get('builds').forEach(function(build) { + if (build.get('packages')) { + Logger.log(''); + + build.get('packages').forEach(function(pkg) { + pkg = build.project.getPackageById(pkg); + + Logger.log(''); + + pkg.get('files').forEach(function(file) { + Logger.log(''); + }); + + Logger.log(''); + }); + + Logger.log(''); + } + }); + }, + + getSpecFiles: function() { + Logger.log(''); + Logger.log(''); + + this.get('builds').forEach(function(build) { + if (build.get('packages')) { + Logger.log(''); + + build.get('packages').forEach(function(pkg) { + pkg = build.project.getPackageById(pkg); + + Logger.log(''); + + pkg.get('files').forEach(function(file) { + Logger.log(''); + }); + + Logger.log(''); + }); + + Logger.log(''); + } + }); + } +});