414 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			414 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.writeHaxeProject = void 0;
 | |
| const fs = require("fs-extra");
 | |
| const path = require("path");
 | |
| const XmlWriter_1 = require("./XmlWriter");
 | |
| function copyAndReplace(from, to, names, values) {
 | |
|     let data = fs.readFileSync(from, { encoding: 'utf8' });
 | |
|     for (let i = 0; i < names.length; ++i) {
 | |
|         data = data.replace(new RegExp(names[i], 'g'), values[i]);
 | |
|     }
 | |
|     fs.writeFileSync(to, data, { encoding: 'utf8' });
 | |
| }
 | |
| function escapeXml(s) {
 | |
|     return s.replace(/[<>&'"]/g, c => {
 | |
|         switch (c) {
 | |
|             case '<': return '<';
 | |
|             case '>': return '>';
 | |
|             case '&': return '&';
 | |
|             case '\'': return ''';
 | |
|             case '"': return '"';
 | |
|             default: throw 'unreachable code';
 | |
|         }
 | |
|     });
 | |
| }
 | |
| function IntelliJ(projectdir, options) {
 | |
|     let indir = path.join(__dirname, '..', 'Data', 'intellij');
 | |
|     let outdir = path.join(projectdir, options.safeName + '-' + options.system + '-intellij');
 | |
|     let sources = '';
 | |
|     for (let i = 0; i < options.sources.length; ++i) {
 | |
|         if (path.isAbsolute(options.sources[i])) {
 | |
|             sources += '      <sourceFolder url="file://' + options.sources[i] + '" isTestSource="false" />\n';
 | |
|         }
 | |
|         else {
 | |
|             sources += '      <sourceFolder url="file://$MODULE_DIR$/' + path.relative(outdir, path.resolve(options.from, options.sources[i])).replace(/\\/g, '/') + '" isTestSource="false" />\n';
 | |
|         }
 | |
|     }
 | |
|     let libraries = '';
 | |
|     for (let i = 0; i < options.libraries.length; ++i) {
 | |
|         if (path.isAbsolute(options.libraries[i].libpath)) {
 | |
|             libraries += '    <content url="file://' + options.libraries[i].libroot + '">\n';
 | |
|             libraries += '      <sourceFolder url="file://' + options.libraries[i].libpath + '" isTestSource="false" />\n';
 | |
|         }
 | |
|         else {
 | |
|             libraries += '    <content url="file://$MODULE_DIR$/' + path.relative(outdir, path.resolve(options.from, options.libraries[i].libroot)).replace(/\\/g, '/') + '">\n';
 | |
|             libraries += '      <sourceFolder url="file://$MODULE_DIR$/' + path.relative(outdir, path.resolve(options.from, options.libraries[i].libpath)).replace(/\\/g, '/') + '" isTestSource="false" />\n';
 | |
|         }
 | |
|         libraries += '    </content>\n';
 | |
|     }
 | |
|     let args = '';
 | |
|     let defines = '';
 | |
|     for (let i = 0; i < options.defines.length; ++i) {
 | |
|         defines += options.defines[i];
 | |
|         if (i < options.defines.length - 1)
 | |
|             defines += ',';
 | |
|     }
 | |
|     for (let param of options.parameters) {
 | |
|         defines += param + ',';
 | |
|     }
 | |
|     let target;
 | |
|     switch (options.language) {
 | |
|         case 'hl':
 | |
|         case 'cpp':
 | |
|             target = 'C++';
 | |
|             break;
 | |
|         case 'as':
 | |
|             target = 'Flash';
 | |
|             args = '-swf-version 16.0';
 | |
|             break;
 | |
|         case 'cs':
 | |
|             target = 'C#';
 | |
|             if (fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'netlib'))) {
 | |
|                 args = '-net-std ' + path.relative(outdir, path.join(options.haxeDirectory, 'netlib'));
 | |
|             }
 | |
|             break;
 | |
|         case 'java':
 | |
|             target = 'Java';
 | |
|             if (fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar'))) {
 | |
|                 args = '-java-lib ' + path.relative(outdir, path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar'));
 | |
|             }
 | |
|             break;
 | |
|         case 'js':
 | |
|             target = 'JavaScript';
 | |
|             break;
 | |
|     }
 | |
|     fs.copySync(path.join(indir, 'name.iml'), path.join(outdir, options.name + '.iml'), { overwrite: true });
 | |
|     copyAndReplace(path.join(indir, 'name.iml'), path.join(outdir, options.name + '.iml'), ['{name}', '{sources}', '{libraries}', '{target}', '{system}', '{args}'], [options.safeName, sources, libraries, target, options.system, args]);
 | |
|     fs.copySync(path.join(indir, 'idea', 'compiler.xml'), path.join(outdir, '.idea', 'compiler.xml'), { overwrite: true });
 | |
|     copyAndReplace(path.join(indir, 'idea', 'haxe.xml'), path.join(outdir, '.idea', 'haxe.xml'), ['{defines}'], [defines]);
 | |
|     fs.copySync(path.join(indir, 'idea', 'misc.xml'), path.join(outdir, '.idea', 'misc.xml'), { overwrite: true });
 | |
|     copyAndReplace(path.join(indir, 'idea', 'modules.xml'), path.join(outdir, '.idea', 'modules.xml'), ['{name}'], [options.name]);
 | |
|     fs.copySync(path.join(indir, 'idea', 'vcs.xml'), path.join(outdir, '.idea', 'vcs.xml'), { overwrite: true });
 | |
|     copyAndReplace(path.join(indir, 'idea', 'name'), path.join(outdir, '.idea', '.name'), ['{name}'], [options.name]);
 | |
|     fs.copySync(path.join(indir, 'idea', 'copyright', 'profiles_settings.xml'), path.join(outdir, '.idea', 'copyright', 'profiles_settings.xml'), { overwrite: true });
 | |
| }
 | |
| function hxml(projectdir, options) {
 | |
|     let data = '';
 | |
|     let lines = [];
 | |
|     // returns only unique lines and '' otherwise
 | |
|     function unique(line) {
 | |
|         if (lines.indexOf(line) === -1) {
 | |
|             lines.push(line);
 | |
|             return line;
 | |
|         }
 | |
|         return '';
 | |
|     }
 | |
|     for (let i = 0; i < options.sources.length; ++i) {
 | |
|         if (path.isAbsolute(options.sources[i])) {
 | |
|             data += unique('-cp ' + options.sources[i] + '\n');
 | |
|         }
 | |
|         else {
 | |
|             data += unique('-cp ' + path.relative(projectdir, path.resolve(options.from, options.sources[i])) + '\n'); // from.resolve('build').relativize(from.resolve(this.sources[i])).toString());
 | |
|         }
 | |
|     }
 | |
|     for (let i = 0; i < options.libraries.length; ++i) {
 | |
|         if (path.isAbsolute(options.libraries[i].libpath)) {
 | |
|             data += unique('-cp ' + options.libraries[i].libpath + '\n');
 | |
|         }
 | |
|         else {
 | |
|             data += unique('-cp ' + path.relative(projectdir, path.resolve(options.from, options.libraries[i].libpath)) + '\n'); // from.resolve('build').relativize(from.resolve(this.sources[i])).toString());
 | |
|         }
 | |
|     }
 | |
|     for (let d in options.defines) {
 | |
|         let define = options.defines[d];
 | |
|         data += unique('-D ' + define + '\n');
 | |
|     }
 | |
|     if (options.language === 'cpp') {
 | |
|         data += unique('-cpp ' + path.normalize(options.to) + '\n');
 | |
|     }
 | |
|     else if (options.language === 'cs') {
 | |
|         data += unique('-cs ' + path.normalize(options.to) + '\n');
 | |
|         if (fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'netlib'))) {
 | |
|             data += unique('-net-std ' + path.relative(projectdir, path.join(options.haxeDirectory, 'netlib')) + '\n');
 | |
|         }
 | |
|     }
 | |
|     else if (options.language === 'java') {
 | |
|         data += unique('-java ' + path.normalize(options.to) + '\n');
 | |
|         if (fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar'))) {
 | |
|             data += unique('-java-lib ' + path.relative(projectdir, path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar')) + '\n');
 | |
|         }
 | |
|     }
 | |
|     else if (options.language === 'js') {
 | |
|         data += unique('-js ' + path.normalize(options.to) + '\n');
 | |
|     }
 | |
|     else if (options.language === 'as') {
 | |
|         data += unique('-swf ' + path.normalize(options.to) + '\n');
 | |
|         data += unique('-swf-version ' + options.swfVersion + '\n');
 | |
|         data += unique('-swf-header ' + options.width + ':' + options.height + ':' + options.framerate + ':' + options.stageBackground + '\n');
 | |
|     }
 | |
|     else if (options.language === 'xml') {
 | |
|         data += unique('-xml ' + path.normalize(options.to) + '\n');
 | |
|         data += unique('--macro include(\'kha\')\n');
 | |
|     }
 | |
|     else if (options.language === 'hl') {
 | |
|         data += unique('-hl ' + path.normalize(options.to) + '\n');
 | |
|     }
 | |
|     for (let param of options.parameters) {
 | |
|         data += unique(param + '\n');
 | |
|     }
 | |
|     if (!options.parameters.some((param) => param.includes('-main '))) {
 | |
|         const entrypoint = options ? options.main ? options.main : 'Main' : 'Main';
 | |
|         data += unique('-main ' + entrypoint + '\n');
 | |
|     }
 | |
|     fs.outputFileSync(path.join(projectdir, 'project-' + options.system + '.hxml'), data);
 | |
| }
 | |
| function FlashDevelop(projectdir, options) {
 | |
|     let platform;
 | |
|     switch (options.language) {
 | |
|         case 'hl':
 | |
|         case 'cpp':
 | |
|             platform = 'C++';
 | |
|             break;
 | |
|         case 'as':
 | |
|             platform = 'Flash Player';
 | |
|             break;
 | |
|         case 'cs':
 | |
|             platform = 'C#';
 | |
|             break;
 | |
|         case 'java':
 | |
|             platform = 'Java';
 | |
|             break;
 | |
|         case 'js':
 | |
|             platform = 'JavaScript';
 | |
|             break;
 | |
|     }
 | |
|     options.swfVersion = 'swfVersion' in options ? options.swfVersion : 16.0;
 | |
|     options.stageBackground = 'stageBackground' in options ? options.stageBackground : 'ffffff';
 | |
|     options.framerate = 'framerate' in options ? options.framerate : 30;
 | |
|     let swfVersion = parseFloat(options.swfVersion).toFixed(1).split('.');
 | |
|     let output = {
 | |
|         n: 'output',
 | |
|         e: [
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 outputType: 'Application'
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 input: ''
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 path: path.normalize(options.to)
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 fps: options.framerate
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 width: options.width
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 height: options.height
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 version: swfVersion[0]
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 minorVersion: swfVersion[1]
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 platform: platform
 | |
|             },
 | |
|             {
 | |
|                 n: 'movie',
 | |
|                 background: '#' + options.stageBackground
 | |
|             }
 | |
|         ]
 | |
|     };
 | |
|     if (fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory()) {
 | |
|         output.e.push({
 | |
|             n: 'movie',
 | |
|             preferredSDK: path.relative(projectdir, options.haxeDirectory)
 | |
|         });
 | |
|     }
 | |
|     let classpaths = [];
 | |
|     for (let i = 0; i < options.sources.length; ++i) {
 | |
|         classpaths.push(path.relative(projectdir, path.resolve(options.from, options.sources[i])));
 | |
|     }
 | |
|     for (let i = 0; i < options.libraries.length; ++i) {
 | |
|         classpaths.push(path.relative(projectdir, path.resolve(options.from, options.libraries[i].libpath)));
 | |
|     }
 | |
|     let otheroptions = [
 | |
|         {
 | |
|             n: 'option',
 | |
|             showHiddenPaths: 'False'
 | |
|         }
 | |
|     ];
 | |
|     if (options.language === 'cpp' || options.system === 'krom') {
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovie: 'Custom'
 | |
|         });
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovieCommand: 'run_' + options.system + '.bat'
 | |
|         });
 | |
|     }
 | |
|     else if (options.language === 'cs' || options.language === 'java') {
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovie: 'OpenDocument'
 | |
|         });
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovieCommand: ''
 | |
|         });
 | |
|     }
 | |
|     else if (options.language === 'js') {
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovie: 'Webserver'
 | |
|         });
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovieCommand: path.join(path.parse(options.to).dir, 'index.html')
 | |
|         });
 | |
|     }
 | |
|     else {
 | |
|         otheroptions.push({
 | |
|             n: 'option',
 | |
|             testMovie: 'Default'
 | |
|         });
 | |
|     }
 | |
|     let def = '';
 | |
|     for (let d of options.defines) {
 | |
|         def += '-D ' + d + '
';
 | |
|     }
 | |
|     if (options.language === 'java' && fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar'))) {
 | |
|         def += '-java-lib ' + path.relative(projectdir, path.join(options.haxeDirectory, 'hxjava', 'hxjava-std.jar')) + '
';
 | |
|     }
 | |
|     if (options.language === 'cs' && fs.existsSync(options.haxeDirectory) && fs.statSync(options.haxeDirectory).isDirectory() && fs.existsSync(path.join(options.haxeDirectory, 'netlib'))) {
 | |
|         def += '-net-std ' + path.relative(projectdir, path.join(options.haxeDirectory, 'netlib')) + '
';
 | |
|     }
 | |
|     def += '-D kha_output="' + path.resolve(path.join(projectdir, options.to)) + '"
';
 | |
|     let mainClass = 'Main';
 | |
|     for (let param of options.parameters) {
 | |
|         const mainRe = /-main\s+([^\s]+)/.exec(param);
 | |
|         if (mainRe) {
 | |
|             mainClass = mainRe[1];
 | |
|         }
 | |
|         else {
 | |
|             def += escapeXml(param) + '
';
 | |
|         }
 | |
|     }
 | |
|     let project = {
 | |
|         n: 'project',
 | |
|         version: '2',
 | |
|         e: [
 | |
|             'Output SWF options',
 | |
|             output,
 | |
|             'Other classes to be compiled into your SWF',
 | |
|             {
 | |
|                 n: 'classpaths',
 | |
|                 e: classpaths
 | |
|                     .reduce((a, b) => {
 | |
|                     if (a.indexOf(b) < 0)
 | |
|                         a.push(b);
 | |
|                     return a;
 | |
|                 }, [])
 | |
|                     .map((e) => {
 | |
|                     return { n: 'class', path: e };
 | |
|                 })
 | |
|             },
 | |
|             'Build options',
 | |
|             {
 | |
|                 n: 'build',
 | |
|                 e: [
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         directives: ''
 | |
|                     },
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         flashStrict: 'False'
 | |
|                     },
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         noInlineOnDebug: 'False'
 | |
|                     },
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         mainClass: mainClass
 | |
|                     },
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         enabledebug: options.language === 'as' ? 'True' : 'False'
 | |
|                     },
 | |
|                     {
 | |
|                         n: 'option',
 | |
|                         additional: def
 | |
|                     }
 | |
|                 ]
 | |
|             },
 | |
|             'haxelib libraries',
 | |
|             {
 | |
|                 n: 'haxelib',
 | |
|                 e: [
 | |
|                     'example: <library name="..." />'
 | |
|                 ]
 | |
|             },
 | |
|             'Class files to compile (other referenced classes will automatically be included)',
 | |
|             {
 | |
|                 n: 'compileTargets',
 | |
|                 e: [
 | |
|                     {
 | |
|                         n: 'compile',
 | |
|                         path: '..\\Sources\\Main.hx'
 | |
|                     }
 | |
|                 ]
 | |
|             },
 | |
|             'Paths to exclude from the Project Explorer tree',
 | |
|             {
 | |
|                 n: 'hiddenPaths',
 | |
|                 e: [
 | |
|                     'example: <hidden path="..." />'
 | |
|                 ]
 | |
|             },
 | |
|             'Executed before build',
 | |
|             {
 | |
|                 n: 'preBuildCommand'
 | |
|             },
 | |
|             'Executed after build',
 | |
|             {
 | |
|                 n: 'postBuildCommand',
 | |
|                 alwaysRun: 'False'
 | |
|             },
 | |
|             'Other project options',
 | |
|             {
 | |
|                 n: 'options',
 | |
|                 e: otheroptions
 | |
|             },
 | |
|             'Plugin storage',
 | |
|             {
 | |
|                 n: 'storage'
 | |
|             }
 | |
|         ]
 | |
|     };
 | |
|     (0, XmlWriter_1.writeXml)(project, path.join(projectdir, options.safeName + '-' + options.system + '.hxproj'));
 | |
| }
 | |
| function writeHaxeProject(projectdir, projectFiles, options) {
 | |
|     hxml(projectdir, options);
 | |
|     if (projectFiles) {
 | |
|         FlashDevelop(projectdir, options);
 | |
|         IntelliJ(projectdir, options);
 | |
|     }
 | |
| }
 | |
| exports.writeHaxeProject = writeHaxeProject;
 | |
| //# sourceMappingURL=HaxeProject.js.map
 |