diff --git a/config/clientlibs.config.js b/config/clientlibs.config.js index 1604287..12a5c1a 100644 --- a/config/clientlibs.config.js +++ b/config/clientlibs.config.js @@ -14,7 +14,7 @@ const skipCategories = ['myproject.author']; // linter disabled since we are requirement to send $\{ to a template string // Object to be able to generate clientlibs for new CSS files (created in build process) in target folder -const extraEntries = {}; +const extraEntries = []; module.exports = { override, diff --git a/package-lock.json b/package-lock.json index f578c60..dbc0ab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@netcentric/fe-build", - "version": "5.2.0", + "version": "5.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@netcentric/fe-build", - "version": "5.2.0", + "version": "5.3.1", "license": "Apache-2.0", "dependencies": { "@babel/core": "^7.26.7", diff --git a/tasks/clientlibs.js b/tasks/clientlibs.js index 6d642cb..d40bff7 100644 --- a/tasks/clientlibs.js +++ b/tasks/clientlibs.js @@ -2,26 +2,19 @@ const { log } = require('../utils/log'); const generateEntries = require('../utils/generateEntries'); const getClientlib = require('../utils/getClientlib'); const renderClientLibs = require('../utils/renderClientLibs'); +const generateExtraEntries = require('../utils/generateExtraEntries'); // extend log to proper say what file is running module.exports = (config) => { log(__filename, 'clientlibs task running...', '', 'info'); - const { extraEntries } = config.postcss; - // checking all entries at this configuration - let entries = { + const entries = { ...generateEntries(config), ...generateEntries(config, 'scss'), + ...generateExtraEntries(config), }; - entries = { - ...entries, - ...extraEntries ? { - ...generateEntries(config, extraEntries.extension, extraEntries.filenamePattern, extraEntries.cwd), - } : null, - } - // clientlibs to render const clientLibs = {}; diff --git a/tasks/clientlibs.test.js b/tasks/clientlibs.test.js index deba29e..5e644ad 100644 --- a/tasks/clientlibs.test.js +++ b/tasks/clientlibs.test.js @@ -41,9 +41,3 @@ describe('Test task/clientlibs.js', () => { }); }) }); - - - - - - diff --git a/tasks/styles.js b/tasks/styles.js index 7821dda..87e160f 100644 --- a/tasks/styles.js +++ b/tasks/styles.js @@ -8,7 +8,7 @@ module.exports = (config) => { return new Promise((resolve) => { if (config && config.general && config.general.watch) { try { - log(__filename, 'Watcher Sass / autoprefixer running...', '', 'info'); + log(__filename, 'Watcher Sass running...', '', 'info'); const gaze = require('gaze'); const sassPattern = path.join(config.general.sourcesPath, `**/*.${config.general.sourceKey}.scss`); @@ -32,7 +32,7 @@ module.exports = (config) => { log(__filename, 'Something is missing, you need install dev dependencies for this.', e.message, 'error'); } } else { - log(__filename, 'Sass / autoprefixer running...', '', 'info'); + log(__filename, 'Sass running...', '', 'info'); // checking all entries at this configuration const entries = generateEntries(config, 'scss'); diff --git a/utils/generateExtraEntries.js b/utils/generateExtraEntries.js new file mode 100644 index 0000000..44342f5 --- /dev/null +++ b/utils/generateExtraEntries.js @@ -0,0 +1,22 @@ +const generateEntries = require('./generateEntries'); + +module.exports = function generateExtraEntries(config) { + + const { extraEntries } = config.clientlibs; + + if (!extraEntries || !extraEntries.length) { + return []; + } + + let entries = {} + + extraEntries.forEach((entry) => { + entries = { + ...entries, + ...generateEntries(config, entry.extension, entry.filenamePattern, entry.cwd), + } + }); + + return entries; + +}; \ No newline at end of file diff --git a/utils/generateExtraEntries.test.js b/utils/generateExtraEntries.test.js new file mode 100644 index 0000000..381ba39 --- /dev/null +++ b/utils/generateExtraEntries.test.js @@ -0,0 +1,89 @@ +process.argv.push('--quiet'); +const fs = require('fs'); +const path = require('path'); +const defaults = require('../config'); +const extendConfig = require('./extendConfig'); +const config = extendConfig('./test/.febuild', defaults); + +const clientlibsTask = require('../tasks/clientlibs'); + +describe('Tarea clientlibs - extraEntries', () => { + const suffixKey = 'testLib'; // Valor de sufijo usado para simular archivos + let tempDir = config.general.destinationPath; + const cssPaths = [ + path.join(tempDir, 'extra/foo'), + path.join(tempDir, 'extra/bar'), + ]; + + const jsPaths = [ + path.join(tempDir, 'extra/runtime'), + path.join(tempDir, 'extra/vendors'), + path.join(tempDir, 'extra/treeshaking'), + ]; + + beforeAll(() => { + [ + ...cssPaths, + ...jsPaths, + ].forEach((dir) => { + // Crear directorios necesarios + fs.mkdirSync(dir, { recursive: true }); + }); + + fs.writeFileSync(path.join(`${cssPaths[0]}/css.${suffixKey}-foo.css`), 'body{ background: red; }'); + fs.writeFileSync(path.join(`${cssPaths[1]}/css.${suffixKey}-bar.css`), 'body{ background: blue; }'); + + fs.writeFileSync(path.join(`${jsPaths[0]}/chunks.runtime.${suffixKey}.js`), 'console.log("runtime chunk");'); + fs.writeFileSync(path.join(`${jsPaths[1]}/chunks.vendors.${suffixKey}.js`), 'console.log("vendors chunk");'); + fs.writeFileSync(path.join(`${jsPaths[2]}/chunks.treeshaking.${suffixKey}.js`), 'console.log("treeshaking chunk");'); + }); + + afterAll(() => { + // Limpia el directorio temporal creado (borra archivos y directorio) + fs.rmSync(tempDir, { recursive: true, force: true }); + }); + + it('debe generar los archivos .txt y .content.xml correctamente para extraEntries', async () => { + // Configuración simulada con extraEntries para CSS y JS + const extendedConfig = { + ...config, + clientlibs: { + ...config.clientlibs, + extraEntries: [ + { + extension: 'css', + cwd: tempDir, + filenamePattern: `${suffixKey}-*` + }, + { + extension: 'js', + cwd: tempDir, + filenamePattern: `@(runtime|vendors|treeshaking).${suffixKey}` + } + ] + } + }; + + // Ejecutar la tarea clientlibs con la configuración simulada. + // Si la tarea exporta una función (sin contexto adicional), invocarla directamente: + await clientlibsTask(extendedConfig); + + cssPaths.forEach((dir) => { + // Verificar que se hayan creado los archivos CSS esperados en destinationPath (tempDir). + const cssTxtPath = path.join(dir, 'css.txt'); + const contentXmlPath = path.join(dir, '.content.xml'); + + expect(fs.existsSync(cssTxtPath)).toBe(true); + expect(fs.existsSync(contentXmlPath)).toBe(true); + }); + + jsPaths.forEach((dir) => { + // Verificar que se hayan creado los archivos CSS esperados en destinationPath (tempDir). + const jsTxtPath = path.join(dir, 'js.txt'); + const contentXmlPath = path.join(dir, '.content.xml'); + + expect(fs.existsSync(jsTxtPath)).toBe(true); + expect(fs.existsSync(contentXmlPath)).toBe(true); + }); + }); +}); diff --git a/utils/renderClientLibs.js b/utils/renderClientLibs.js index d28a6ca..9753fcc 100644 --- a/utils/renderClientLibs.js +++ b/utils/renderClientLibs.js @@ -34,12 +34,13 @@ module.exports = function renderClientLibs(clientLibObject, config) { writeFile(path.join(absolutePath, 'js.txt'), `${js}`, override); } - const extensionFile = config.postcss.extraEntries?.extension; - const hasExtraEntries = extensionFile && clientLibObject[extensionFile]; - const fileName = clientLibObject[extensionFile]; - if ( hasExtraEntries ) { - writeFile(path.join(absolutePath, `${extensionFile}.txt`), `${fileName}`, override); - } + config.clientlibs.extraEntries?.forEach(({ extension }) => { + const fileName = clientLibObject[extension]; + + if (fileName) { + writeFile(path.join(absolutePath, `${extension}.txt`),`${fileName}`, override); + } + }); // write .content.xml const content = clientlibTemplate(name, projectKey);