From 35011bcb26b6fcfcbd77dc05aa8246ca45b2c2ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 17 Jul 2020 18:36:09 +0200 Subject: [PATCH] Add .Defines to js.Build options 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 | 14 +++++++++++++- resources/resource_transformers/js/build_test.go | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/resources/resource_transformers/js/build.go b/resources/resource_transformers/js/build.go index c48778692..df8cdde1d 100644 --- a/resources/resource_transformers/js/build.go +++ b/resources/resource_transformers/js/build.go @@ -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, } diff --git a/resources/resource_transformers/js/build_test.go b/resources/resource_transformers/js/build_test.go index 3f2a1e104..b28f66a43 100644 --- a/resources/resource_transformers/js/build_test.go +++ b/resources/resource_transformers/js/build_test.go @@ -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: "", })