github.com/kovansky/hugo@v0.92.3-0.20220224232819-63076e4ff19f/resources/resource_transformers/js/integration_test.go (about)

     1  // Copyright 2021 The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package js_test
    15  
    16  import (
    17  	"path/filepath"
    18  	"strings"
    19  	"testing"
    20  
    21  	qt "github.com/frankban/quicktest"
    22  	"github.com/gohugoio/hugo/htesting"
    23  	"github.com/gohugoio/hugo/hugolib"
    24  )
    25  
    26  func TestBuildVariants(t *testing.T) {
    27  	c := qt.New(t)
    28  
    29  	mainWithImport := `
    30  -- config.toml --
    31  disableKinds=["page", "section", "taxonomy", "term", "sitemap", "robotsTXT"]
    32  -- assets/js/main.js --
    33  import { hello1, hello2 } from './util1';
    34  hello1();
    35  hello2();
    36  -- assets/js/util1.js --
    37  import { hello3 } from './util2';
    38  export function hello1() {
    39  	return 'abcd';
    40  }
    41  export function hello2() {
    42  	return hello3();
    43  }
    44  -- assets/js/util2.js --
    45  export function hello3() {
    46  	return 'efgh';
    47  }
    48  -- layouts/index.html --
    49  {{ $js := resources.Get "js/main.js" | js.Build }}
    50  JS Content:{{ $js.Content }}:End:
    51  	
    52  			`
    53  
    54  	c.Run("Basic", func(c *qt.C) {
    55  		b := hugolib.NewIntegrationTestBuilder(hugolib.IntegrationTestConfig{T: c, NeedsOsFS: true, TxtarString: mainWithImport}).Build()
    56  
    57  		b.AssertFileContent("public/index.html", `abcd`)
    58  	})
    59  
    60  	c.Run("Edit Import", func(c *qt.C) {
    61  		b := hugolib.NewIntegrationTestBuilder(hugolib.IntegrationTestConfig{T: c, Running: true, NeedsOsFS: true, TxtarString: mainWithImport}).Build()
    62  
    63  		b.AssertFileContent("public/index.html", `abcd`)
    64  		b.EditFileReplace("assets/js/util1.js", func(s string) string { return strings.ReplaceAll(s, "abcd", "1234") }).Build()
    65  		b.AssertFileContent("public/index.html", `1234`)
    66  	})
    67  
    68  	c.Run("Edit Import Nested", func(c *qt.C) {
    69  		b := hugolib.NewIntegrationTestBuilder(hugolib.IntegrationTestConfig{T: c, Running: true, NeedsOsFS: true, TxtarString: mainWithImport}).Build()
    70  
    71  		b.AssertFileContent("public/index.html", `efgh`)
    72  		b.EditFileReplace("assets/js/util2.js", func(s string) string { return strings.ReplaceAll(s, "efgh", "1234") }).Build()
    73  		b.AssertFileContent("public/index.html", `1234`)
    74  	})
    75  }
    76  
    77  func TestBuildWithModAndNpm(t *testing.T) {
    78  	if !htesting.IsCI() {
    79  		t.Skip("skip (relative) long running modules test when running locally")
    80  	}
    81  
    82  	c := qt.New(t)
    83  
    84  	files := `
    85  -- config.toml --
    86  baseURL = "https://example.org"
    87  disableKinds=["page", "section", "taxonomy", "term", "sitemap", "robotsTXT"]
    88  [module]
    89  [[module.imports]]
    90  path="github.com/gohugoio/hugoTestProjectJSModImports"
    91  -- go.mod --
    92  module github.com/gohugoio/tests/testHugoModules
    93  		
    94  go 1.16
    95  		
    96  require github.com/gohugoio/hugoTestProjectJSModImports v0.9.0 // indirect
    97  -- package.json --
    98  {
    99  	"dependencies": {
   100  	"date-fns": "^2.16.1"
   101  	}
   102  }
   103  	
   104  `
   105  	b := hugolib.NewIntegrationTestBuilder(
   106  		hugolib.IntegrationTestConfig{
   107  			T:               c,
   108  			NeedsOsFS:       true,
   109  			NeedsNpmInstall: true,
   110  			TxtarString:     files,
   111  			Verbose:         true,
   112  		}).Build()
   113  
   114  	b.AssertFileContent("public/js/main.js", `
   115  greeting: "greeting configured in mod2"
   116  Hello1 from mod1: $
   117  return "Hello2 from mod1";
   118  var Hugo = "Rocks!";
   119  Hello3 from mod2. Date from date-fns: ${today}
   120  Hello from lib in the main project
   121  Hello5 from mod2.
   122  var myparam = "Hugo Rocks!";
   123  shim cwd
   124  `)
   125  
   126  	// React JSX, verify the shimming.
   127  	b.AssertFileContent("public/js/like.js", filepath.FromSlash(`@v0.9.0/assets/js/shims/react.js
   128  module.exports = window.ReactDOM;
   129  `))
   130  }
   131  
   132  func TestBuildWithNpm(t *testing.T) {
   133  	if !htesting.IsCI() {
   134  		t.Skip("skip (relative) long running modules test when running locally")
   135  	}
   136  
   137  	c := qt.New(t)
   138  
   139  	files := `
   140  -- assets/js/included.js --
   141  console.log("included");
   142  -- assets/js/main.js --
   143  import "./included";
   144  	import { toCamelCase } from "to-camel-case";
   145  	
   146  	console.log("main");
   147  	console.log("To camel:", toCamelCase("space case"));
   148  -- assets/js/myjsx.jsx --
   149  import * as React from 'react'
   150  import * as ReactDOM from 'react-dom'
   151  
   152  	ReactDOM.render(
   153  	<h1>Hello, world!</h1>,
   154  	document.getElementById('root')
   155  	);
   156  -- assets/js/myts.ts --
   157  function greeter(person: string) {
   158  	return "Hello, " + person;
   159  }
   160  let user = [0, 1, 2];
   161  document.body.textContent = greeter(user);
   162  -- config.toml --
   163  disablekinds = ['taxonomy', 'term', 'page']
   164  -- content/p1.md --
   165  Content.
   166  -- data/hugo.toml --
   167  slogan = "Hugo Rocks!"
   168  -- i18n/en.yaml --
   169  hello:
   170     other: "Hello"
   171  -- i18n/fr.yaml --
   172  hello:
   173     other: "Bonjour"
   174  -- layouts/index.html --
   175  {{ $options := dict "minify" false "externals" (slice "react" "react-dom") }}
   176  {{ $js := resources.Get "js/main.js" | js.Build $options }}
   177  JS:  {{ template "print" $js }}
   178  {{ $jsx := resources.Get "js/myjsx.jsx" | js.Build $options }}
   179  JSX: {{ template "print" $jsx }}
   180  {{ $ts := resources.Get "js/myts.ts" | js.Build (dict "sourcemap" "inline")}}
   181  TS: {{ template "print" $ts }}
   182  {{ $ts2 := resources.Get "js/myts.ts" | js.Build (dict "sourcemap" "external" "TargetPath" "js/myts2.js")}}
   183  TS2: {{ template "print" $ts2 }}
   184  {{ define "print" }}RelPermalink: {{.RelPermalink}}|MIME: {{ .MediaType }}|Content: {{ .Content | safeJS }}{{ end }}
   185  -- package.json --
   186  {
   187  	"scripts": {},
   188  
   189  	"dependencies": {
   190  	"to-camel-case": "1.0.0"
   191  	}
   192  }
   193  `
   194  
   195  	b := hugolib.NewIntegrationTestBuilder(
   196  		hugolib.IntegrationTestConfig{
   197  			T:               c,
   198  			NeedsOsFS:       true,
   199  			NeedsNpmInstall: true,
   200  			TxtarString:     files,
   201  		}).Build()
   202  
   203  	b.AssertFileContent("public/js/myts.js", `//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJz`)
   204  	b.AssertFileContent("public/js/myts2.js.map", `"version": 3,`)
   205  	b.AssertFileContent("public/index.html", `
   206  		console.log(&#34;included&#34;);
   207  		if (hasSpace.test(string))
   208  		var React = __toESM(__require(&#34;react&#34;));
   209  		function greeter(person) {
   210  `)
   211  }