Babel не может анализировать каждый оператор

Я пытаюсь перенести файлы .ds из Salesforce Commerce Cloud в JavaScript, чтобы мы могли применять стандартные инструменты тестирования (Jest, Mocha и т. Д.). В документах SFCC указано, что файлы .ds представляют собой "Rhino JavaScript" с нестандартным расширением для проверки типа Flow.

До сих пор удаление аннотаций типов было простым с помощью подключаемого модуля transform-flow-strip-types. Но SFCC поддерживает устаревший "для каждого ... в "заявлении JavaScript 1.6, что Babel задыхается.

Весь приведенный ниже код доступен на github.

Вот мой исходный файл src / index.ds:

function dump(a: Array) {
    for each (var x in a) {
        console.log(x);
    }
}
module.exports = dump;

И мой gulfile.js:

const gulp = require('gulp');
const babel = require('gulp-babel');

gulp.task('test', function () {
    gulp.src('src/**/*.ds')
        .pipe(babel())
        .pipe(gulp.dest('dst'));
});

А это мой package.json:

{
  "name": "dspoc",
  "version": "1.0.0",
  "description": "poc",
  "main": "index.ds",
  "author": "cjr",
  "license": "ISC",
  "devDependencies": {
    "babel": "^6.23.0",
    "babel-core": "^6.26.3",
    "babel-plugin-transform-flow-strip-types": "^6.22.0",
    "gulp": "^3.9.1",
    "gulp-babel": "^7.0.1"
  },
  "babel": {
    "plugins": [
      "transform-flow-strip-types"
    ]
  }
}

Когда я запускаю gulp test, я получаю следующее:

%> gulp test
[11:23:06] Using gulpfile ~/dev/dspoc/gulpfile.js
[11:23:06] Starting 'test'...
[11:23:06] Finished 'test' after 9.15 ms

events.js:163
      throw er; // Unhandled 'error' event
      ^
SyntaxError: /Users/craser/dev/dspoc/src/index.ds: Unexpected token, expected ( (2:5)
  1 | function dump(a: Array) {
> 2 |   for each (var x in a) {
    |       ^
  3 |       console.log(x);
  4 |   }
  5 | }
    at Parser.pp$5.raise (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:4454:13)
    at Parser.pp.unexpected (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:1761:8)
    at Parser.pp.expect (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:1749:33)
    at Parser.pp$1.parseForStatement (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:2008:8)
    at Parser.pp$1.parseStatement (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:1836:19)
    at Parser.parseStatement (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:5910:22)
    at Parser.pp$1.parseBlockBody (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:2268:21)
    at Parser.pp$1.parseBlock (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:2247:8)
    at Parser.pp$3.parseFunctionBody (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:4235:22)
    at Parser.parseFunctionBody (/Users/craser/dev/dspoc/node_modules/babylon/lib/index.js:5897:20)

Я потратил довольно много времени на поиск плагина, который позволил бы Babel преобразовать это во что-то вроде оператора for...of, но я, похоже, ничего не нашел.

Я сейчас на грани того, чтобы копаться в for-of transform был построен и создал что-то похожее на transform for each...in, но я действительно не хочу вдаваться в эту работу, если я могу ее избежать.

Я чувствую, что здесь не хватает чего-то очевидного. Кто-нибудь знает, как это можно сделать?


person DeathB4Decaf    schedule 25.05.2018    source источник


Ответы (1)


for each...in никогда не был официальной частью спецификации и не существовал к моменту появления Babel, поэтому он не поддерживается Babel. Боюсь, вам придется обновить все варианты использования этого синтаксиса, прежде чем Babel сможет его обработать.

person loganfsmyth    schedule 25.05.2018
comment
К сожалению, обновление исходного кода не является стартовым для этого проекта. (По крайней мере, на данный момент.) Похоже, я либо соберу свой собственный препроцессор, либо напишу преобразование для Babel, чтобы с этим справиться. - person DeathB4Decaf; 26.05.2018
comment
Babel не поддерживает настраиваемый синтаксический анализ, только настраиваемые преобразования, поэтому вам придется создать собственный форк синтаксического анализатора с его поддержкой, к вашему сведению. - person loganfsmyth; 26.05.2018
comment
Когда мы хотели применить Mocha / Istanbul к SFCC, мы решили использовать стандартный JavaScript вместо ds. От аннотаций типов довольно легко избавиться с помощью регулярных выражений. Может быть, вы можете попробовать то же самое для оператора for..each. Также зависит от того, насколько унаследована ваша кодовая база и насколько комфортно вы себя чувствуете, делая это большое изменение. Вы также можете исключить проблемные файлы из конфигурации babel и просто применить babel / mocha / jest к файлам, которые для начала не содержат for-each. Опять же, это зависит от того, насколько хорошо структурирован ваш код. - person Nikolaos Georgiou; 26.05.2018