feat: dynamic webpack :o
This commit is contained in:
parent
6d5cb6cf74
commit
02fcc9968c
95
defgen.js
95
defgen.js
|
@ -1,95 +0,0 @@
|
||||||
const glob = require('glob');
|
|
||||||
const {getOptions} = require('loader-utils');
|
|
||||||
const path = require('path');
|
|
||||||
const validateOptions = require('schema-utils');
|
|
||||||
|
|
||||||
const schema = {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
paths: {
|
|
||||||
items: {
|
|
||||||
type: 'string',
|
|
||||||
},
|
|
||||||
type: 'array',
|
|
||||||
},
|
|
||||||
registrar: {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
function: {
|
|
||||||
type: 'string',
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
type: 'string',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
required: [
|
|
||||||
'function',
|
|
||||||
'module',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
type: {
|
|
||||||
type: 'string',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
required: [
|
|
||||||
'registrar',
|
|
||||||
'type',
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
// Dynamically require all traits.
|
|
||||||
module.exports = function(source) {
|
|
||||||
const options = getOptions(this);
|
|
||||||
// Validate schema.
|
|
||||||
validateOptions(schema, options, 'Avocado defgen');
|
|
||||||
// Extract options.
|
|
||||||
const {classTransformer: transformer, paths, registrar, type} = options;
|
|
||||||
// Search avocado.
|
|
||||||
paths.push(path.resolve(
|
|
||||||
__dirname, 'node_modules', '@avocado',
|
|
||||||
));
|
|
||||||
// Get all trait source paths.
|
|
||||||
const sourcePaths = [];
|
|
||||||
paths.forEach((path) => {
|
|
||||||
const files = glob.sync(`${path}/**/*.${type}.js`, {
|
|
||||||
follow: true,
|
|
||||||
});
|
|
||||||
sourcePaths.push(...files);
|
|
||||||
});
|
|
||||||
// Build import definitions.
|
|
||||||
const importDefinitions = sourcePaths.map((sourcePath) => {
|
|
||||||
const relativePath = path.relative(__dirname, sourcePath);
|
|
||||||
const basename = path.basename(relativePath, `.${type}.js`);
|
|
||||||
const parts = relativePath.split('/');
|
|
||||||
// Chop off basename.
|
|
||||||
parts.pop();
|
|
||||||
// Module or local?
|
|
||||||
let importDirectory;
|
|
||||||
if ('node_modules' === parts[0]) {
|
|
||||||
importDirectory = `${parts.slice(1).join('/')}`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
importDirectory = `./${parts.join('/')}`
|
|
||||||
}
|
|
||||||
const importPath = `${importDirectory}/${basename}.${type}`;
|
|
||||||
// Extract class name.
|
|
||||||
const baseparts = basename.split('-');
|
|
||||||
const className = baseparts.reduce((className, part) => {
|
|
||||||
const firstLetter = part.charAt(0).toUpperCase();
|
|
||||||
const rest = part.substr(1).toLowerCase();
|
|
||||||
return className + firstLetter + rest;
|
|
||||||
}, '');
|
|
||||||
const transformed = transformer ? transformer(className) : className;
|
|
||||||
// Import and register.
|
|
||||||
return [
|
|
||||||
`${registrar.function}(require('${importPath}').${transformed});`,
|
|
||||||
].join('\n');
|
|
||||||
});
|
|
||||||
// Import trait registry first.
|
|
||||||
const output = [
|
|
||||||
`import {${registrar.function}} from '${registrar.module}'`,
|
|
||||||
'',
|
|
||||||
...importDefinitions
|
|
||||||
].join('\n');
|
|
||||||
return output;
|
|
||||||
}
|
|
|
@ -2,8 +2,6 @@
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
// 2nd party.
|
// 2nd party.
|
||||||
import {SocketServer} from '@avocado/net/server/socket';
|
import {SocketServer} from '@avocado/net/server/socket';
|
||||||
// Import directly for HMR hierarchy.
|
|
||||||
import 'register-traits';
|
|
||||||
// Create fixtures.
|
// Create fixtures.
|
||||||
import './create-fixtures';
|
import './create-fixtures';
|
||||||
// Start game server.
|
// Start game server.
|
||||||
|
@ -46,7 +44,6 @@ createGame();
|
||||||
if (module.hot) {
|
if (module.hot) {
|
||||||
module.hot.accept([
|
module.hot.accept([
|
||||||
'./game',
|
'./game',
|
||||||
'register-traits'
|
|
||||||
], () => {
|
], () => {
|
||||||
destroyGame(() => {
|
destroyGame(() => {
|
||||||
createGame();
|
createGame();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
|
const {AvocadoPlugin} = require('@avocado/core/webpack/plugin');
|
||||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
|
|
||||||
|
@ -8,11 +9,7 @@ const isProduction = !!process.argv.find((arg) => '--production' === arg);
|
||||||
|
|
||||||
config.entry = {
|
config.entry = {
|
||||||
client: [
|
client: [
|
||||||
'@babel/polyfill',
|
'@avocado/core/webpack/entry',
|
||||||
'register-packets',
|
|
||||||
'register-synchronizeds',
|
|
||||||
'register-traits',
|
|
||||||
'@avocado/behavior/item/initialize',
|
|
||||||
path.join(__dirname, 'client', 'index.scss'),
|
path.join(__dirname, 'client', 'index.scss'),
|
||||||
path.join(__dirname, 'client', 'index.js'),
|
path.join(__dirname, 'client', 'index.js'),
|
||||||
],
|
],
|
||||||
|
@ -42,15 +39,6 @@ else {
|
||||||
config.module.rules[0].use.options.configFile = path.resolve(
|
config.module.rules[0].use.options.configFile = path.resolve(
|
||||||
__dirname, 'babel.client.config.js'
|
__dirname, 'babel.client.config.js'
|
||||||
);
|
);
|
||||||
config.module.rules[1].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'client'),
|
|
||||||
);
|
|
||||||
config.module.rules[2].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'client'),
|
|
||||||
);
|
|
||||||
config.module.rules[3].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'client'),
|
|
||||||
);
|
|
||||||
config.node = {
|
config.node = {
|
||||||
fs: 'empty',
|
fs: 'empty',
|
||||||
path: 'empty',
|
path: 'empty',
|
||||||
|
@ -65,5 +53,6 @@ config.plugins.push(new webpack.DefinePlugin({
|
||||||
AVOCADO_CLIENT: true,
|
AVOCADO_CLIENT: true,
|
||||||
AVOCADO_SERVER: false,
|
AVOCADO_SERVER: false,
|
||||||
}));
|
}));
|
||||||
|
config.plugins.push(new AvocadoPlugin(__dirname, 'client'));
|
||||||
|
|
||||||
module.exports = config;
|
module.exports = config;
|
||||||
|
|
|
@ -20,57 +20,6 @@ const config = {
|
||||||
options: {},
|
options: {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
test: /register-packets\.js$/,
|
|
||||||
use: {
|
|
||||||
loader: './defgen',
|
|
||||||
options: {
|
|
||||||
classTransformer: (Packet) => {
|
|
||||||
return `${Packet}Packet`;
|
|
||||||
},
|
|
||||||
paths: [
|
|
||||||
path.resolve(__dirname, 'common'),
|
|
||||||
],
|
|
||||||
registrar: {
|
|
||||||
function: 'registerPacket',
|
|
||||||
module: '@avocado/net',
|
|
||||||
},
|
|
||||||
type: 'packet',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /register-synchronizeds\.js$/,
|
|
||||||
use: {
|
|
||||||
loader: './defgen',
|
|
||||||
options: {
|
|
||||||
paths: [
|
|
||||||
path.resolve(__dirname, 'common'),
|
|
||||||
],
|
|
||||||
registrar: {
|
|
||||||
function: 'registerSynchronized',
|
|
||||||
module: '@avocado/net',
|
|
||||||
},
|
|
||||||
type: 'synchronized',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /register-traits\.js$/,
|
|
||||||
use: {
|
|
||||||
loader: './defgen',
|
|
||||||
options: {
|
|
||||||
paths: [
|
|
||||||
path.resolve(__dirname, 'common'),
|
|
||||||
],
|
|
||||||
registrar: {
|
|
||||||
function: 'registerTrait',
|
|
||||||
module: '@avocado/entity',
|
|
||||||
},
|
|
||||||
type: 'trait',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// Styles.
|
// Styles.
|
||||||
{
|
{
|
||||||
test: /\.(?:sa|sc|c)ss$/,
|
test: /\.(?:sa|sc|c)ss$/,
|
||||||
|
@ -132,11 +81,7 @@ const config = {
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {},
|
||||||
'register-packets': path.join(__dirname, 'register-packets'),
|
|
||||||
'register-synchronizeds': path.join(__dirname, 'register-synchronizeds'),
|
|
||||||
'register-traits': path.join(__dirname, 'register-traits'),
|
|
||||||
},
|
|
||||||
modules: [
|
modules: [
|
||||||
path.join(__dirname, 'node_modules'),
|
path.join(__dirname, 'node_modules'),
|
||||||
path.join(__dirname, 'scss'),
|
path.join(__dirname, 'scss'),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
|
const {AvocadoPlugin} = require('@avocado/core/webpack/plugin');
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
const nodeExternals = require('webpack-node-externals');
|
const nodeExternals = require('webpack-node-externals');
|
||||||
const StartServerPlugin = require('start-server-webpack-plugin');
|
const StartServerPlugin = require('start-server-webpack-plugin');
|
||||||
|
@ -13,10 +14,7 @@ if (!isProduction) {
|
||||||
config.entry = {
|
config.entry = {
|
||||||
server: [
|
server: [
|
||||||
'source-map-support/register',
|
'source-map-support/register',
|
||||||
'@babel/polyfill',
|
'@avocado/core/webpack/entry',
|
||||||
path.join(__dirname, 'register-packets.js'),
|
|
||||||
path.join(__dirname, 'register-synchronizeds.js'),
|
|
||||||
'@avocado/behavior/item/initialize',
|
|
||||||
path.join(__dirname, 'server', 'index.js'),
|
path.join(__dirname, 'server', 'index.js'),
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
@ -48,16 +46,6 @@ pixiPackages.forEach((pixiPackage) => {
|
||||||
config.module.rules[0].use.options.configFile = path.resolve(
|
config.module.rules[0].use.options.configFile = path.resolve(
|
||||||
__dirname, 'babel.server.config.js'
|
__dirname, 'babel.server.config.js'
|
||||||
);
|
);
|
||||||
// Include server files when scanning.
|
|
||||||
config.module.rules[1].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'server'),
|
|
||||||
);
|
|
||||||
config.module.rules[2].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'server'),
|
|
||||||
);
|
|
||||||
config.module.rules[3].use.options.paths.push(
|
|
||||||
path.resolve(__dirname, 'server'),
|
|
||||||
);
|
|
||||||
const nodeArgs = ['--preserve-symlinks'];
|
const nodeArgs = ['--preserve-symlinks'];
|
||||||
if (process.argv.find((arg) => '--inspect' === arg)) {
|
if (process.argv.find((arg) => '--inspect' === arg)) {
|
||||||
nodeArgs.push('--inspect');
|
nodeArgs.push('--inspect');
|
||||||
|
@ -76,6 +64,7 @@ config.plugins.push(new webpack.DefinePlugin({
|
||||||
AVOCADO_CLIENT: false,
|
AVOCADO_CLIENT: false,
|
||||||
AVOCADO_SERVER: true,
|
AVOCADO_SERVER: true,
|
||||||
}));
|
}));
|
||||||
|
config.plugins.push(new AvocadoPlugin(__dirname, 'server'));
|
||||||
config.target = 'node';
|
config.target = 'node';
|
||||||
|
|
||||||
module.exports = config;
|
module.exports = config;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user