DEV Community

Moeki Kawakami
Moeki Kawakami

Posted on

2

Javascript Transpiler and ESLint are NOT Perfect

Summary

  • Even with a transpiler, not all ECMAScript descriptions can be converted.
  • Even with ESLint, not all ECMAScript descriptions can be linted.

Inspect!

When using ECMAScript, what does the transpiler convert and what does it parse?

  • Verify what the transpiler converts and what it ignores
  • Verify what ESLint parses and what it ignores

cc-kawakami/transpilers-and-eslint-are-not-perfect

Input for validation

  • Code samples based on ES6 to ESNext standards
  • Pick a function that you may have occasion to use
/** 
 * ES2015
 * ------------------------------------------------
 */
/** const, let */
const cst = 1
let lt = 2
console.log(cst)
console.log(lt)

/** Allow function */
const fn = () => {
  console.log('fn')
}

/** classes */
class Hoge {
  fuga () {
    console.log('fuga')
  }
}

/** 
 * ES2016
 * ------------------------------------------------
 */
/** Array.prototype.includes */
const array = [1, 2, 3, 4, 5]
console.log(array.includes(2))

/** power operator */
console.log(2**2)

/**
 * ES2017
 * ------------------------------------------------
 */
/** Async functions */
async function log () {
  console.log('hoge')
}

/** Object.values() */
const obj = { hoge: 0, fuga: 1, piyo: 2 }
console.log(Object.values(obj))

/**
 * ES2018
 * ------------------------------------------------
 */
/** Spread Properties */
const hoge = { fuga: 'piyo' }
console.log({ .... .hoge })

/** RegExp named capture groups */
console.log(/(? <year>[0-9]{4})year/.test('2021'))

/** RegExp Lookbehind Assertions */
console.log(/(? <=[0-9]+)\. [0-9]+/.test('.34'))

/**
 * ES2019
 * ------------------------------------------------
 */
/** flat array methods */
console.log([[1, 2], 3, 4].flat())

/**
 * ES2020
 * ------------------------------------------------
 */
/** Optional chaining operator */
console.log(hoge?.fuga)

/**
 * ES2021
 * ------------------------------------------------
 */
/** Logical assignment operators */
console.log(a ||= b)

/** Numeric separators */
console.log(100_000_000)

/**
 * ESNext
 * ------------------------------------------------
 */
/** static class field */
class Foo {
  static bar = 1
}

console.log(Foo.bar)
Enter fullscreen mode Exit fullscreen mode

Target transpiler and settings

No name target
1 Babel / conservative - ( > 1% in JP )
2 Babel / progressive - ( > 5% in JP )
3 esbuild / default ESNext
4 esbuild / to ES2017 ES2017
5 rollup not transpile
6 rollup-plugin-esbuild ES2017
7 Typescript / default ES3
8 Typescript / to ES2017 ES2017

Inspection results.

Descriptions not converted by ALL transpiles

  • RegExp named capture groups (ES2018)
  • RegExp Lookbehind Assertions (ES2018)
  • Flat array methods (ES2019)

Descriptions that cannot be validated with ESLint

  • flat array methods (ES2019)

Other things I noticed

  • esbuild reduces comments by default.

(extra) execution time

No name target time ( s )
1 Babel / conservative - ( > 1% in JP ) 0.63
2 Babel / progressive - ( > 5% in JP ) 0.53
3 esbuild / default ESNext 0.31
4 esbuild / to ES2017 ES2017 0.18
5 rollup not transpile 0.20
6 rollup-plugin-esbuild ES2017 0.27
7 Typescript / default ES3 1.21
8 Typescript / to ES2017 ES2017 1.36

Reference

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay