From 407b8056169facec3ffd26e4d6b4b21aaab8641e Mon Sep 17 00:00:00 2001 From: moscovium Date: Wed, 3 Oct 2018 16:57:57 +0200 Subject: [PATCH] builders: webpack resource builder --- .../[system]/[builders]/webpack/.gitignore | 2 + .../[builders]/webpack/__resource.lua | 3 + .../[system]/[builders]/webpack/package.json | 16 ++++ .../[builders]/webpack/webpack_builder.js | 86 +++++++++++++++++++ .../[builders]/webpack/webpack_runner.js | 26 ++++++ 5 files changed, 133 insertions(+) create mode 100644 resources/[system]/[builders]/webpack/.gitignore create mode 100644 resources/[system]/[builders]/webpack/__resource.lua create mode 100644 resources/[system]/[builders]/webpack/package.json create mode 100644 resources/[system]/[builders]/webpack/webpack_builder.js create mode 100644 resources/[system]/[builders]/webpack/webpack_runner.js diff --git a/resources/[system]/[builders]/webpack/.gitignore b/resources/[system]/[builders]/webpack/.gitignore new file mode 100644 index 0000000..09c4241 --- /dev/null +++ b/resources/[system]/[builders]/webpack/.gitignore @@ -0,0 +1,2 @@ +yarn.lock +node_modules/ \ No newline at end of file diff --git a/resources/[system]/[builders]/webpack/__resource.lua b/resources/[system]/[builders]/webpack/__resource.lua new file mode 100644 index 0000000..96b0ede --- /dev/null +++ b/resources/[system]/[builders]/webpack/__resource.lua @@ -0,0 +1,3 @@ +dependency 'yarn' +server_only 'yes' +server_script 'webpack_builder.js' \ No newline at end of file diff --git a/resources/[system]/[builders]/webpack/package.json b/resources/[system]/[builders]/webpack/package.json new file mode 100644 index 0000000..a9164a4 --- /dev/null +++ b/resources/[system]/[builders]/webpack/package.json @@ -0,0 +1,16 @@ +{ + "name": "webpack-builder", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "async": "^2.6.1", + "webpack": "^4.12.0", + "worker-farm": "^1.6.0" + } +} diff --git a/resources/[system]/[builders]/webpack/webpack_builder.js b/resources/[system]/[builders]/webpack/webpack_builder.js new file mode 100644 index 0000000..9324deb --- /dev/null +++ b/resources/[system]/[builders]/webpack/webpack_builder.js @@ -0,0 +1,86 @@ +const path = require('path'); +const workerFarm = require('worker-farm'); +const async = require('async'); + +const justBuilt = {}; + +const webpackBuildTask = { + shouldBuild(resourceName) { + const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config'); + + if (numMetaData > 0) { + if (!(resourceName in justBuilt)) { + return true; + } + + delete justBuilt[resourceName]; + } + + return false; + }, + + build(resourceName, cb) { + const configs = []; + const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config'); + + for (let i = 0; i < numMetaData; i++) { + configs.push(GetResourceMetadata(resourceName, 'webpack_config', i)); + } + + async.forEachOf(configs, (configName, i, acb) => { + const configPath = GetResourcePath(resourceName) + '/' + configName; + + const config = require(configPath); + + const workers = workerFarm(require.resolve('./webpack_runner')); + + if (config) { + const resourcePath = path.resolve(GetResourcePath(resourceName)); + + workers({ + configPath, + resourcePath + }, (err, outp) => { + workerFarm.end(workers); + + if (err) { + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + + acb("worker farm webpack errored out"); + return; + } + + if (outp.errors) { + for (const error of outp.errors) { + console.log(error); + } + acb("webpack got an error"); + return; + } + + acb(); + }); + + return; + } + + acb("no configuration"); + }, (err) => { + setImmediate(() => { + if (err) { + cb(false, err); + return; + } + + justBuilt[resourceName] = true; + + cb(true); + }); + }); + } +} + +RegisterResourceBuildTaskFactory('z_webpack', () => webpackBuildTask); \ No newline at end of file diff --git a/resources/[system]/[builders]/webpack/webpack_runner.js b/resources/[system]/[builders]/webpack/webpack_runner.js new file mode 100644 index 0000000..638aba4 --- /dev/null +++ b/resources/[system]/[builders]/webpack/webpack_runner.js @@ -0,0 +1,26 @@ +const weebpack = require('webpack'); +const path = require('path'); + +module.exports = (inp, callback) => { + const config = require(inp.configPath); + + config.context = inp.resourcePath; + + if (config.output && config.output.path) { + config.output.path = path.resolve(inp.resourcePath, config.output.path); + } + + weebpack(config, (err, stats) => { + if (err) { + callback(err); + return; + } + + if (stats.hasErrors()) { + callback(null, stats.toJson()); + return; + } + + callback(null, {}); + }); +}; \ No newline at end of file