Skip to content

Refactor shared webpack bootstrap into @wpsyntex/polylang-build-scripts #39

Description

@Hug0-Drelon

What

Every Polylang project repeats the same block at the top of configureWebpack():

const mode = options.mode;
const isProduction = mode === 'production' || false;
const workingDirectory = path.resolve( __dirname );
const jsBuildDirectory = path.join( workingDirectory, 'js/build' );
const cssBuildDirectory = path.join( workingDirectory, 'css/build' );

console.log( 'Webpack mode:', mode );
console.log( 'Working directory:', workingDirectory );

Same code in polylang, polylang-pro, polylang-wc, updater and polylang-for-elementor.

Why

  • Duplicated in every repo; any change needs 4+ PRs
  • Consumer configs should only define project-specific patterns/entry points
  • A shared helper works for both CJS (__dirname) and ESM (import.meta.url)

How

Add a getBuildContext() export:

const { getBuildContext, getVanillaConfig } = require( '@wpsyntex/polylang-build-scripts' );

function configureWebpack( options ) {
	const {
		isProduction,
		workingDirectory,
		jsBuildDirectory,
		cssBuildDirectory,
	} = getBuildContext( options, __dirname, {}, true );

	return getVanillaConfig( {
		workingDirectory,
		jsBuildDirectory,
		cssBuildDirectory,
		isProduction,
		// project-specific options…
	} );
}

Helper sketch:

function getBuildContext(
	options,
	workingDirectory,
	{ jsBuildSubdir = 'js/build', cssBuildSubdir = 'css/build' } = {},
	log = false
) {
	const mode = options?.mode ?? 'development';
	const isProduction = mode === 'production';
	const resolvedWorkingDirectory = path.resolve( workingDirectory );

	if ( log ) {
		console.log( 'Webpack mode:', mode );
		console.log( 'Working directory:', resolvedWorkingDirectory );
	}

	return {
		mode,
		isProduction,
		workingDirectory: resolvedWorkingDirectory,
		jsBuildDirectory: path.join( resolvedWorkingDirectory, jsBuildSubdir ),
		cssBuildDirectory: path.join( resolvedWorkingDirectory, cssBuildSubdir ),
	};
}

Done when: helper exported + documented, unit tests added, all consumer webpack.config.js files

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions