Rename transpileJS to babel
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 28 Apr 2020 12:02:41 +0000 (14:02 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 29 Apr 2020 08:51:33 +0000 (10:51 +0200)
And add a test.

Updates #5764

common/hugo/hugo.go
docs/content/en/hugo-pipes/babel.md [new file with mode: 0755]
docs/content/en/hugo-pipes/transformjs.md [deleted file]
hugolib/resource_chain_babel_test.go [new file with mode: 0644]
resources/resource_transformers/babel/babel.go [new file with mode: 0644]
resources/resource_transformers/postcss/postcss.go
resources/resource_transformers/transpilejs/transpilejs.go [deleted file]
tpl/resources/init.go
tpl/resources/resources.go

index 03788083698e84e5c6b076e057356ba53f49784b..6e07f69c3b854b51526ad90dc05ce99705e991e0 100644 (file)
@@ -16,6 +16,9 @@ package hugo
 import (
        "fmt"
        "html/template"
+       "os"
+
+       "github.com/gohugoio/hugo/config"
 )
 
 const (
@@ -69,3 +72,9 @@ func NewInfo(environment string) Info {
                Environment: environment,
        }
 }
+
+func GetExecEnviron(cfg config.Provider) []string {
+       env := os.Environ()
+       config.SetEnvVars(&env, "HUGO_ENVIRONMENT", cfg.GetString("environment"))
+       return env
+}
diff --git a/docs/content/en/hugo-pipes/babel.md b/docs/content/en/hugo-pipes/babel.md
new file mode 100755 (executable)
index 0000000..e34faec
--- /dev/null
@@ -0,0 +1,55 @@
+---
+title: Babel
+description: Hugo Pipes can process JS files with Babel.
+date: 2019-03-21
+publishdate: 2019-03-21
+lastmod: 2019-03-21
+categories: [asset management]
+keywords: []
+menu:
+  docs:
+    parent: "pipes"
+    weight: 49
+weight: 49
+sections_weight: 49
+draft: false
+---
+
+Any JavaScript resource file can be transpiled to another JavaScript version using `resources.Babel` which takes for argument the resource object and an optional dict of options listed below. Babel uses the [babel cli](https://babeljs.io/docs/en/babel-cli).
+
+
+{{% note %}}
+Hugo Pipe's Babel requires the `@babel/cli` and `@babel/core` JavaScript packages to be installed in the project or globally (`npm install -g @babel/cli @babel/core`) along with any Babel plugin(s) or preset(s) used (e.g., `npm install @babel/preset-env --save-dev`).
+
+If you are using the Hugo Snap package, Babel and plugin(s) need to be installed locally within your Hugo site directory, e.g., `npm install @babel/cli @babel/core --save-dev` without the `-g` flag.
+{{% /note %}}
+
+### Options
+
+config [string]
+: Path to the Babel configuration file. Hugo will, by default, look for a `babel.config.js` in your project. More information on these configuration files can be found here: [babel configuration](https://babeljs.io/docs/en/configuration).
+
+minified [bool]
+: Save as much bytes as possible when printing
+
+noComments [bool]
+: Write comments to generated output (true by default)
+
+compact [bool]
+: Do not include superfluous whitespace characters and line terminators. Defaults to `auto` if not set.
+
+verbose [bool]
+: Log everything
+
+### Examples
+
+```go-html-template
+{{- $transpiled := resources.Get "scripts/main.js" | babel  -}}
+```
+
+Or with options:
+
+```go-html-template
+{{ $opts := dict "noComments" true }}
+{{- $transpiled := resources.Get "scripts/main.js" | babel $opts -}}
+```
diff --git a/docs/content/en/hugo-pipes/transformjs.md b/docs/content/en/hugo-pipes/transformjs.md
deleted file mode 100755 (executable)
index 2a25946..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
----
-title: TransformJS
-description: Hugo Pipes can process JS files with Babel.
-date: 2019-03-21
-publishdate: 2019-03-21
-lastmod: 2019-03-21
-categories: [asset management]
-keywords: []
-menu:
-  docs:
-    parent: "pipes"
-    weight: 75
-weight: 75
-sections_weight: 75
-draft: false
----
-
-Any JavaScript resource file can be transpiled to another JavaScript version using `resources.TransformJS` which takes for argument the resource object and a slice of options listed below. TransformJS uses the [babel cli](https://babeljs.io/docs/en/babel-cli).
-
-
-{{% note %}}
-Hugo Pipe's TranspileJS requires the `@babel/cli` and `@babel/core` JavaScript packages to be installed in the environment (`npm install -g @babel/cli @babel/core`) along with any Babel plugin(s) or preset(s) used (e.g., `npm install -g @babel/preset-env`).
-
-If you are using the Hugo Snap package, Babel and plugin(s) need to be installed locally within your Hugo site directory, e.g., `npm install @babel/cli @babel/core` without the `-g` flag.
-{{% /note %}}
-### Options
-
-config [string]
-: Path to the Babel configuration file
-
-_If no configuration file is used:_
-
-plugins [string]
-: Comma seperated string of Babel plugins to use
-
-presets [string]
-: Comma seperated string of Babel presets to use
-
-minified [bool]
-: Save as much bytes as possible when printing
-
-noComments [bool]
-: Write comments to generated output (true by default)
-
-compact [string]
-: Do not include superfluous whitespace characters and line terminators (true/false/auto)
-
-verbose [bool]
-: Log everything
-
-### Examples
-Without a `.babelrc` file, you can simply pass the options like so:
-```go-html-template
-{{- $transpileOpts := (dict "presets" "@babel/preset-env" "minified" true "noComments" true "compact" "true" ) -}}
-{{- $transpiled := resources.Get "scripts/main.js" | transpileJS $transpileOpts -}}
-```
-
-If you rather want to use a config file, you can leave out the options in the template.
-```go-html-template
-{{- $transpiled := resources.Get "scripts/main.js" | transpileJS $transpileOpts -}}
-```
-Then, you can either create a `.babelrc` in the root of your project, or your can create a `.babel.config.js`.
-More information on these configuration files can be found here: [babel configuration](https://babeljs.io/docs/en/configuration)
-
-Finally, you can also pass a custom file path to a config file like so:
-```go-html-template
-{{- $transpileOpts := (dict "config" "config/my-babel-config.js" ) -}}
-{{- $transpiled := resources.Get "scripts/main.js" | transpileJS $transpileOpts -}}
-```
\ No newline at end of file
diff --git a/hugolib/resource_chain_babel_test.go b/hugolib/resource_chain_babel_test.go
new file mode 100644 (file)
index 0000000..c9ddb21
--- /dev/null
@@ -0,0 +1,127 @@
+// Copyright 2020 The Hugo Authors. All rights reserved.
+//
+// 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.
+
+package hugolib
+
+import (
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "testing"
+
+       "github.com/gohugoio/hugo/htesting"
+
+       "github.com/spf13/viper"
+
+       qt "github.com/frankban/quicktest"
+
+       "github.com/gohugoio/hugo/hugofs"
+
+       "github.com/gohugoio/hugo/common/loggers"
+)
+
+func TestResourceChainBabel(t *testing.T) {
+       if !isCI() {
+               t.Skip("skip (relative) long running modules test when running locally")
+       }
+
+       if runtime.GOOS == "windows" {
+               t.Skip("skip npm test on Windows")
+       }
+
+       wd, _ := os.Getwd()
+       defer func() {
+               os.Chdir(wd)
+       }()
+
+       c := qt.New(t)
+
+       packageJSON := `{
+  "scripts": {},
+
+  "devDependencies": {
+    "@babel/cli": "7.8.4",
+    "@babel/core": "7.9.0",
+    "@babel/preset-env": "7.9.5"
+  }
+}
+`
+
+       babelConfig := `
+console.error("Hugo Environment:", process.env.HUGO_ENVIRONMENT );
+
+module.exports = {
+  presets: ["@babel/preset-env"],
+};
+
+`
+
+       js := `
+/* A Car */
+class Car {
+  constructor(brand) {
+    this.carname = brand;
+  }
+}
+`
+
+       workDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-test-babel")
+       c.Assert(err, qt.IsNil)
+       defer clean()
+
+       v := viper.New()
+       v.Set("workingDir", workDir)
+       v.Set("disableKinds", []string{"taxonomyTerm", "taxonomy", "page"})
+       b := newTestSitesBuilder(t).WithLogger(loggers.NewWarningLogger())
+
+       // Need to use OS fs for this.
+       b.Fs = hugofs.NewDefault(v)
+       b.WithWorkingDir(workDir)
+       b.WithViper(v)
+       b.WithContent("p1.md", "")
+
+       b.WithTemplates("index.html", `
+{{ $options := dict "noComments" true }}
+{{ $transpiled := resources.Get "js/main.js" | babel -}}
+Transpiled: {{ $transpiled.Content | safeJS }}
+
+`)
+
+       jsDir := filepath.Join(workDir, "assets", "js")
+       b.Assert(os.MkdirAll(jsDir, 0777), qt.IsNil)
+       b.WithSourceFile("assets/js/main.js", js)
+       b.WithSourceFile("package.json", packageJSON)
+       b.WithSourceFile("babel.config.js", babelConfig)
+
+       b.Assert(os.Chdir(workDir), qt.IsNil)
+       _, err = exec.Command("npm", "install").CombinedOutput()
+       b.Assert(err, qt.IsNil)
+
+       out, err := captureStderr(func() error {
+               return b.BuildE(BuildCfg{})
+
+       })
+       // Make sure Node sees this.
+       b.Assert(out, qt.Contains, "Hugo Environment: production")
+       b.Assert(err, qt.IsNil)
+
+       b.AssertFileContent("public/index.html", `
+var Car = function Car(brand) {
+ _classCallCheck(this, Car);
+
+ this.carname = brand;
+};
+`)
+
+}
diff --git a/resources/resource_transformers/babel/babel.go b/resources/resource_transformers/babel/babel.go
new file mode 100644 (file)
index 0000000..fc9650a
--- /dev/null
@@ -0,0 +1,186 @@
+// Copyright 2020 The Hugo Authors. All rights reserved.
+//
+// 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.
+
+package babel
+
+import (
+       "io"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "strconv"
+
+       "github.com/gohugoio/hugo/common/hugo"
+       "github.com/gohugoio/hugo/resources/internal"
+
+       "github.com/mitchellh/mapstructure"
+
+       "github.com/gohugoio/hugo/common/herrors"
+       "github.com/gohugoio/hugo/hugofs"
+       "github.com/gohugoio/hugo/resources"
+       "github.com/gohugoio/hugo/resources/resource"
+       "github.com/pkg/errors"
+)
+
+// Options from https://babeljs.io/docs/en/options
+type Options struct {
+       Config string // Custom path to config file
+
+       Minified   bool
+       NoComments bool
+       Compact    *bool
+       Verbose    bool
+       NoBabelrc  bool
+}
+
+func DecodeOptions(m map[string]interface{}) (opts Options, err error) {
+       if m == nil {
+               return
+       }
+       err = mapstructure.WeakDecode(m, &opts)
+       return
+}
+func (opts Options) toArgs() []string {
+       var args []string
+
+       if opts.Minified {
+               args = append(args, "--minified")
+       }
+       if opts.NoComments {
+               args = append(args, "--no-comments")
+       }
+       if opts.Compact != nil {
+               args = append(args, "--compact="+strconv.FormatBool(*opts.Compact))
+       }
+       if opts.Verbose {
+               args = append(args, "--verbose")
+       }
+       if opts.NoBabelrc {
+               args = append(args, "--no-babelrc")
+       }
+       return args
+}
+
+// Client is the client used to do Babel transformations.
+type Client struct {
+       rs *resources.Spec
+}
+
+// New creates a new Client with the given specification.
+func New(rs *resources.Spec) *Client {
+       return &Client{rs: rs}
+}
+
+type babelTransformation struct {
+       options Options
+       rs      *resources.Spec
+}
+
+func (t *babelTransformation) Key() internal.ResourceTransformationKey {
+       return internal.NewResourceTransformationKey("babel", t.options)
+}
+
+// Transform shells out to babel-cli to do the heavy lifting.
+// For this to work, you need some additional tools. To install them globally:
+// npm install -g @babel/core @babel/cli
+// If you want to use presets or plugins such as @babel/preset-env
+// Then you should install those globally as well. e.g:
+// npm install -g @babel/preset-env
+// Instead of installing globally, you can also install everything as a dev-dependency (--save-dev instead of -g)
+func (t *babelTransformation) Transform(ctx *resources.ResourceTransformationCtx) error {
+       const localBabelPath = "node_modules/@babel/cli/bin/"
+       const binaryName = "babel.js"
+
+       // Try first in the project's node_modules.
+       csiBinPath := filepath.Join(t.rs.WorkingDir, localBabelPath, binaryName)
+
+       binary := csiBinPath
+
+       if _, err := exec.LookPath(binary); err != nil {
+               // Try PATH
+               binary = binaryName
+               if _, err := exec.LookPath(binary); err != nil {
+
+                       // This may be on a CI server etc. Will fall back to pre-built assets.
+                       return herrors.ErrFeatureNotAvailable
+               }
+       }
+
+       var configFile string
+       logger := t.rs.Logger
+
+       if t.options.Config != "" {
+               configFile = t.options.Config
+       } else {
+               configFile = "babel.config.js"
+       }
+
+       configFile = filepath.Clean(configFile)
+
+       // We need an abolute filename to the config file.
+       if !filepath.IsAbs(configFile) {
+               // We resolve this against the virtual Work filesystem, to allow
+               // this config file to live in one of the themes if needed.
+               fi, err := t.rs.BaseFs.Work.Stat(configFile)
+               if err != nil {
+                       if t.options.Config != "" {
+                               // Only fail if the user specificed config file is not found.
+                               return errors.Wrapf(err, "babel config %q not found:", configFile)
+                       }
+               } else {
+                       configFile = fi.(hugofs.FileMetaInfo).Meta().Filename()
+               }
+       }
+
+       var cmdArgs []string
+
+       if configFile != "" {
+               logger.INFO.Println("babel: use config file", configFile)
+               cmdArgs = []string{"--config-file", configFile}
+       }
+
+       if optArgs := t.options.toArgs(); len(optArgs) > 0 {
+               cmdArgs = append(cmdArgs, optArgs...)
+       }
+       cmdArgs = append(cmdArgs, "--filename="+ctx.SourcePath)
+
+       cmd := exec.Command(binary, cmdArgs...)
+
+       cmd.Stdout = ctx.To
+       cmd.Stderr = os.Stderr
+       cmd.Env = hugo.GetExecEnviron(t.rs.Cfg)
+
+       stdin, err := cmd.StdinPipe()
+       if err != nil {
+               return err
+       }
+
+       go func() {
+               defer stdin.Close()
+               io.Copy(stdin, ctx.From)
+       }()
+
+       err = cmd.Run()
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
+
+// Process transforms the given Resource with the Babel processor.
+func (c *Client) Process(res resources.ResourceTransformer, options Options) (resource.Resource, error) {
+       return res.Transform(
+               &babelTransformation{rs: c.rs, options: options},
+       )
+}
index 15cda898cd7be3a9ce643551816f0681e375e314..1f2e51fd8d8bc32281185c54b74765363d8e0392 100644 (file)
@@ -25,9 +25,9 @@ import (
        "strconv"
        "strings"
 
-       "github.com/gohugoio/hugo/common/loggers"
+       "github.com/gohugoio/hugo/common/hugo"
 
-       "github.com/gohugoio/hugo/config"
+       "github.com/gohugoio/hugo/common/loggers"
 
        "github.com/gohugoio/hugo/resources/internal"
        "github.com/spf13/afero"
@@ -202,10 +202,7 @@ func (t *postcssTransformation) Transform(ctx *resources.ResourceTransformationC
 
        cmd.Stdout = ctx.To
        cmd.Stderr = io.MultiWriter(os.Stderr, &errBuf)
-       // TODO(bep) somehow generalize this to other external helpers that may need this.
-       env := os.Environ()
-       config.SetEnvVars(&env, "HUGO_ENVIRONMENT", t.rs.Cfg.GetString("environment"))
-       cmd.Env = env
+       cmd.Env = hugo.GetExecEnviron(t.rs.Cfg)
 
        stdin, err := cmd.StdinPipe()
        if err != nil {
diff --git a/resources/resource_transformers/transpilejs/transpilejs.go b/resources/resource_transformers/transpilejs/transpilejs.go
deleted file mode 100644 (file)
index b832f43..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2018 The Hugo Authors. All rights reserved.
-//
-// 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.
-
-package transpilejs
-
-import (
-       "io"
-       "os"
-       "os/exec"
-       "path/filepath"
-
-       "github.com/gohugoio/hugo/resources/internal"
-
-       "github.com/mitchellh/mapstructure"
-
-       "github.com/gohugoio/hugo/common/herrors"
-       "github.com/gohugoio/hugo/hugofs"
-       "github.com/gohugoio/hugo/resources"
-       "github.com/gohugoio/hugo/resources/resource"
-       "github.com/pkg/errors"
-)
-
-// Options from https://babeljs.io/docs/en/options
-type Options struct {
-       Config     string //Custom path to config file
-       Plugins    string //Comma seperated string of plugins
-       Presets    string //Comma seperated string of presets
-       Minified   bool   //true/false
-       NoComments bool   //true/false
-       Compact    string //true/false/auto
-       Verbose    bool   //true/false
-       NoBabelrc  bool   //true/false
-}
-
-func DecodeOptions(m map[string]interface{}) (opts Options, err error) {
-       if m == nil {
-               return
-       }
-       err = mapstructure.WeakDecode(m, &opts)
-       return
-}
-func (opts Options) toArgs() []string {
-       var args []string
-
-       if opts.Plugins != "" {
-               args = append(args, "--plugins="+opts.Plugins)
-       }
-       if opts.Presets != "" {
-               args = append(args, "--presets="+opts.Presets)
-       }
-       if opts.Minified {
-               args = append(args, "--minified")
-       }
-       if opts.NoComments {
-               args = append(args, "--no-comments")
-       }
-       if opts.Compact != "" {
-               args = append(args, "--compact="+opts.Compact)
-       }
-       if opts.Verbose {
-               args = append(args, "--verbose")
-       }
-       if opts.NoBabelrc {
-               args = append(args, "--no-babelrc")
-       }
-       return args
-}
-
-// Client is the client used to do Babel transformations.
-type Client struct {
-       rs *resources.Spec
-}
-
-// New creates a new Client with the given specification.
-func New(rs *resources.Spec) *Client {
-       return &Client{rs: rs}
-}
-
-type babelTransformation struct {
-       options Options
-       rs      *resources.Spec
-}
-
-func (t *babelTransformation) Key() internal.ResourceTransformationKey {
-       return internal.NewResourceTransformationKey("babel", t.options)
-}
-
-// Transform shells out to babel-cli to do the heavy lifting.
-// For this to work, you need some additional tools. To install them globally:
-// npm install -g @babel/core @babel/cli
-// If you want to use presets or plugins such as @babel/preset-env
-// Then you should install those globally as well. e.g:
-// npm install -g @babel/preset-env
-// Instead of installing globally, you can also install everything as a dev-dependency (--save-dev instead of -g)
-func (t *babelTransformation) Transform(ctx *resources.ResourceTransformationCtx) error {
-
-       const localBabelPath = "node_modules/@babel/cli/bin/"
-       const binaryName = "babel.js"
-
-       // Try first in the project's node_modules.
-       csiBinPath := filepath.Join(t.rs.WorkingDir, localBabelPath, binaryName)
-
-       binary := csiBinPath
-
-       if _, err := exec.LookPath(binary); err != nil {
-               // Try PATH
-               binary = binaryName
-               if _, err := exec.LookPath(binary); err != nil {
-
-                       // This may be on a CI server etc. Will fall back to pre-built assets.
-                       return herrors.ErrFeatureNotAvailable
-               }
-       }
-
-       var configFile string
-       logger := t.rs.Logger
-
-       if t.options.Config != "" {
-               configFile = t.options.Config
-       } else {
-               configFile = "babel.config.js"
-       }
-
-       configFile = filepath.Clean(configFile)
-
-       // We need an abolute filename to the config file.
-       if !filepath.IsAbs(configFile) {
-               // We resolve this against the virtual Work filesystem, to allow
-               // this config file to live in one of the themes if needed.
-               fi, err := t.rs.BaseFs.Work.Stat(configFile)
-               if err != nil {
-                       if t.options.Config != "" {
-                               // Only fail if the user specificed config file is not found.
-                               return errors.Wrapf(err, "babel config %q not found:", configFile)
-                       }
-               } else {
-                       configFile = fi.(hugofs.FileMetaInfo).Meta().Filename()
-               }
-       }
-
-       var cmdArgs []string
-
-       if configFile != "" {
-               logger.INFO.Println("babel: use config file", configFile)
-               cmdArgs = []string{"--config-file", configFile}
-       }
-
-       if optArgs := t.options.toArgs(); len(optArgs) > 0 {
-               cmdArgs = append(cmdArgs, optArgs...)
-       }
-       cmdArgs = append(cmdArgs, "--filename="+ctx.SourcePath)
-
-       cmd := exec.Command(binary, cmdArgs...)
-
-       cmd.Stdout = ctx.To
-       cmd.Stderr = os.Stderr
-
-       stdin, err := cmd.StdinPipe()
-       if err != nil {
-               return err
-       }
-
-       go func() {
-               defer stdin.Close()
-               io.Copy(stdin, ctx.From)
-       }()
-
-       err = cmd.Run()
-       if err != nil {
-               return err
-       }
-
-       return nil
-}
-
-// Process transforms the given Resource with the Babel processor.
-func (c *Client) Process(res resources.ResourceTransformer, options Options) (resource.Resource, error) {
-       return res.Transform(
-               &babelTransformation{rs: c.rs, options: options},
-       )
-}
index 10e8e531957d405b9931c6beb7069ec8f4905cd7..df83cb3bbfb2221a92bbf44ea58a74e80a9c2c44 100644 (file)
@@ -60,8 +60,8 @@ func init() {
                        [][2]string{},
                )
 
-               ns.AddMethodMapping(ctx.TranspileJS,
-                       []string{"transpileJS"},
+               ns.AddMethodMapping(ctx.Babel,
+                       []string{"babel"},
                        [][2]string{},
                )
 
index c256fa903d7cda9de6d24ce04ce1e17f01220257..6625702ab26093e9046bb25f282be502c17e9488 100644 (file)
@@ -29,12 +29,12 @@ import (
 
        "github.com/gohugoio/hugo/resources/resource_factories/bundler"
        "github.com/gohugoio/hugo/resources/resource_factories/create"
+       "github.com/gohugoio/hugo/resources/resource_transformers/babel"
        "github.com/gohugoio/hugo/resources/resource_transformers/integrity"
        "github.com/gohugoio/hugo/resources/resource_transformers/minifier"
        "github.com/gohugoio/hugo/resources/resource_transformers/postcss"
        "github.com/gohugoio/hugo/resources/resource_transformers/templates"
        "github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss"
-       "github.com/gohugoio/hugo/resources/resource_transformers/transpilejs"
        "github.com/spf13/cast"
 )
 
@@ -55,15 +55,15 @@ func New(deps *deps.Deps) (*Namespace, error) {
        }
 
        return &Namespace{
-               deps:              deps,
-               scssClient:        scssClient,
-               createClient:      create.New(deps.ResourceSpec),
-               bundlerClient:     bundler.New(deps.ResourceSpec),
-               integrityClient:   integrity.New(deps.ResourceSpec),
-               minifyClient:      minifyClient,
-               postcssClient:     postcss.New(deps.ResourceSpec),
-               templatesClient:   templates.New(deps.ResourceSpec, deps),
-               transpileJSClient: transpilejs.New(deps.ResourceSpec),
+               deps:            deps,
+               scssClient:      scssClient,
+               createClient:    create.New(deps.ResourceSpec),
+               bundlerClient:   bundler.New(deps.ResourceSpec),
+               integrityClient: integrity.New(deps.ResourceSpec),
+               minifyClient:    minifyClient,
+               postcssClient:   postcss.New(deps.ResourceSpec),
+               templatesClient: templates.New(deps.ResourceSpec, deps),
+               babelClient:     babel.New(deps.ResourceSpec),
        }, nil
 }
 
@@ -71,14 +71,14 @@ func New(deps *deps.Deps) (*Namespace, error) {
 type Namespace struct {
        deps *deps.Deps
 
-       createClient      *create.Client
-       bundlerClient     *bundler.Client
-       scssClient        *scss.Client
-       integrityClient   *integrity.Client
-       minifyClient      *minifier.Client
-       postcssClient     *postcss.Client
-       transpileJSClient *transpilejs.Client
-       templatesClient   *templates.Client
+       createClient    *create.Client
+       bundlerClient   *bundler.Client
+       scssClient      *scss.Client
+       integrityClient *integrity.Client
+       minifyClient    *minifier.Client
+       postcssClient   *postcss.Client
+       babelClient     *babel.Client
+       templatesClient *templates.Client
 }
 
 // Get locates the filename given in Hugo's assets filesystem
@@ -283,22 +283,22 @@ func (ns *Namespace) PostProcess(r resource.Resource) (postpub.PostPublishedReso
 
 }
 
-// TranspileJS processes the given Resource with Babel.
-func (ns *Namespace) TranspileJS(args ...interface{}) (resource.Resource, error) {
+// Babel processes the given Resource with Babel.
+func (ns *Namespace) Babel(args ...interface{}) (resource.Resource, error) {
        r, m, err := ns.resolveArgs(args)
        if err != nil {
                return nil, err
        }
-       var options transpilejs.Options
+       var options babel.Options
        if m != nil {
-               options, err = transpilejs.DecodeOptions(m)
+               options, err = babel.DecodeOptions(m)
 
                if err != nil {
                        return nil, err
                }
        }
 
-       return ns.transpileJSClient.Process(r, options)
+       return ns.babelClient.Process(r, options)
 
 }