javascript checker standalone spidermonkey + jslint

Construyendo nuestra caja de herramientas nos encontramos con que necesitamos una herramienta de linea de comandos que nos chequee la sintaxis de los ficheros javascript antes de subirlo a subversion. He encontrado jslint que según sus propios autores es una herramienta para calidad el código javascript y efectivamente eso es, sólo que a nosotors sólo nos interesa el chequeo de la sintaxis.

En la documentación que he encontrado hay varios blogs en los que hablan de usar rhino que es un interprete de javascript de la fundación mozilla y funciona con java ( clooooooonk ) y por otro lado y mi opción preferida es spidermonkey de la fundación mozilla también pero sin usar java con lo que la velocidad de procesamiento evidentemente aumenta.

Actualmente existen dos problemas, uno que la versión de jslint no soporta el modo stand-alone por lo que Andy hizo unas pequeñas modificaciones y las publicó aquí http://whereisandy.com/code/jslint/.

Existe un segundo problema que es, que spidermonkey al parecer no soporta la gestión de ficheros, por que según leo, el standard ECMAScript no especifica ningúna librería standard de I/O. También estan las jslibs pero no están en el repositorio de linux con lo que no me interesa andar compilando teniendo ya una alternativa como spidermonkey

El tal Andy, ha hecho este bloque de código :
[shell](function(a) {

    var input=»»;
    var line=»»;
    var blankcount=»0″;
    while (blankcount < 10){
        line=readline();

        if (line==»»)
            blankcount++;
        else
            blankcount=0;
        if (line==»END») break;
        input += line;
        input += «\n»;
    }
    input = input.substring(0, input.length-blankcount);

    if (!input) {
        print(«No input!»);
        quit(1);
    }
    if (!JSLINT(input, {
        rhino: true,
        passfail: false
    })) {
        for (var i = 0; i < JSLINT.errors.length; i += 1) {
            var e = JSLINT.errors[i];
            if (e) {
                print(‘Lint at line ‘ + (e.line + 1) + ‘ character ‘ + (e.character + 1) + ‘: ‘ + e.reason);
                print((e.evidence || »).replace(/^\s*(\S*(\s+\S+)*)\s*$/, «$1″));
                print(»);
            }
        }
    } else {
        print(«jslint: No problems found.»);
        quit();
    }
})(arguments);[/shell]
Lo que consigue es capturar el código con la funcion readline() hasta que encuentra una linea con END o diez líneas vacías.

 

De forma que si yo tengo este script tonto llamado dummy.js :
[shell]function stupid(x) {
  y = x

  if(y == 0){
    return 5
    }
}

print(‘Hello World’ + stupid(0) );[/shell]
Lo ejecutaría así:
[shell]cat dummy.js | js jslint.sh[/shell]
El problema es que en mi caso se ejecuta y se queda ahí muerto hasta que falla con el error:
[shell]jslint:4246: InternalError: allocation size overflow[/shell]
El problema es que no está detectando las lineas vacías como ‘\n’ sino como ‘null’ lo que nos lleva a mi pequeña modificación para que funcione el script :
[shell](function(a) {

    var input=»»;
    var line=»»;
    var blankcount=»0″;
    while (blankcount < 10){
        line=readline();

        if (line==»» || line==null ){             blankcount++;     }
        else
            blankcount=0;
        if (line==»END») break;

        if ( line!=null)         input += line;
        input += «\n»;
    }
    input = input.substring(0, input.length-blankcount);

    if (!input) {
        print(«No input!»);
        quit(1);
    }
    if (!JSLINT(input, {
        rhino: true,
        passfail: false
    })) {
        for (var i = 0; i < JSLINT.errors.length; i += 1) {
            var e = JSLINT.errors[i];
            if (e) {
                print(‘Lint at line ‘ + (e.line + 1) + ‘ character ‘ + (e.character + 1) + ‘: ‘ + e.reason);
                print((e.evidence || »).replace(/^\s*(\S*(\s+\S+)*)\s*$/, «$1″));
                print(»);
            }
        }
    } else {
        print(«jslint: No problems found.»);
        quit();
    }
})(arguments);[/shell]
y si ahora lo ejecutamos ya lo chequea correctamente:
[shell]cat dummy.js | js jslint.sh[/shell]
[shell]Lint at line 2 character 7: Line breaking error ‘x’.
y = x

Lint at line 2 character 8: Missing semicolon.
y = x

Lint at line 4 character 8: Use ‘===’ to compare with ‘0’.
if(y == 0){

Lint at line 5 character 13: Missing semicolon.
return 5[/shell]
Como nota indicar que se cogen 10 lineas en blanco como fin del fichero ya que con el metodo readline() no tenemos forma de sabe dónde está el final del fichero.

 

Espero que os sea de utilidad. Descargar jslint

 


Publicado

en

por

Etiquetas:

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.