Add .Defines to js.Build options
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 17 Jul 2020 16:36:09 +0000 (18:36 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 17 Jul 2020 17:09:09 +0000 (19:09 +0200)
This is needed to import `react` as a library, e.g.:

```
{{ $jsx := resources.Get "index.jsx" }}
{{ $options := dict "defines" (dict "process.env.NODE_ENV" "\"development\"") }}
{{ $js := $jsx | js.Build $options }}
```

Fixes #7489

resources/resource_transformers/js/build.go
resources/resource_transformers/js/build_test.go

index c48778692e57e8c1f1328dfa60c2b1820e9b0820..df8cdde1d13db48639af1c5183571640a750d343 100644 (file)
@@ -19,6 +19,8 @@ import (
        "path"
        "strings"
 
+       "github.com/spf13/cast"
+
        "github.com/gohugoio/hugo/helpers"
        "github.com/gohugoio/hugo/hugolib/filesystems"
        "github.com/gohugoio/hugo/media"
@@ -50,6 +52,9 @@ type Options struct {
        // External dependencies, e.g. "react".
        Externals []string `hash:"set"`
 
+       // User defined symbols.
+       Defines map[string]interface{}
+
        // What to use instead of React.createElement.
        JSXFactory string
 
@@ -66,10 +71,11 @@ type internalOptions struct {
 
        Externals []string `hash:"set"`
 
+       Defines map[string]string
+
        // These are currently not exposed in the public Options struct,
        // but added here to make the options hash as stable as possible for
        // whenever we do.
-       Defines  map[string]string
        TSConfig string
 }
 
@@ -78,6 +84,7 @@ func DecodeOptions(m map[string]interface{}) (opts Options, err error) {
                return
        }
        err = mapstructure.WeakDecode(m, &opts)
+       err = mapstructure.WeakDecode(m, &opts)
 
        if opts.TargetPath != "" {
                opts.TargetPath = helpers.ToSlashTrimLeading(opts.TargetPath)
@@ -210,11 +217,16 @@ func toInternalOptions(opts Options) internalOptions {
        if target == "" {
                target = defaultTarget
        }
+       var defines map[string]string
+       if opts.Defines != nil {
+               defines = cast.ToStringMapString(opts.Defines)
+       }
        return internalOptions{
                TargetPath:  opts.TargetPath,
                Minify:      opts.Minify,
                Target:      target,
                Externals:   opts.Externals,
+               Defines:     defines,
                JSXFactory:  opts.JSXFactory,
                JSXFragment: opts.JSXFragment,
        }
index 3f2a1e104b71e650277c4cd63698235710b46a8d..b28f66a431ed581e43c00a1fa80222bade39f861 100644 (file)
@@ -42,6 +42,7 @@ func TestToInternalOptions(t *testing.T) {
                JSXFactory:  "v3",
                JSXFragment: "v4",
                Externals:   []string{"react"},
+               Defines:     map[string]interface{}{"process.env.NODE_ENV": "production"},
                Minify:      true,
        }
 
@@ -52,7 +53,7 @@ func TestToInternalOptions(t *testing.T) {
                JSXFactory:  "v3",
                JSXFragment: "v4",
                Externals:   []string{"react"},
-               Defines:     nil,
+               Defines:     map[string]string{"process.env.NODE_ENV": "production"},
                TSConfig:    "",
        })