@rws-framework/client
Version:
This package provides the core client-side framework for Realtime Web Suit (RWS), enabling modular, asynchronous web components, state management, and integration with backend services. It is located in `.dev/client`.
164 lines (129 loc) • 5.27 kB
JavaScript
const { rwsPath } = require('@rws-framework/console');
const path = require('path');
const chalk = require('chalk');
const RWSWebpackPlugin = require('./rws_webpack_plugin');
const buildInfo = require('../../cfg/build_steps/webpack/_info');
const { loadAliases } = require('../../cfg/build_steps/webpack/_aliases');
const { timingStart, timingStop, timeLog, toggleLogging } = require('../../cfg/build_steps/webpack/_timing');
const { getRWSProductionSetup } = require('../../cfg/build_steps/webpack/_production');
const { rwsExternals } = require('../../cfg/build_steps/webpack/_rws_externals');
const tools = require('../../_tools');
const { setComponentsChunks, scanComponents, generateRWSInfoFile, partedComponentsEvents } = require('../../cfg/build_steps/webpack/_component_handling');
const { getBuildConfig } = require('../../cfg/build_steps/webpack/_build_config');
const { createWebpackConfig } = require('../../cfg/build_steps/webpack/_webpack_config');
const { executeRWSStartActions, timingActions, devActions } = require('../../cfg/build_steps/webpack/_actions');
const { RWS_WEBPACK_PLUGINS_BAG, addStartPlugins } = require('../../cfg/build_steps/webpack/_plugins');
// #SECTION INIT OPTIONS
const RWSWebpackWrapper = async (appRoot, rwsFrontendConfig, _packageDir) => {
const _MAIN_PACKAGE = rwsPath.findRootWorkspacePath(appRoot);
const {
executionDir,
isWatcher,
isDev,
isReport,
isParted,
partedPrefix,
partedDirUrlPrefix,
partedComponentsLocations,
customServiceLocations,
outputDir,
outputFileName,
publicDir,
cssDir,
serviceWorkerPath,
publicIndex,
devTools,
devDebug,
devRouteProxy,
tsConfig,
rwsPlugins,
BuildConfigurator,
hotReload,
hotReloadPort,
loaderIgnoreExceptions,
extraNodeModules
} = await getBuildConfig(rwsFrontendConfig, _packageDir);
timeLog({ devDebug });
if (devDebug?.timing) {
timingStart('build config');
}
rwsPath.removeDirectory(outputDir, true);
buildInfo.start(executionDir, tsConfig, outputDir, isDev, publicDir, isParted, partedPrefix, partedDirUrlPrefix, devTools, rwsFrontendConfig.rwsPlugins);
// #SECTION INIT PLUGINS && ENV VARS DEFINES
addStartPlugins(rwsFrontendConfig, BuildConfigurator, devDebug, hotReload, isReport);
const WEBPACK_AFTER_ACTIONS = rwsFrontendConfig.actions || [];
const WEBPACK_AFTER_ERROR_ACTIONS = rwsFrontendConfig.error_actions || [];
const modules_setup = [path.join(_packageDir, 'node_modules'), path.join(executionDir, 'node_modules'), path.join(tools.findRootWorkspacePath(appRoot), 'node_modules'), ...(extraNodeModules || [])];
let optimConfig = null;
let aliases = rwsFrontendConfig.aliases || {};
aliases = { ...aliases, ...(await loadAliases(_packageDir, tsConfig,path.resolve(_MAIN_PACKAGE, 'node_modules'), executionDir))}
// #SECTION PLUGIN STARTING HOOKS
executeRWSStartActions(WEBPACK_AFTER_ACTIONS, serviceWorkerPath, BuildConfigurator, rwsFrontendConfig);
if (devDebug?.timing) {
timingStop('build config');
}
// #SECTION RWS COMPONENT SCAN && PARTED PROCESSING
const RWSComponents = scanComponents(await partedComponentsEvents(partedComponentsLocations, rwsPlugins, isParted), executionDir, _packageDir);
console.log(`${chalk.cyanBright('RWS Scanned')} ${chalk.yellowBright(RWSComponents.length)} components`);
const { automatedChunks, automatedEntries } = setComponentsChunks(rwsFrontendConfig.entrypoint, RWSComponents, isParted);
// #SECTION RWS INFO FILE
generateRWSInfoFile(outputDir, automatedEntries);
console.log(chalk.greenBright(`RWSInfo file generated.`));
if (!isDev) {
// #SECTION RWS PROD SETUP
if (!optimConfig) {
optimConfig = {};
}
optimConfig = getRWSProductionSetup(optimConfig, tsConfig.path);
}
// #SECTION RWS DEV ACTIONS
const devExternalsVars = devActions(WEBPACK_AFTER_ACTIONS, executionDir, devDebug);
timingActions(WEBPACK_AFTER_ACTIONS, WEBPACK_AFTER_ERROR_ACTIONS, devDebug);
// #SECTION RWS WEBPACK PLUGIN INIT
if (WEBPACK_AFTER_ACTIONS.length || WEBPACK_AFTER_ERROR_ACTIONS.length) {
RWS_WEBPACK_PLUGINS_BAG.add(new RWSWebpackPlugin({
actions: WEBPACK_AFTER_ACTIONS,
error_actions: WEBPACK_AFTER_ERROR_ACTIONS,
dev: isDev,
devDebug,
appRoot
}));
}
// #SECTION RWS WEBPACK BUILD
const cfgExport = await createWebpackConfig({
executionDir,
_packageDir,
isDev,
devTools,
devDebug,
isParted,
partedPrefix,
outputDir,
outputFileName,
automatedChunks,
modules_setup,
aliases,
tsConfig,
WEBPACK_PLUGINS: RWS_WEBPACK_PLUGINS_BAG.getPlugins(),
rwsExternals,
devExternalsVars,
appRootDir: appRoot,
entrypoint: rwsFrontendConfig.entrypoint,
hotReload,
hotReloadPort,
publicDir,
cssDir,
loaderIgnoreExceptions
});
if (optimConfig) {
// setup production config if it got created above
cfgExport.optimization = optimConfig;
}
// #SECTION RWS PLUGINS onBuild EVENTS FIRE
for (const pluginKey of Object.keys(rwsPlugins)) {
const plugin = rwsPlugins[pluginKey];
await plugin.onBuild(cfgExport);
}
return cfgExport;
}
module.exports = RWSWebpackWrapper;