allow choosing what game modules to include
This commit is contained in:
parent
72054d4f8e
commit
f1db68390a
|
@ -62,6 +62,10 @@ Building
|
|||
- build: `gulp build`
|
||||
- `dist/browser` contains the javascript library to build web applications, `dist/node` is the module to be used for node.js applications
|
||||
|
||||
Notes:
|
||||
- using `gulp build watch` instead of `gulp build` makes *gulp* start watching files after the build. Whenever a file is changed, a build is automatically generated
|
||||
- you can use `--no-default-games` to prevent including the game modules from directory, and `--modules <colon-separated-directories>` to specify additional game modules to include. For instance, `gulp --no-default-games --modules src/games/chessbase:src/games/checkers build` will only generate distribution for Chess and checkers games
|
||||
|
||||
API Documentation
|
||||
-----------------
|
||||
|
||||
|
|
443
gulpfile.js
443
gulpfile.js
|
@ -1,5 +1,6 @@
|
|||
|
||||
/* jshint esversion:6 */
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const gulp = require('gulp');
|
||||
const debug = require('gulp-debug');
|
||||
|
@ -22,16 +23,15 @@ const gulpif = require('gulp-if');
|
|||
const gutil = require('gulp-util');
|
||||
|
||||
const modulifyHeaders = {
|
||||
model:
|
||||
`exports.model = Model = {
|
||||
model:
|
||||
`exports.model = Model = {
|
||||
Game: {},
|
||||
Board: {},
|
||||
Move: {}
|
||||
};
|
||||
`
|
||||
,
|
||||
view:
|
||||
`exports.view = View = {
|
||||
`,
|
||||
view:
|
||||
`exports.view = View = {
|
||||
Game: {},
|
||||
Board: {},
|
||||
Move: {}
|
||||
|
@ -41,58 +41,71 @@ const modulifyHeaders = {
|
|||
|
||||
const allGames = {};
|
||||
|
||||
var moduleDirs = [];
|
||||
var modulesMap = {};
|
||||
|
||||
if (typeof argv.defaultGames == "undefined" || argv.defaultGames)
|
||||
moduleDirs = fs.readdirSync("src/games").map((dir) => {
|
||||
return path.join("src/games", dir);
|
||||
});
|
||||
if (argv.modules)
|
||||
moduleDirs = moduleDirs.concat(argv.modules.split(":"));
|
||||
moduleDirs.forEach((dir) => {
|
||||
modulesMap[path.basename(dir)] = dir;
|
||||
});
|
||||
|
||||
function HandleModuleGames(modelOnly) {
|
||||
|
||||
return through.obj(function(file,enc,next) {
|
||||
// this is executed for every game module
|
||||
var push = this.push.bind(this);
|
||||
var moduleName = path.basename(file.path);
|
||||
var moduleManifest = require(file.path);
|
||||
var streams = [];
|
||||
moduleManifest.games.forEach((game) => {
|
||||
// this is executed for every game in the game module
|
||||
return through.obj(function (file, enc, next) {
|
||||
// this is executed for every game module
|
||||
var push = this.push.bind(this);
|
||||
var moduleName = path.basename(file.path);
|
||||
var moduleManifest = require(file.path);
|
||||
var streams = [];
|
||||
moduleManifest.games.forEach((game) => {
|
||||
// this is executed for every game in the game module
|
||||
|
||||
// same some game data so we can list all games later
|
||||
allGames[game.name] = {
|
||||
title: game.config.model["title-en"],
|
||||
summary: game.config.model.summary,
|
||||
thumbnail: game.config.model.thumbnail,
|
||||
module: moduleName,
|
||||
// same some game data so we can list all games later
|
||||
allGames[game.name] = {
|
||||
title: game.config.model["title-en"],
|
||||
summary: game.config.model.summary,
|
||||
thumbnail: game.config.model.thumbnail,
|
||||
module: moduleName,
|
||||
obsolete: game.config.model.obsolete
|
||||
};
|
||||
};
|
||||
|
||||
// create the game config file
|
||||
push(new Vinyl({
|
||||
path: moduleName+"/"+game.name+"-config.js",
|
||||
contents: new Buffer('exports.config = '+JSON.stringify(game.config))
|
||||
}));
|
||||
// create the game config file
|
||||
push(new Vinyl({
|
||||
path: moduleName + "/" + game.name + "-config.js",
|
||||
contents: new Buffer('exports.config = ' + JSON.stringify(game.config))
|
||||
}));
|
||||
|
||||
// create some specified resources
|
||||
if(!modelOnly) {
|
||||
// create some specified resources
|
||||
if (!modelOnly) {
|
||||
var resources = {
|
||||
model: ["thumbnail","rules","description","credits"],
|
||||
model: ["thumbnail", "rules", "description", "credits"],
|
||||
view: ["css"]
|
||||
};
|
||||
["model","view"].forEach((modelView)=>{
|
||||
resources[modelView].forEach((field)=>{
|
||||
["model", "view"].forEach((modelView) => {
|
||||
resources[modelView].forEach((field) => {
|
||||
var files = [];
|
||||
switch(typeof game.config[modelView][field]) {
|
||||
switch (typeof game.config[modelView][field]) {
|
||||
case "string":
|
||||
files.push(game.config[modelView][field]);
|
||||
break;
|
||||
case "object":
|
||||
for(var f in game.config[modelView][field])
|
||||
for (var f in game.config[modelView][field])
|
||||
files.push(game.config[modelView][field][f]);
|
||||
break;
|
||||
}
|
||||
files = files.map((file)=>{
|
||||
return "src/games/"+moduleName+"/"+file;
|
||||
files = files.map((file) => {
|
||||
return path.join(modulesMap[moduleName], file);
|
||||
});
|
||||
var stream = gulp.src(files)
|
||||
.pipe(rename(function(path) {
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname = moduleName;
|
||||
}))
|
||||
.pipe(through.obj(function(file,enc,next) {
|
||||
.pipe(through.obj(function (file, enc, next) {
|
||||
push(file);
|
||||
next();
|
||||
}))
|
||||
|
@ -102,234 +115,234 @@ function HandleModuleGames(modelOnly) {
|
|||
});
|
||||
}
|
||||
|
||||
// create model and view script files
|
||||
function Scripts(which) {
|
||||
var scripts = game[which+"Scripts"].map((script) => {
|
||||
return "src/games/"+moduleName+"/"+script;
|
||||
});
|
||||
var fileName = moduleName+"/"+game.name+"-"+which+".js";
|
||||
var stream = gulp.src(scripts)
|
||||
.pipe(gulpif(!argv.prod,sourcemaps.init()))
|
||||
.pipe(add('_',modulifyHeaders[which],true))
|
||||
// create model and view script files
|
||||
function Scripts(which) {
|
||||
var scripts = game[which + "Scripts"].map((script) => {
|
||||
return path.join(modulesMap[moduleName], script);
|
||||
});
|
||||
var fileName = moduleName + "/" + game.name + "-" + which + ".js";
|
||||
var stream = gulp.src(scripts)
|
||||
.pipe(gulpif(!argv.prod, sourcemaps.init()))
|
||||
.pipe(add('_', modulifyHeaders[which], true))
|
||||
.pipe(concat(fileName))
|
||||
.pipe(gulpif(argv.prod,uglify()))
|
||||
.pipe(gulpif(argv.prod, uglify()))
|
||||
.on('error', function (err) { gutil.log(gutil.colors.red('[Error]'), err.toString()); })
|
||||
.pipe(gulpif(!argv.prod,sourcemaps.write('.')))
|
||||
.pipe(through.obj(function(file,enc,next) {
|
||||
push(file);
|
||||
next();
|
||||
}))
|
||||
streams.push(stream);
|
||||
}
|
||||
if(modelOnly)
|
||||
Scripts("model");
|
||||
else
|
||||
["model","view"].forEach(Scripts);
|
||||
});
|
||||
.pipe(gulpif(!argv.prod, sourcemaps.write('.')))
|
||||
.pipe(through.obj(function (file, enc, next) {
|
||||
push(file);
|
||||
next();
|
||||
}));
|
||||
streams.push(stream);
|
||||
}
|
||||
if (modelOnly)
|
||||
Scripts("model");
|
||||
else
|
||||
["model", "view"].forEach(Scripts);
|
||||
});
|
||||
|
||||
// create module common resources
|
||||
if(!modelOnly) {
|
||||
var stream = gulp.src("src/games/"+moduleName+"/res/**/*")
|
||||
.pipe(rename(function(path) {
|
||||
path.dirname = moduleName + "/res/" +path.dirname;
|
||||
}))
|
||||
.pipe(through.obj(function(file,enc,next) {
|
||||
push(file);
|
||||
next();
|
||||
}))
|
||||
;
|
||||
streams.push(stream);
|
||||
}
|
||||
// create module common resources
|
||||
if (!modelOnly) {
|
||||
var stream = gulp.src(modulesMap[moduleName] + "/res/**/*")
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname = moduleName + "/res/" + path.dirname;
|
||||
}))
|
||||
.pipe(through.obj(function (file, enc, next) {
|
||||
push(file);
|
||||
next();
|
||||
}))
|
||||
;
|
||||
streams.push(stream);
|
||||
}
|
||||
|
||||
merge(streams)
|
||||
.on("finish",function() {
|
||||
next();
|
||||
})
|
||||
|
||||
});
|
||||
merge(streams)
|
||||
.on("finish", function () {
|
||||
next();
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
gulp.task("build-node-games",function() {
|
||||
return gulp.src("src/games/*")
|
||||
.pipe(HandleModuleGames(true))
|
||||
.pipe(gulp.dest("dist/node/games"));
|
||||
gulp.task("build-node-games", function () {
|
||||
return gulp.src(moduleDirs)
|
||||
.pipe(HandleModuleGames(true))
|
||||
.pipe(gulp.dest("dist/node/games"));
|
||||
});
|
||||
|
||||
function ProcessJS(stream,concatName,skipBabel) {
|
||||
if(!argv.prod)
|
||||
stream = stream.pipe(sourcemaps.init());
|
||||
if(!skipBabel)
|
||||
stream = stream.pipe(babel({
|
||||
presets: ['es2015'],
|
||||
compact: !!argv.prod
|
||||
}));
|
||||
if(argv.prod)
|
||||
stream = stream.pipe(uglify())
|
||||
.on('error', function(err) {
|
||||
gutil.log(gutil.colors.red('[Error]'), err.toString());
|
||||
this.emit('end');
|
||||
})
|
||||
if(concatName)
|
||||
stream = stream.pipe(concat(concatName));
|
||||
if(!argv.prod)
|
||||
stream = stream.pipe(sourcemaps.write("."));
|
||||
return stream;
|
||||
function ProcessJS(stream, concatName, skipBabel) {
|
||||
if (!argv.prod)
|
||||
stream = stream.pipe(sourcemaps.init());
|
||||
if (!skipBabel)
|
||||
stream = stream.pipe(babel({
|
||||
presets: ['es2015'],
|
||||
compact: !!argv.prod
|
||||
}));
|
||||
if (argv.prod)
|
||||
stream = stream.pipe(uglify())
|
||||
.on('error', function (err) {
|
||||
gutil.log(gutil.colors.red('[Error]'), err.toString());
|
||||
this.emit('end');
|
||||
});
|
||||
if (concatName)
|
||||
stream = stream.pipe(concat(concatName));
|
||||
if (!argv.prod)
|
||||
stream = stream.pipe(sourcemaps.write("."));
|
||||
return stream;
|
||||
}
|
||||
|
||||
gulp.task("build-node-core",function() {
|
||||
gulp.task("build-node-core", function () {
|
||||
|
||||
var joclyCoreStream =
|
||||
ProcessJS(gulp.src([
|
||||
"src/core/jocly.core.js",
|
||||
]));
|
||||
var joclyCoreStream =
|
||||
ProcessJS(gulp.src([
|
||||
"src/core/jocly.core.js",
|
||||
]));
|
||||
|
||||
var joclyBaseStream =
|
||||
ProcessJS(gulp.src([
|
||||
"src/core/jocly.util.js",
|
||||
"src/core/jocly.uct.js",
|
||||
"src/core/jocly.game.js"
|
||||
]));
|
||||
var joclyBaseStream =
|
||||
ProcessJS(gulp.src([
|
||||
"src/core/jocly.util.js",
|
||||
"src/core/jocly.uct.js",
|
||||
"src/core/jocly.game.js"
|
||||
]));
|
||||
|
||||
var allGamesStream = source('jocly-allgames.js');
|
||||
allGamesStream.end('exports.games = '+JSON.stringify(allGames));
|
||||
allGamesStream = ProcessJS(allGamesStream.pipe(buffer()));
|
||||
var allGamesStream = source('jocly-allgames.js');
|
||||
allGamesStream.end('exports.games = ' + JSON.stringify(allGames));
|
||||
allGamesStream = ProcessJS(allGamesStream.pipe(buffer()));
|
||||
|
||||
return merge(joclyCoreStream,allGamesStream,joclyBaseStream)
|
||||
.pipe(gulp.dest("dist/node"));
|
||||
return merge(joclyCoreStream, allGamesStream, joclyBaseStream)
|
||||
.pipe(gulp.dest("dist/node"));
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
function CopyLicense(target) {
|
||||
return gulp.src(["COPYING.md","CONTRIBUTING.md","AGPL-3.0.txt"])
|
||||
.pipe(gulp.dest(target));
|
||||
return gulp.src(["COPYING.md", "CONTRIBUTING.md", "AGPL-3.0.txt"])
|
||||
.pipe(gulp.dest(target));
|
||||
}
|
||||
|
||||
gulp.task("copy-browser-license",function() {
|
||||
return CopyLicense("dist/browser");
|
||||
gulp.task("copy-browser-license", function () {
|
||||
return CopyLicense("dist/browser");
|
||||
});
|
||||
|
||||
gulp.task("copy-node-license",function() {
|
||||
return CopyLicense("dist/node");
|
||||
gulp.task("copy-node-license", function () {
|
||||
return CopyLicense("dist/node");
|
||||
});
|
||||
|
||||
gulp.task("build-node",function(callback) {
|
||||
runSequence("build-node-games",["build-node-core","copy-node-license"],callback);
|
||||
gulp.task("build-node", function (callback) {
|
||||
runSequence("build-node-games", ["build-node-core", "copy-node-license"], callback);
|
||||
});
|
||||
|
||||
gulp.task("build-browser-games",function() {
|
||||
return gulp.src("src/games/*")
|
||||
.pipe(HandleModuleGames(false))
|
||||
.pipe(gulp.dest("dist/browser/games"));
|
||||
gulp.task("build-browser-games", function () {
|
||||
return gulp.src(moduleDirs)
|
||||
.pipe(HandleModuleGames(false))
|
||||
.pipe(gulp.dest("dist/browser/games"));
|
||||
});
|
||||
|
||||
gulp.task("build-browser-core",function() {
|
||||
|
||||
var _ProcessJS = function(s) { return s; }
|
||||
gulp.task("build-browser-core", function () {
|
||||
|
||||
var b = browserify({
|
||||
entries: "src/browser/jocly.js",
|
||||
debug: true,
|
||||
standalone: "Jocly"
|
||||
});
|
||||
var _ProcessJS = function (s) { return s; };
|
||||
|
||||
var joclyBrowserStream = ProcessJS(b.bundle()
|
||||
.pipe(source('jocly.js'))
|
||||
.pipe(buffer()));
|
||||
var b = browserify({
|
||||
entries: "src/browser/jocly.js",
|
||||
debug: true,
|
||||
standalone: "Jocly"
|
||||
});
|
||||
|
||||
var joclyCoreStream = ProcessJS(gulp.src([
|
||||
"src/core/jocly.core.js",
|
||||
]));
|
||||
var joclyBrowserStream = ProcessJS(b.bundle()
|
||||
.pipe(source('jocly.js'))
|
||||
.pipe(buffer()));
|
||||
|
||||
var joclyBaseStream = ProcessJS(gulp.src([
|
||||
"src/core/jocly.util.js",
|
||||
"src/core/jocly.uct.js",
|
||||
"src/core/jocly.game.js"
|
||||
]),"jocly.game.js",true);
|
||||
var joclyCoreStream = ProcessJS(gulp.src([
|
||||
"src/core/jocly.core.js",
|
||||
]));
|
||||
|
||||
var joclyExtraScriptsStream = ProcessJS(gulp.src([
|
||||
"src/browser/jocly.aiworker.js",
|
||||
"src/browser/jocly.embed.js"
|
||||
]));
|
||||
var joclyBaseStream = ProcessJS(gulp.src([
|
||||
"src/core/jocly.util.js",
|
||||
"src/core/jocly.uct.js",
|
||||
"src/core/jocly.game.js"
|
||||
]), "jocly.game.js", true);
|
||||
|
||||
var joclyExtraStream = gulp.src([
|
||||
"src/browser/jocly.embed.html"
|
||||
]);
|
||||
var joclyExtraScriptsStream = ProcessJS(gulp.src([
|
||||
"src/browser/jocly.aiworker.js",
|
||||
"src/browser/jocly.embed.js"
|
||||
]));
|
||||
|
||||
var joclyResStream = gulp.src("src/browser/res/**/*")
|
||||
.pipe(rename(function(path) {
|
||||
path.dirname = "res/"+path.dirname;
|
||||
}));
|
||||
var joclyExtraStream = gulp.src([
|
||||
"src/browser/jocly.embed.html"
|
||||
]);
|
||||
|
||||
var allGamesStream = source('jocly-allgames.js');
|
||||
allGamesStream.end('exports.games = '+JSON.stringify(allGames));
|
||||
allGamesStream = ProcessJS(allGamesStream.pipe(buffer()));
|
||||
var joclyResStream = gulp.src("src/browser/res/**/*")
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname = "res/" + path.dirname;
|
||||
}));
|
||||
|
||||
return merge(joclyBrowserStream,joclyCoreStream,allGamesStream,joclyBaseStream,
|
||||
joclyExtraStream,joclyExtraScriptsStream,joclyResStream)
|
||||
.pipe(gulp.dest("dist/browser"));
|
||||
var allGamesStream = source('jocly-allgames.js');
|
||||
allGamesStream.end('exports.games = ' + JSON.stringify(allGames));
|
||||
allGamesStream = ProcessJS(allGamesStream.pipe(buffer()));
|
||||
|
||||
return merge(joclyBrowserStream, joclyCoreStream, allGamesStream, joclyBaseStream,
|
||||
joclyExtraStream, joclyExtraScriptsStream, joclyResStream)
|
||||
.pipe(gulp.dest("dist/browser"));
|
||||
|
||||
});
|
||||
|
||||
gulp.task("build-browser-xdview",function() {
|
||||
const lib = "third-party/";
|
||||
const src = "src/";
|
||||
const srcLib = "src/lib/";
|
||||
const nmLib = "node_modules/";
|
||||
gulp.task("build-browser-xdview", function () {
|
||||
const lib = "third-party/";
|
||||
const src = "src/";
|
||||
const srcLib = "src/lib/";
|
||||
const nmLib = "node_modules/";
|
||||
|
||||
var libs = ProcessJS(gulp.src([
|
||||
lib+"three.js",
|
||||
nmLib+"jquery/dist/jquery.js"
|
||||
]));
|
||||
var libs = ProcessJS(gulp.src([
|
||||
lib + "three.js",
|
||||
nmLib + "jquery/dist/jquery.js"
|
||||
]));
|
||||
|
||||
var packedLibs = ProcessJS(gulp.src([
|
||||
lib+"SubdivisionModifier.js",
|
||||
lib+"tween.js",
|
||||
lib+"tween.fix.js",
|
||||
srcLib+"JoclyOrbitControls.js",
|
||||
lib+"DeviceOrientationControls.js",
|
||||
lib+"Projector.js",
|
||||
lib+"threex.domevent.js",
|
||||
lib+"threex.domevent.object3d.js",
|
||||
lib+"StereoEffect.js",
|
||||
lib+"AnaglyphEffect.js",
|
||||
srcLib+"VRGamepad.js",
|
||||
lib+"VRControls.js",
|
||||
lib+"VREffect.js",
|
||||
lib+"OBJLoader.js",
|
||||
lib+"MTLLoader.js",
|
||||
src+"browser/jocly.ar.js",
|
||||
src+"browser/jocly.state-machine.js",
|
||||
src+"browser/jocly.xd-view.js"
|
||||
]),"jocly-xdview.js",true);
|
||||
var packedLibs = ProcessJS(gulp.src([
|
||||
lib + "SubdivisionModifier.js",
|
||||
lib + "tween.js",
|
||||
lib + "tween.fix.js",
|
||||
srcLib + "JoclyOrbitControls.js",
|
||||
lib + "DeviceOrientationControls.js",
|
||||
lib + "Projector.js",
|
||||
lib + "threex.domevent.js",
|
||||
lib + "threex.domevent.object3d.js",
|
||||
lib + "StereoEffect.js",
|
||||
lib + "AnaglyphEffect.js",
|
||||
srcLib + "VRGamepad.js",
|
||||
lib + "VRControls.js",
|
||||
lib + "VREffect.js",
|
||||
lib + "OBJLoader.js",
|
||||
lib + "MTLLoader.js",
|
||||
src + "browser/jocly.ar.js",
|
||||
src + "browser/jocly.state-machine.js",
|
||||
src + "browser/jocly.xd-view.js"
|
||||
]), "jocly-xdview.js", true);
|
||||
|
||||
return merge(libs,packedLibs)
|
||||
.pipe(gulp.dest("dist/browser"))
|
||||
;
|
||||
return merge(libs, packedLibs)
|
||||
.pipe(gulp.dest("dist/browser"))
|
||||
;
|
||||
|
||||
});
|
||||
|
||||
gulp.task("build-browser",function(callback) {
|
||||
runSequence("build-browser-games",["build-browser-core",
|
||||
"build-browser-xdview","copy-browser-license"],callback);
|
||||
gulp.task("build-browser", function (callback) {
|
||||
runSequence("build-browser-games", ["build-browser-core",
|
||||
"build-browser-xdview", "copy-browser-license"], callback);
|
||||
});
|
||||
|
||||
|
||||
gulp.task("build",function(callback) {
|
||||
runSequence("clean",["build-browser","build-node"],callback);
|
||||
gulp.task("build", function (callback) {
|
||||
runSequence("clean", ["build-browser", "build-node"], callback);
|
||||
});
|
||||
|
||||
gulp.task("clean",function() {
|
||||
return del(["dist/*"],{force:true});
|
||||
gulp.task("clean", function () {
|
||||
return del(["dist/*"], { force: true });
|
||||
});
|
||||
|
||||
gulp.task("watch",function() {
|
||||
gulp.watch("src/games/**/*",["build-node-games","build-browser-games"]);
|
||||
gulp.watch("src/{browser,core,lib}/**/*",["build-browser-core","build-browser-xdview"]);
|
||||
gulp.watch("src/{node,core}/**/*",["build-node-core"]);
|
||||
gulp.task("watch", function () {
|
||||
gulp.watch(moduleDirs.map((dir) => { return dir + "/**/*"; }), ["build-node-games", "build-browser-games"]);
|
||||
gulp.watch("src/{browser,core,lib}/**/*", ["build-browser-core", "build-browser-xdview"]);
|
||||
gulp.watch("src/{node,core}/**/*", ["build-node-core"]);
|
||||
});
|
||||
|
||||
gulp.task("help", function() {
|
||||
var help = `
|
||||
gulp.task("help", function () {
|
||||
var help = `
|
||||
usage: gulp [<commands>] [<options>]
|
||||
|
||||
commands:
|
||||
|
@ -338,7 +351,9 @@ commands:
|
|||
|
||||
options:
|
||||
--prod: generate for production
|
||||
--no-default-games: do not process game module from default src/games directory
|
||||
--modules: process additional game modules from specified directories (colon separated)
|
||||
`;
|
||||
console.log(help);
|
||||
process.exit(0);
|
||||
console.log(help);
|
||||
process.exit(0);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue