Bagaimana cara menemukan kasus perubahan yang melanggar CoffeeScript 1.9.0 dalam kode saya?

TL;DR: Apakah ada cara untuk mengidentifikasi pelanggaran terhadap perilaku baru CoffeeScript 1.9.0 untuk penamaan parameter @foo? Sekarang ilegal, dan tidak menimbulkan peringatan/kesalahan, menggunakan variabel kosong foo dalam fungsi tersebut.

Dalam CoffeeScript versi 1.9.0 dinyatakan:

Mengubah strategi untuk pembuatan nama variabel kompiler internal. Perhatikan bahwa ini berarti parameter fungsi @example tidak lagi tersedia sebagai variabel example kosong di dalam isi fungsi.

Ini berarti

class Animal
  constructor: (@name) ->
    console.log name

.. akan gagal, secara diam-diam. Artinya di atas tidak akan mencetak nama hewan baru.

Solusi baru yang benar adalah:

class Animal
  constructor: (@name) ->
    console.log @name

CoffeeLint tidak menangkap ini. Apakah ada aksi yang diketahui untuk menemukan penggunaan parameter telanjang yang sekarang ilegal? Mungkin skrip bagus yang berjalan pada javascript yang dihasilkan?

Berikut 2 tautan tentang ini:


person backspaces    schedule 21.03.2015    source sumber


Jawaban (2)


Hal termudah adalah menggunakan versi coffee yang lebih lama.

Jika hal itu tidak memungkinkan, Anda dapat mengkompilasi setiap file sumber dan menjalankannya melalui eslint memeriksa aturan no-undef. Anda dapat melakukannya dengan skrip bash berikut:

#!/bin/bash

FILES=$@

# https://nodejs.org/api/globals.html
# Object.keys(global).concat(['__dirname', '__filename']).join(',')
DEFINED_GLOBALS='ArrayBuffer,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,DataView,global,process,GLOBAL,root,Buffer,setTimeout,setInterval,clearTimeout,clearInterval,setImmediate,clearImmediate,console,module,require,__dirname,__filename'

function compile() {
  ./node_modules/.bin/coffee --print $1
}

function lint() {
  # checks only for undefined variables except DEFINED_GLOBALS
  ./node_modules/.bin/eslint\
    --stdin --no-color\
    --global $DEFINED_GLOBALS\
    --reset --rule 'no-undef: [true]'
}

function main() {
  for file in $FILES; do
    local problems=`compile $file | lint`
    if [[ $problems ]]; then
      echo -e "=== $file\n$problems\n\n"
    fi
  done
}

main

Simpan itu sebagai check.sh dan jalankan sesuatu seperti baris berikut:

chmod u+x ./check.sh
npm install coffee-script eslint
find . -name "*.coffee" | xargs ./check.sh
person Aleksei Zabrodskii    schedule 24.03.2015
comment
Itu ide yang bagus, pada dasarnya mengetahui di mana kesalahan akan terjadi. Saya tidak menggunakannya, sebagai gantinya saya menulis skrip bash untuk menemukan semua tempat di mana metode menggunakan gaya @param, kemudian menemukan 4 tempat di mana saya menggunakan param bare. Tetapi jika saya menemukan masalah lebih lanjut, saya akan mencoba ide Anda. Terima kasih! - person backspaces; 24.03.2015
comment
Sekadar catatan untuk mengatakan bahwa saya telah berpindah dari CoffeeScript ke es6/jspm. Agak menyukainya. - person backspaces; 30.08.2015

Saya telah membuat mod kompiler CoffeeScript yang console.errors setiap kejadian saat Anda kehilangan @: https://github.com/lydell/coffee-script/tree/1.8-at-params-warn

Untuk menginstalnya:

npm install lydell/coffee-script#1.8-at-params-warn

Untuk memeriksa file apakah ada @s yang hilang, jalankan misalnya:

./node_modules/.bin/coffee -p file-to-check.coffee >/dev/null

Di atas akan mencatat jalur file, nomor baris, nomor kolom dan nama variabel untuk setiap variabel yang memerlukan @.

person lydell    schedule 30.08.2015