const gulp = require('gulp'); const path = require('path'); const fs = require('fs'); //const concat = require('gulp-concat'); //const uglify = require('gulp-uglify'); //const babel = require('gulp-babel'); //const template = require('gulp-template'); const Haxe = require('./haxe'); const FlashPlayer = require('./flashplayer'); const Debug = require('./debug'); const webserver = require('gulp-webserver'); const run = require('../run/index'); const tail = require('./tail'); //const deb = require('gulp-debian'); const {BuildSystem, Platform, Config} = require('./core'); const vfs = require('vinyl-fs'); const rename = require('gulp-rename'); const streamToPromise = (stream) => { return new Promise((resolve, reject) => { stream.on("end", resolve); stream.on("error", reject); }); }; /** * */ class Target { constructor() { this.target = 'target'; } targetPath(name, platform) { return path.resolve(this.target, name, platform); } } /** * */ class Builder extends Target { constructor(buildSystem) { super(); this.buildSystem = buildSystem; } prepare() { return Promise.resolve(); } call(debug) { throw 'Not Implemented'; } static register(buildSystem, builder) { Builder.factory[buildSystem] = builder; } static new(buildSystem, config) { return new Builder.factory[buildSystem](buildSystem, config); } } Builder.factory = {}; /** * */ class HaxeBuilder extends Builder { constructor(buildSystem) { super(buildSystem); this.haxe = new Haxe(); } prepare() { return this.haxe.prepare(); } call(platform, config, debug) { const target = this.targetPath(config.name, platform); switch (this.buildSystem) { case BuildSystem.OPENFL: return this.haxe.openfl('build', platform, config, debug) .then(result => streamToPromise(result.pipe(vfs.dest(target)))); case BuildSystem.HAXE: return this.haxe.build(platform, config, debug) .then(result => streamToPromise(result.pipe(vfs.dest(target)))); } } } Builder.register(BuildSystem.HAXE, HaxeBuilder); Builder.register(BuildSystem.OPENFL, HaxeBuilder); /** * */ class Runner extends Target { constructor(platform, name) { super(); this.platform = platform; this.name = name; } prepare() { return Promise.resolve(); } call(debug) { throw 'Not Implemented'; } targetPath() { return super.targetPath(this.name, this.platform); } log(stream) { stream .pipe(tail(new Debug().log)) .pipe(rename('out.log')) .pipe(gulp.dest(this.targetPath())); } static register(platform, builder) { Runner.factory[platform] = builder; } static new(platform, name) { return new Runner.factory[platform](platform, name); } } Runner.factory = {}; /** * */ class FlashRunner extends Runner { constructor(platform, name) { super(platform, name); this.player = new FlashPlayer(); } prepare() { return this.player.prepare(); } call(debug) { const target = this.targetPath(); const filename = path.resolve(target, this.name+'.swf'); const player = this.player.flashPlayerBin(debug); FlashPlayer.trust(filename); fs.writeFileSync(FlashPlayer.log, ''); const result = gulp.src(filename).pipe(run(player + " <%=file.basename%>", {cwd: target})); return this.log(gulp.src(FlashPlayer.log)); } } Runner.register(Platform.FLASH, FlashRunner); /** * */ class Html5Runner extends Runner { call(debug) { return gulp.src(this.targetPath()) .pipe(webserver({ host: 'localhost', port: 3000, open: true, fallback: 'index.html' })); } } Runner.register(Platform.HTML5, Html5Runner); /** * */ class LinuxRunner extends Runner { call(debug) { const target = this.targetPath(); const filename = path.resolve(target, this.name); const result = gulp.src(filename).pipe(run("./<%=file.basename%>", {cwd: target})); return this.log(result); } } Runner.register(Platform.LINUX, LinuxRunner); /** * */ class NekoRunner extends Runner { call(debug) { const target = this.targetPath(); const filename = path.resolve(target, this.name+'.n'); const result = gulp.src(filename).pipe(run("neko <%=file.path%>", {cwd: target})); return this.log(result); } } Runner.register(Platform.NEKO, NekoRunner); /** * */ class Project { constructor(buildSystem, platforms, config) { this.buildSystem = buildSystem; this.platforms = platforms; this.config = config; } build(platform) { const builder = Builder.new(this.buildSystem); return [ () => builder.prepare(), () => builder.call(platform, this.config) ]; } run(platform) { const builder = Builder.new(this.buildSystem); const runner = Runner.new(platform, this.config.name); const debug = new Debug(); return [ () => builder.prepare(), () => builder.call(platform, this.config, debug), () => runner.prepare(), () => runner.call(debug) ]; } bind(module, external_gulp /* ToDo: spike */) { for (const platform of this.platforms) { module.exports[`${this.config.name}:${platform}:build`] = (external_gulp || gulp).series(this.build(platform)); module.exports[`${this.config.name}:${platform}:run`] = (external_gulp || gulp).series(this.run(platform)); } return this; } } Project.BuildSystem = BuildSystem; Project.Platform = Platform; Project.Config = Config; Project.Builder = Builder; Project.Runner = Runner; module.exports = Project;