From b6f9e2705ccc2d5d91b11288a16e08d66365cb2f Mon Sep 17 00:00:00 2001 From: hugoer Date: Wed, 11 Mar 2026 12:17:12 +0100 Subject: [PATCH 1/2] fix(tasks): adjust styles watcher implementation & update chokidar to version 4.0.3 --- package-lock.json | 54 +++++++++++------------------------------------ package.json | 2 +- tasks/styles.js | 12 ++++++++--- 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b1693e..6df5ecd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@netcentric/fe-build", - "version": "5.3.1", + "version": "5.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@netcentric/fe-build", - "version": "5.3.1", + "version": "5.3.2", "license": "Apache-2.0", "dependencies": { "@babel/core": "^7.26.7", @@ -14,7 +14,7 @@ "@babel/preset-env": "^7.26.7", "autoprefixer": "^10.4.20", "babel-loader": "9.1.2", - "chokidar": "^5.0.0", + "chokidar": "^4.0.3", "core-js": "^3.40.0", "eslint": "^8.57.1", "eslint-webpack-plugin": "^4.2.0", @@ -3329,15 +3329,14 @@ } }, "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { - "readdirp": "^5.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 20.19.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5973,12 +5972,11 @@ "license": "MIT" }, "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "license": "MIT", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "engines": { - "node": ">= 20.19.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6208,34 +6206,6 @@ "@parcel/watcher": "^2.4.1" } }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", diff --git a/package.json b/package.json index 428ad56..0ae7fbf 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@babel/preset-env": "^7.26.7", "autoprefixer": "^10.4.20", "babel-loader": "9.1.2", - "chokidar": "^5.0.0", + "chokidar": "^4.0.3", "core-js": "^3.40.0", "eslint": "^8.57.1", "eslint-webpack-plugin": "^4.2.0", diff --git a/tasks/styles.js b/tasks/styles.js index 1d298ba..db9b0db 100644 --- a/tasks/styles.js +++ b/tasks/styles.js @@ -1,19 +1,25 @@ const path = require('path'); +const glob = require('fast-glob'); const { log } = require('../utils/log'); const generateEntries = require('../utils/generateEntries'); const renderStyles = require('../utils/renderStyles'); // extend log to proper say what file is running module.exports = (config) => { - return new Promise((resolve) => { + return new Promise(async (resolve) => { if (config && config.general && config.general.watch) { try { log(__filename, 'Watcher Sass / autoprefixer running...', '', 'info'); const chokidar = require('chokidar') - const sassPattern = path.join(config.general.sourcesPath, `**/*.${config.general.sourceKey}.scss`); + const pattern = `**/*.${config.general.sourceKey}.scss` - const watcher = chokidar.watch(sassPattern, { + const files = await glob(pattern, { + cwd: config.general.sourcesPath, + absolute: true + }) + + const watcher = chokidar.watch(files, { ignoreInitial: true }) From 2feb61f841f72b323c45566c8df6ae6122a20095 Mon Sep 17 00:00:00 2001 From: hugoer Date: Wed, 15 Apr 2026 11:53:53 +0200 Subject: [PATCH 2/2] fix(utils): refactor watcher implementation and update chokidar usage --- tasks/styles.js | 94 ++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/tasks/styles.js b/tasks/styles.js index db9b0db..7ddceff 100644 --- a/tasks/styles.js +++ b/tasks/styles.js @@ -5,54 +5,52 @@ const generateEntries = require('../utils/generateEntries'); const renderStyles = require('../utils/renderStyles'); // extend log to proper say what file is running -module.exports = (config) => { - return new Promise(async (resolve) => { - if (config && config.general && config.general.watch) { - try { - log(__filename, 'Watcher Sass / autoprefixer running...', '', 'info'); - - const chokidar = require('chokidar') - const pattern = `**/*.${config.general.sourceKey}.scss` - - const files = await glob(pattern, { - cwd: config.general.sourcesPath, - absolute: true - }) - - const watcher = chokidar.watch(files, { - ignoreInitial: true - }) - - watcher.on('all', (event, file) => { - const relativePath = path.relative( - config.general.sourcesPath, - path.dirname(file) - ) - - const fileName = path - .basename(file) - .replace(config.general.sourceKey, config.general.bundleKey) - - const destFile = path.join(relativePath, fileName) - - config.stylelint.failOnError = false - - renderStyles(file, destFile, config) - }); - - } catch (e) { - log(__filename, 'Something is missing, you need install dev dependencies for this.', e.message, 'error'); - } - } else { - log(__filename, 'Sass / autoprefixer running...', '', 'info'); - - // checking all entries at this configuration - const entries = generateEntries(config, 'scss'); - const promises = Object.keys(entries).map(file => renderStyles(entries[file], file, config)); - Promise.allSettled(promises).then((results) => { - log(__filename, 'Styles done', '', 'info'); - resolve(); +module.exports = async (config) => { + if (config && config.general && config.general.watch) { + try { + log(__filename, 'Watcher Sass / autoprefixer running...', '', 'info'); + + const chokidar = require('chokidar'); + const pattern = `**/*.${config.general.sourceKey}.scss`; + + // Note: fast-glob resolves files once at startup, so newly created SCSS files + // won't be picked up by the watcher without a restart. This is an accepted + // tradeoff to avoid EMFILE errors with recursive directory watching. + const files = await glob(pattern, { + cwd: config.general.sourcesPath, + absolute: true }); + + const watcher = chokidar.watch(files, { + ignoreInitial: true + }); + + watcher.on('all', (event, file) => { + const relativePath = path.relative( + config.general.sourcesPath, + path.dirname(file) + ); + + const fileName = path + .basename(file) + .replace(config.general.sourceKey, config.general.bundleKey); + + const destFile = path.join(relativePath, fileName); + + config.stylelint.failOnError = false; + + renderStyles(file, destFile, config); + }); + + } catch (e) { + log(__filename, 'Something is missing, you need install dev dependencies for this.', e.message, 'error'); } - }); + } else { + log(__filename, 'Sass / autoprefixer running...', '', 'info'); + + const entries = generateEntries(config, 'scss'); + const promises = Object.keys(entries).map(file => renderStyles(entries[file], file, config)); + await Promise.allSettled(promises); + log(__filename, 'Styles done', '', 'info'); + } };