UNPKG

@amazingbv/webpack-theme-json-generator

Version:

An npm package for Webpack for generating your WordPress theme.json file from multiple JSON files.

83 lines (61 loc) 3.03 kB
const fs = require("fs"); const _ = require("lodash"); const path = require("path"); class ThemeJsonGeneratorPlugin { static defaultOptions = { sourceFile: 'theme.json', sourceDirectory: '', filePrefix: 'theme.', destinationFile: '' } constructor(options = {}) { this.options = {...ThemeJsonGeneratorPlugin.defaultOptions, ...options}; } apply(compiler) { const pluginName = 'Theme.json generator'; const {webpack} = compiler; const {Compilation} = webpack; const {RawSource} = webpack.sources; compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { compilation.hooks.processAssets.tap( { name: pluginName, stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, (assets) => { const fs = require('fs'); const path = require('path'); const _ = require('lodash'); const themeJsonString = fs.readFileSync(`${this.options.sourceDirectory}./${this.options.sourceFile}`, { encoding: 'utf-8'}); const themeJson = JSON.parse(themeJsonString); const otherFiles = fs.readdirSync(this.options.sourceDirectory); compilation.fileDependencies.add(path.resolve(`${this.options.sourceDirectory}/${this.options.sourceFile}`)); const fileStrings = []; for(const file of otherFiles) { if(!file.endsWith('.json') || !file.startsWith(this.options.filePrefix) || file === this.options.sourceFile) { continue; } compilation.fileDependencies.add(path.resolve(`${this.options.sourceDirectory}/${file}`)); const fileString = fs.readFileSync(`${this.options.sourceDirectory}/${file}`, { encoding: 'utf-8'}); const jsonPath = file.replace('.json', '') .replace(this.options.filePrefix, '') .replaceAll('-', '/'); fileStrings.push({ path: jsonPath, dots: file.match(/\.+/g).length, data: JSON.parse(fileString) }); } fileStrings.sort((a, b) => a.dots - b.dots); for(const fileString of fileStrings) { _.set(themeJson, fileString.path, fileString.data); } const fileData = JSON.stringify(themeJson, null, 4); fs.writeFileSync(this.options.destinationFile, fileData); compilation.emitAsset(this.options.destinationFile, new RawSource(fileData)); } ) }); } } module.exports.default = ThemeJsonGeneratorPlugin;