From fc0287e05068b7f42e1f9661846155677a3f8348 Mon Sep 17 00:00:00 2001 From: cha0s Date: Wed, 24 Mar 2021 23:25:32 -0500 Subject: [PATCH] refactor: build --- .../build/src/build/app.webpack.config.js | 75 +++++++++---------- packages/core/package.json | 2 + packages/core/src/build.js | 4 +- packages/core/src/latus.js | 31 ++++++++ packages/core/src/server.js | 44 ++++++++++- packages/core/yarn.lock | 53 ++----------- packages/http/src/server.js | 12 +-- 7 files changed, 126 insertions(+), 95 deletions(-) diff --git a/packages/build/src/build/app.webpack.config.js b/packages/build/src/build/app.webpack.config.js index a44aa1f..0b4f1fa 100644 --- a/packages/build/src/build/app.webpack.config.js +++ b/packages/build/src/build/app.webpack.config.js @@ -6,7 +6,6 @@ const neutrino = require('neutrino'); const { LATUS_ONLY_BUILD = '', LATUS_BABEL_CONFIG = require.resolve('./.babelrc.js'), - LATUS_NEUTRINO_CONFIG = require.resolve('./.neutrinorc.js'), } = process.env; const onlyBuilds = LATUS_ONLY_BUILD.split(',').map((name) => name.trim()); @@ -14,42 +13,38 @@ R('@babel/register')({ configFile: LATUS_BABEL_CONFIG, }); -module.exports = process.env.LATUS_LINTING - ? neutrino(server).webpack() - : new Promise((resolve, reject) => { - try { - const latus = Latus.create(); - const configs = { - server: require(LATUS_NEUTRINO_CONFIG), - }; - latus.invokeFlat('@latus/core/build', configs); - Promise.all(Object.entries(configs).map(async ([k, v]) => [k, await v])) - .then(Object.fromEntries) - .then((configs) => { - const webpackConfigs = Object.values( - Object.entries(configs) - .reduce( - (r, [name, config]) => ({ - ...r, - ...( - (0 === onlyBuilds.length || -1 !== onlyBuilds.indexOf(name)) - ? {[name]: config} - : {} - ), - }), - {}, - ) - ) - .map((config) => neutrino(config).webpack()); - if (webpackConfigs.length > 1) { - resolve(webpackConfigs); - } - if (1 === webpackConfigs.length) { - resolve(webpackConfigs[0]); - } - }); - } - catch (error) { - reject(error); - } - }); +const gatherConfigs = async () => { + const latus = Latus.create(); + let configs = latus.invokeReduce('@latus/core/build'); + configs = Object.fromEntries( + await Promise.all(Object.entries(configs).map(async ([k, v]) => [k, await v])), + ); + latus.invokeFlat('@latus/core/build/alter', configs); + if (0 === Object.keys(onlyBuilds).length) { + return; + } + configs = Object.fromEntries( + await Promise.all(Object.entries(configs).map(async ([k, v]) => [k, await v])), + ); + if (onlyBuilds.length > 0) { + configs = Object.fromEntries( + Object.entries(configs) + .map(([k, v]) => (-1 !== onlyBuilds.indexOf(k) ? [k, v] : undefined)) + .filter((e) => !!e) + ); + } + + return configs; +}; + +const buildConfigs = async () => { + const configs = await gatherConfigs(); + const webpackConfigs = Object.values(configs).map((config) => neutrino(config).webpack()); + if (0 === webpackConfigs.length) { + console.error('Latus: nothing to build'); + await new Promise(() => {}); + } + return webpackConfigs; +}; + +module.exports = buildConfigs(); diff --git a/packages/core/package.json b/packages/core/package.json index b00f7d8..6709fb2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -27,8 +27,10 @@ "virtual.js" ], "dependencies": { + "@neutrinojs/banner": "^9.5.0", "@neutrinojs/node": "^9.1.0", "debug": "4.3.1", + "deepmerge": "^4.2.2", "js-yaml": "3.14.0", "lodash.flatten": "^4.4.0", "lodash.get": "^4.4.2", diff --git a/packages/core/src/build.js b/packages/core/src/build.js index 67a5e1e..3796bc6 100644 --- a/packages/core/src/build.js +++ b/packages/core/src/build.js @@ -101,12 +101,10 @@ export default (latus) => (neutrino) => { }); const mocha = R('@neutrinojs/mocha'); mocha()(neutrino); - if (process.env.LATUS_LINTING) { - return; - } const nodeExternals = R('webpack-node-externals'); const allowlist = [ /^@latus\/core\/virtual$/, + /^@babel\/runtime\/helpers\/esm/, ]; if ('production' !== neutrino.config.get('mode')) { neutrino.config diff --git a/packages/core/src/latus.js b/packages/core/src/latus.js index 54107b7..6b3c81f 100644 --- a/packages/core/src/latus.js +++ b/packages/core/src/latus.js @@ -2,6 +2,7 @@ import fs from 'fs'; import {join} from 'path'; import D from 'debug'; +import merge from 'deepmerge'; import yaml from 'js-yaml'; import flatten from 'lodash.flatten'; import get from 'lodash.get'; @@ -67,6 +68,17 @@ export default class Latus { this.runtimePath(`${path}/server`), ]), ).filter((path) => !!path); + const dependencies = this.dependencies(paths); + if (dependencies.dom) { + const regex = new RegExp(dependencies.dom.join('|')); + R('pirates').addHook( + () => '', + { + ignoreNodeModules: false, + matcher: (filename) => !!filename.match(regex), + }, + ); + } const pathMap = Object.fromEntries(paths.map((path) => [path, R(path)])); return new Latus({ config, @@ -74,6 +86,25 @@ export default class Latus { }); } + static dependencies(paths) { + return paths + .reduce((r, path) => { + const rc = this.runtimePath(join(path, '.latusrc.js')); + if (!rc) { + return r; + } + const config = R(rc)(this); + if (!config) { + return r; + } + return merge(r, config.dependencies); + }, {}); + } + + dependencies() { + return this.constructor.dependencies(Object.keys(this.config)); + } + get(path, defaultValue) { return get(this.config, path, defaultValue); } diff --git a/packages/core/src/server.js b/packages/core/src/server.js index 0692e69..4f464bd 100644 --- a/packages/core/src/server.js +++ b/packages/core/src/server.js @@ -1,11 +1,51 @@ +import banner from '@neutrinojs/banner'; + import build from './build'; +import R from './require'; export {default as appdata} from './appdata'; +const { + LATUS_NEUTRINO_CONFIG = R.resolve('@latus/build/build/.neutrinorc.js'), +} = process.env; + export default { hooks: { - '@latus/core/build': (configs, latus) => { - configs.server.use.unshift(build(latus)); + '@latus/core/build': (latus) => { + const config = R(LATUS_NEUTRINO_CONFIG); + config.use.unshift(build(latus)); + return { + server: config, + }; + }, + '@latus/core/build/alter': ({server}, latus) => { + if (!server) { + return; + } + const dependencies = latus.dependencies(); + if (!dependencies.dom) { + return; + } + const code = [ + `const regex = new RegExp('${dependencies.dom.join('|')}');`, + 'eval(\'require\')(\'pirates\').addHook(', + ' () => \'\',', + ' {', + ' ignoreNodeModules: false,', + ' matcher: (filename) => !!filename.match(regex),', + ' },', + ');', + ].join('\n'); + server.use.push(banner({ + banner: code, + pluginId: 'pixi-stub-banner', + })); + server.use.unshift((neutrino) => { + dependencies.dom.forEach((path) => { + neutrino.config.resolve.alias + .set(path, R.resolve('@latus/core')); + }); + }); }, '@latus/core/config': () => ({ up: [], diff --git a/packages/core/yarn.lock b/packages/core/yarn.lock index e66c685..9e72dd9 100644 --- a/packages/core/yarn.lock +++ b/packages/core/yarn.lock @@ -892,7 +892,7 @@ eslint-plugin-react "^7.21.5" eslint-plugin-react-hooks "^4.2.0" -"@neutrinojs/banner@9.5.0", "@neutrinojs/banner@^9.4.0": +"@neutrinojs/banner@9.5.0", "@neutrinojs/banner@^9.4.0", "@neutrinojs/banner@^9.5.0": version "9.5.0" resolved "http://npm.cha0sdev/@neutrinojs%2fbanner/-/banner-9.5.0.tgz#ee8df39db5d76033211a1811428e444a06d7222f" integrity sha512-SL4nT0V1Wykf+LcRlCp/L8Frt4dk7MZITToC+OeDz2w6V7gg8YfEwDfdEg+aampjyUoxaq+A02ZyZP1TyRDtLA== @@ -1435,19 +1435,6 @@ atob@^2.1.2: resolved "http://npm.cha0sdev/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.8.6: - version "9.8.6" - resolved "http://npm.cha0sdev/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - axe-core@^4.0.2: version "4.1.1" resolved "http://npm.cha0sdev/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" @@ -1657,7 +1644,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.1: +browserslist@^4.14.5, browserslist@^4.16.1: version "4.16.3" resolved "http://npm.cha0sdev/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== @@ -1751,7 +1738,7 @@ camelcase@^6.0.0: resolved "http://npm.cha0sdev/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: +caniuse-lite@^1.0.30001181: version "1.0.30001187" resolved "http://npm.cha0sdev/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438" integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== @@ -2161,6 +2148,11 @@ deepmerge@^2.2.1: resolved "http://npm.cha0sdev/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== +deepmerge@^4.2.2: + version "4.2.2" + resolved "http://npm.cha0sdev/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + define-properties@^1.1.3: version "1.1.3" resolved "http://npm.cha0sdev/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -4056,16 +4048,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "http://npm.cha0sdev/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "http://npm.cha0sdev/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -num2fraction@^1.2.2: - version "1.2.2" - resolved "http://npm.cha0sdev/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "http://npm.cha0sdev/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -4433,20 +4415,6 @@ posix-character-classes@^0.1.0: resolved "http://npm.cha0sdev/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "http://npm.cha0sdev/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss@^7.0.32: - version "7.0.35" - resolved "http://npm.cha0sdev/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "http://npm.cha0sdev/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5586,11 +5554,6 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-virtual-modules@^0.4.1: - version "0.4.2" - resolved "http://npm.cha0sdev/webpack-virtual-modules/-/webpack-virtual-modules-0.4.2.tgz#68ce4479df7334a491b7a3f3bead47fe382947d9" - integrity sha512-OUsT1VZhArN8nY7g6mMlw91HWnXcNXsIQjsQ83WteF4ViZ6YXqF2sWKOTDIZ0H+PPiApQdszLdZIrD7NNlU0Yw== - webpack@^4: version "4.46.0" resolved "http://npm.cha0sdev/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" diff --git a/packages/http/src/server.js b/packages/http/src/server.js index 3a682ef..0f0d683 100644 --- a/packages/http/src/server.js +++ b/packages/http/src/server.js @@ -12,7 +12,7 @@ const onlyBuilds = LATUS_ONLY_BUILD.split(',').map((name) => name.trim()); export default { hooks: { - '@latus/core/build': (configs, latus) => { + '@latus/core/build': (latus) => { const { config: { '@latus/http/server': { @@ -26,12 +26,13 @@ export default { !process.argv.find((arg) => '--watch' === arg) || process.argv.find((arg) => 'production' === arg) ) { - // eslint-disable-next-line no-param-reassign - configs.http = R(join(__dirname, 'build/.neutrinorc.js')); + return { + http: R(join(__dirname, 'build/.neutrinorc.js')), + }; } - else if (0 === onlyBuilds.length || -1 !== onlyBuilds.indexOf('http')) { + if (0 === onlyBuilds.length || -1 !== onlyBuilds.indexOf('http')) { const binary = `$(npm --prefix ${root} bin)/webpack-dev-server`; - const config = `${__dirname}/build/webpack.config.js`; + const config = join(__dirname, 'build', 'webpack.config.js'); const options = { env: { ...process.env, @@ -44,6 +45,7 @@ export default { }; spawn(`${binary} --hot --inline --mode development --config ${config}`, options); } + return undefined; }, '@latus/core/config': () => ({ build: join('build', 'http'),