Per correggere eventuali errori in librerie con vulnerabilità o errori non pathcabili con update ( perché già all'ultima versione o perché la nuova versione non è retrocompatibili ) si può usare uno script di grunt che automatizza la correzione: ad esempio la libreria bootstrap-select ( @todo cercare un sostituto ) nella sua ultima versione contiene un errore di sintassi scss perché i calcoli vanno effettuati all’interno del costrutto calc()
$amnt: $amnt / 100; // convert to percentage if int
Per poter correggere possiamo usare uno script di grunt che si chiama grunt-replace
npm install grunt-replace
Successivamente dobbiamo creare la procedura all’interno del file Gruntfile.js che va a prendere il file con l’errore e sostituisce la stringa
replace: { dist: { options: { patterns: [ { match: /\$amnt: \$amnt \/ 100;/g, // Trova la stringa da sostituire replace: "$amnt: calc($amnt / 100)" // Sostituisci con la nuova stringa } ], usePrefix: false // Non usare il prefisso ~ per le URL }, files: [ { expand: true, src: ['dist/vendor/bootstrap-select/sass/bootstrap-select.scss'], dest: './' // Sovrascrivi i file originali } ] } },
Lo script va caricato
grunt.loadNpmTasks('grunt-replace');
e registrato nel posto corretto ( in questo caso ad esempio il gruppo scss viene chiamato dopo il copy per cui il file è già nella dist )
grunt.registerTask('scss', [ 'replace', 'sass', 'postcss' ]);Un esempio che corregge anche il problema del math non disponibile e delle percentuali su abs:
replace: { dist: { options: { patterns: [ { match: /\$amnt: \$amnt \/ 100;/g, replace: "$amnt: calc($amnt / 100);" }, { match: /abs\(\$dividend\);/g, replace: "abs($dividend);" // Usa `abs()` al posto di `math.abs()` }, { match: /abs\((\d+%)\);/g, replace: "abs(#{$1});" // Usa `abs(#{$1})` per preservare le percentuali } ], usePrefix: false // Non usare il prefisso ~ per le URL }, files: [ { expand: true, src: [ 'src/scss/{,**/}*.scss', 'dist/vendor/{,**/}*.scss', ], dest: './' // Sovrascrivi i file originali } ] } },