From 77237960a75132060e2e85616bc3e77c4d8baa2d Mon Sep 17 00:00:00 2001 From: Daniella Barsony Date: Thu, 15 Aug 2019 14:53:33 +0200 Subject: [PATCH] Add tool to transpile JavaScript sources using Babel (#3009) JerryScript-DCO-1.0-Signed-off-by: Daniella Barsony bella@inf.u-szeged.hu --- tools/babel/.babelrc | 17 ++++++++ tools/babel/README.md | 74 ++++++++++++++++++++++++++++++++ tools/babel/package.json | 30 +++++++++++++ tools/babel/scripts/transpile.sh | 38 ++++++++++++++++ 4 files changed, 159 insertions(+) create mode 100644 tools/babel/.babelrc create mode 100644 tools/babel/README.md create mode 100644 tools/babel/package.json create mode 100755 tools/babel/scripts/transpile.sh diff --git a/tools/babel/.babelrc b/tools/babel/.babelrc new file mode 100644 index 000000000..e03e64257 --- /dev/null +++ b/tools/babel/.babelrc @@ -0,0 +1,17 @@ +{ + "plugins": [ + "@babel/plugin-transform-function-name", + "@babel/plugin-proposal-object-rest-spread", + "@babel/plugin-transform-block-scoping", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-block-scoped-functions", + "@babel/plugin-transform-unicode-regex", + "@babel/plugin-transform-sticky-regex", + "@babel/plugin-transform-spread", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-object-super", + "@babel/plugin-transform-new-target", + "@babel/plugin-transform-literals", + "@babel/plugin-transform-instanceof" + ] +} diff --git a/tools/babel/README.md b/tools/babel/README.md new file mode 100644 index 000000000..4b1b15b1c --- /dev/null +++ b/tools/babel/README.md @@ -0,0 +1,74 @@ +# Converting incompatible features with Babel +To run ES6 sources with JerryScript that use unsupported language features, you can use Babel to transpile your code, which will output a semantically equivalent source file, where the unsupported features are replaced with ES5.1 code. +Babel is a JavaScript compiler that is used to convert ES2015+ code into a backward-compatible version. You can find more information [here](https://babeljs.io/). + +## Example + +```javascript +//Before +const fn = () => 1; + +//After conversion + +var fn = function fn() { + return 1; +}; +``` +## Table of Contents +* **[Getting ready](#getting-ready)** + * Installing node.js and npm +* **[Using babel](#using-babel)** +* **[Missing features/Polyfill](#missing-features)** + +## Getting ready [](#getting-ready) + +### 1. **Node.js and npm** + +Start by updating the packages with + +`$ sudo apt update` + +Install `nodejs` using the apt package manager + +`$ sudo apt install nodejs` + +Check the version of **node.js** to verify that it installed + +```bash +$ nodejs --version +Output: v8.10.0 +``` + +Next up is installing **npm** with the following command + +`$ sudo apt install npm` + +Verify installation by typing: + +```bash +$ npm --version +Output: 6.10.2 +``` + +### 2. Using babel [](#using-babel) + +Assuming you're in the tools/babel folder, + +`$ sudo npm install` + +After installing the dependencies it is ready to use. + +Place the files/directories you want transpiled to the babel folder and run + +`$ npm run transpile [name of input file/directory] [(OPTIONAL)name of output file/directory]` + +If you want to use the same name, then only give the name once. + +#### Missing features/Polyfill [](#missing-features) +Some features aren't implemented yet and found no babel plug-in for them. + +* [Array.from](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from) +* [Array.prototype.fill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill) +* [String.prototype.codePointAt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) + +In the case you encounter those, use the polyfill found on the linked sites. Also, **be aware** there could be more. \ No newline at end of file diff --git a/tools/babel/package.json b/tools/babel/package.json new file mode 100644 index 000000000..28166f422 --- /dev/null +++ b/tools/babel/package.json @@ -0,0 +1,30 @@ +{ + "name": "jerryscript", + "description": "Ultra-lightweight JavaScript engine for the Internet of Things.", + "scripts": { + "transpile": "scripty" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jerryscript-project/jerryscript.git" + }, + "license": "Apache-2.0", + "devDependencies": { + "@babel/cli": "^7.4.4", + "@babel/core": "^7.4.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-instanceof": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-spread": "^7.2.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "scripty": "^1.9.1" + } +} diff --git a/tools/babel/scripts/transpile.sh b/tools/babel/scripts/transpile.sh new file mode 100755 index 000000000..9e82e7fa9 --- /dev/null +++ b/tools/babel/scripts/transpile.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Copyright JS Foundation and other contributors, http://js.foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if [[ "$#" -gt 2 || "$#" -lt 1 ]]; then + echo "Usage: $0 input [output]" + echo "* input: name of input directory/file" + echo "* output: name of output directory/file (same as input if not given)" + exit 1 +fi + +if [[ ! -d $1 && ! -f $1 ]]; then + echo "Error: $1 is not a file or directory" + exit 1 +fi + +FLAG='--out-file' +if [[ -d $1 ]]; then + FLAG='--out-dir' +fi + +if [[ "$#" -eq 1 ]]; then + ./node_modules/.bin/babel $1 $FLAG $1 --verbose +else + ./node_modules/.bin/babel $1 $FLAG $2 --verbose +fi