Grunt scripts replace

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
                }
              ]
            }
        },