From 744874aa616e884c3f9cb8266ae1ba22a244c17f Mon Sep 17 00:00:00 2001 From: shmyga Date: Wed, 25 Apr 2018 15:35:10 +0300 Subject: [PATCH] [project] added packers --- haxetool/core.js | 5 +- haxetool/project.js | 133 ++++++++++++++++++++++++++++++++++--- haxetool/sdk.js | 2 +- package.json | 3 +- template/flash/index.html | 26 ++++++++ template/flash/swf.js | 87 ++++++++++++++++++++++++ template/linux/app.desktop | 9 +++ template/project.hxml | 2 +- template/project.xml | 2 +- 9 files changed, 253 insertions(+), 16 deletions(-) create mode 100644 template/flash/index.html create mode 100644 template/flash/swf.js create mode 100644 template/linux/app.desktop diff --git a/haxetool/core.js b/haxetool/core.js index 01dcc83..c722d12 100644 --- a/haxetool/core.js +++ b/haxetool/core.js @@ -30,9 +30,12 @@ class Config { this.macros = []; this.meta = { title: null, + filename: null, + icon: null, version: null, pack: null, - company:null + author: null, + company: null }; if (params) { this.update(params); diff --git a/haxetool/project.js b/haxetool/project.js index 75c45f6..e8ecf17 100644 --- a/haxetool/project.js +++ b/haxetool/project.js @@ -1,6 +1,8 @@ const gulp = require('gulp'); const path = require('path'); +const os = require('os'); const fs = require('fs'); +const fse = require('fs-extra'); //const concat = require('gulp-concat'); //const uglify = require('gulp-uglify'); //const babel = require('gulp-babel'); @@ -11,10 +13,12 @@ const Debug = require('./debug'); const webserver = require('gulp-webserver'); const run = require('../run/index'); const tail = require('./tail'); -//const deb = require('gulp-debian'); +const deb = require('gulp-debian'); const {BuildSystem, Platform, Config} = require('./core'); const vfs = require('vinyl-fs'); const rename = require('gulp-rename'); +const template = require('lodash.template'); +const mkdirp = require('mkdirp'); const streamToPromise = (stream) => { @@ -61,8 +65,8 @@ class Builder extends Target { Builder.factory[buildSystem] = builder; } - static new(buildSystem, config) { - return new Builder.factory[buildSystem](buildSystem, config); + static new(buildSystem) { + return new Builder.factory[buildSystem](buildSystem); } } @@ -98,6 +102,98 @@ class HaxeBuilder extends Builder { Builder.register(BuildSystem.HAXE, HaxeBuilder); Builder.register(BuildSystem.OPENFL, HaxeBuilder); +/** + * + */ +class Packer extends Target { + + constructor(platform) { + super(); + this.platform = platform; + } + + prepare() { + return Promise.resolve(); + } + + call(config) { + throw 'Not Implemented'; + } + + static register(platform, packer) { + Packer.factory[platform] = packer; + } + + static new(platform) { + return new Packer.factory[platform](); + } +} + +Packer.factory = {}; + +/** + * + */ +class FlashPacker extends Packer { + + constructor() { + super(Platform.FLASH); + } + + call(config) { + const target = this.targetPath(config.name, this.platform); + const indexTemplate = template(fs.readFileSync(path.resolve(__dirname, '..', 'template/flash/index.html'))); + const index = indexTemplate(config); + fs.writeFileSync(path.resolve(target, 'index.html'), index); + fs.copyFileSync(path.resolve(__dirname, '..', 'template/flash/swf.js'), path.resolve(target, 'swf.js')); + return Promise.resolve(); + } +} + +Packer.register(Platform.FLASH, FlashPacker); + +/** + * + */ +class LinuxPacker extends Packer { + + constructor() { + super(Platform.LINUX); + } + + call(config) { + const target = this.targetPath(config.name, this.platform); + const buildDir = path.join(os.tmpdir(), 'build', config.name, 'debian'); + const desktopTemplate = template(fs.readFileSync(path.resolve(__dirname, '..', 'template/linux/app.desktop'))); + const desktop = desktopTemplate(config); + mkdirp.sync(`${buildDir}/usr/share/applications`); + fs.writeFileSync(`${buildDir}/usr/share/applications/${config.meta.filename}.desktop`, desktop); + fse.copySync(`${target}`, `${buildDir}/usr/share/${config.meta.filename}/`); + return gulp.src(`${buildDir}/*`) + .pipe(deb({ + package: config.meta.filename, + version: config.meta.version, + section: 'base', + priority: 'optional', + architecture: 'all', + maintainer: config.meta.author, + description: config.meta.title, + changelog: [], + postinst: [ + 'if [ "$1" = "configure" ] && [ -x "`which update-menus 2>/dev/null`" ] ; then\n' + + ' update-menus\n' + + 'fi' + ], + _target: '/', + _out: path.join(target, '..', 'debian'), + _clean: true, + _verbose: false + })); + } +} + +Packer.register(Platform.LINUX, LinuxPacker); + /** * */ @@ -227,28 +323,43 @@ class Project { build(platform) { const builder = Builder.new(this.buildSystem); + const config = this.config; return [ - () => builder.prepare(), - () => builder.call(platform, this.config) + function prepare() { return builder.prepare() }, + function build() { return builder.call(platform, config) }, ]; } run(platform) { const builder = Builder.new(this.buildSystem); const runner = Runner.new(platform, this.config.name); + const config = this.config; const debug = new Debug(); return [ - () => builder.prepare(), - () => builder.call(platform, this.config, debug), - () => runner.prepare(), - () => runner.call(debug) + function prepare() { return builder.prepare() }, + function build() { return builder.call(platform, config, debug) }, + function prepare() { return runner.prepare() }, + function run() { return runner.call(debug) }, + ]; + } + + pack(platform) { + const config = this.config; + const packer = Packer.new(platform); + return [ + function prepare() { return packer.prepare() }, + function pack() { return packer.call(config) }, ]; } bind(module, external_gulp /* ToDo: spike */) { + const _gulp = (external_gulp || gulp); 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)); + module.exports[`${this.config.name}:${platform}:build`] = _gulp.series(this.build(platform)); + module.exports[`${this.config.name}:${platform}:run`] = _gulp.series(this.run(platform)); + if (Packer.factory[platform]) { + module.exports[`${this.config.name}:${platform}:pack`] = _gulp.series(this.pack(platform, _gulp)); + } } return this; } diff --git a/haxetool/sdk.js b/haxetool/sdk.js index efc28b5..570d56c 100755 --- a/haxetool/sdk.js +++ b/haxetool/sdk.js @@ -80,7 +80,7 @@ class Sdk { if (this.prepared) { return Promise.resolve(); } else { - mkdirp(this.path); + mkdirp.sync(this.path); const bar = new ProgressBar(`${this.tag} [:bar] :percent :etas`, {width: 40, total: 1000, clear: true}); let stream = got.stream(this.link); stream = stream.on('downloadProgress', (p) => bar.update(p.percent)); diff --git a/package.json b/package.json index 9b4a8dd..ead7cc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-haxetool", - "version": "0.0.6", + "version": "0.0.7", "description": "Haxe tool for gulp", "main": "index.js", "dependencies": { @@ -10,6 +10,7 @@ "fs-extra": "^5.0.0", "got": "^8.3.0", "gulp": "^4.0.0", + "gulp-debian": "^0.1.9", "gulp-rename": "^1.2.2", "gulp-spawn": "^0.4.0", "gulp-webserver": "^0.9.1", diff --git a/template/flash/index.html b/template/flash/index.html new file mode 100644 index 0000000..4848680 --- /dev/null +++ b/template/flash/index.html @@ -0,0 +1,26 @@ + + + + + <%=meta.title%> + + + + +
+ + + \ No newline at end of file diff --git a/template/flash/swf.js b/template/flash/swf.js new file mode 100644 index 0000000..955f7d1 --- /dev/null +++ b/template/flash/swf.js @@ -0,0 +1,87 @@ +class Swf { + + constructor(element, swf, options) { + this.id = Math.floor(Math.random() * 10000); + this.options = Object.assign({ + quality: "high", + wMode: "opaque", + width: "100%", + height: "100%", + vars: {}, + }, options); + this.element = element; + this.swf = swf; + this.data = { + params: { + id: this.id, + quality: this.options.quality, + allowScriptAccess: "always", + allowFullScreen: true, + wMode: this.options.wMode, + //base: base, + swLiveConnect: true + }, + properties: { + name: this.id, + width: this.options.width, + height: this.options.height + }, + vars: this.options.vars + }; + this.swf = Swf.buildFlashElement(swf, this.data); + this.element.appendChild(this.swf); + } + + static toFlashVars(object, base) { + var queryString = []; + for (var key in object) { + var value = object[key]; + if (base) key = base + ":" + key; + var result; + switch (typeof value) { + case "object": + result = this.toFlashVars(value, key); + break; + case "array": + var qs = {}; + value.each(function (val, i) { + qs[i] = val; + }); + result = this.toFlashVars(qs, key); + break; + default: + result = key + "=" + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + } + return queryString.join("&"); + } + + static buildFlashElement(path, options) { + var params = options.params; + var vars = options.vars; + var properties = options.properties; + + params.flashVars = this.toFlashVars(vars); + var isIE = /*@cc_on!@*/false; + if (isIE) { + properties.classid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; + params.movie = path; + } else { + properties.type = "application/x-shockwave-flash"; + } + properties.data = path; + + var build = ""; + } + build += ""; + + var div = document.createElement("div"); + div.innerHTML = build; + return div.firstChild; + } +} diff --git a/template/linux/app.desktop b/template/linux/app.desktop new file mode 100644 index 0000000..65e1012 --- /dev/null +++ b/template/linux/app.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Comment=<%=meta.title%> <%=meta.version%> +Exec=bash -c 'cd "/usr/share/<%=meta.filename%>" && ./<%=meta.filename%>' +Icon=/usr/share/<%=meta.filename%>/<%=meta.icon%> +Name=<%=meta.title%> +Categories=Game +Terminal=false diff --git a/template/project.hxml b/template/project.hxml index 83bf3d7..92d78a6 100644 --- a/template/project.hxml +++ b/template/project.hxml @@ -6,4 +6,4 @@ --macro "<%=item%>"<% }); %> -main <%=main%> --<%=out%> "<%=buildDir%>/<%=platform%>/bin/<%=name%><%=ext%>" +-<%=out%> "<%=buildDir%>/<%=platform%>/bin/<%=meta.filename%><%=ext%>" diff --git a/template/project.xml b/template/project.xml index 99002e8..3f960e5 100644 --- a/template/project.xml +++ b/template/project.xml @@ -1,7 +1,7 @@ - + <% sources.forEach(function(item) { %> <% }); %> <% assets.forEach(function(item) { %>