mirror of
https://github.com/gohugoio/hugo.git
synced 2024-12-01 13:18:47 -05:00
Add safety barrier between concatenated javascript resources
This commit is contained in:
parent
8914fe7ed7
commit
35abce27ca
2 changed files with 40 additions and 3 deletions
|
@ -244,6 +244,13 @@ T2: Content: {{ $combinedText.Content }}|{{ $combinedText.RelPermalink }}
|
||||||
{{ $css := "body { color: blue; }" | resources.FromString "styles.css" }}
|
{{ $css := "body { color: blue; }" | resources.FromString "styles.css" }}
|
||||||
{{ $minified := resources.Get "css/styles1.css" | minify }}
|
{{ $minified := resources.Get "css/styles1.css" | minify }}
|
||||||
{{ slice $css $minified | resources.Concat "bundle/mixed.css" }}
|
{{ slice $css $minified | resources.Concat "bundle/mixed.css" }}
|
||||||
|
{{/* https://github.com/gohugoio/hugo/issues/5403 */}}
|
||||||
|
{{ $d := "function D {} // A comment" | resources.FromString "d.js"}}
|
||||||
|
{{ $e := "(function E {})" | resources.FromString "e.js"}}
|
||||||
|
{{ $f := "(function F {})()" | resources.FromString "f.js"}}
|
||||||
|
{{ $jsResources := .Resources.Match "*.js" }}
|
||||||
|
{{ $combinedJs := slice $d $e $f | resources.Concat "bundle/concatjs.js" }}
|
||||||
|
T3: Content: {{ $combinedJs.Content }}|{{ $combinedJs.RelPermalink }}
|
||||||
`)
|
`)
|
||||||
}, func(b *sitesBuilder) {
|
}, func(b *sitesBuilder) {
|
||||||
b.AssertFileContent("public/index.html", `T1: Content: ABC|RelPermalink: /bundle/concat.txt|Permalink: http://example.com/bundle/concat.txt|MediaType: text/plain`)
|
b.AssertFileContent("public/index.html", `T1: Content: ABC|RelPermalink: /bundle/concat.txt|Permalink: http://example.com/bundle/concat.txt|MediaType: text/plain`)
|
||||||
|
@ -251,6 +258,17 @@ T2: Content: {{ $combinedText.Content }}|{{ $combinedText.RelPermalink }}
|
||||||
|
|
||||||
b.AssertFileContent("public/index.html", `T2: Content: t1t|t2t|`)
|
b.AssertFileContent("public/index.html", `T2: Content: t1t|t2t|`)
|
||||||
b.AssertFileContent("public/bundle/concattxt.txt", "t1t|t2t|")
|
b.AssertFileContent("public/bundle/concattxt.txt", "t1t|t2t|")
|
||||||
|
|
||||||
|
b.AssertFileContent("public/index.html", `T3: Content: function D {} // A comment
|
||||||
|
;
|
||||||
|
(function E {})
|
||||||
|
;
|
||||||
|
(function F {})()|`)
|
||||||
|
b.AssertFileContent("public/bundle/concatjs.js", `function D {} // A comment
|
||||||
|
;
|
||||||
|
(function E {})
|
||||||
|
;
|
||||||
|
(function F {})()`)
|
||||||
}},
|
}},
|
||||||
{"fromstring", func() bool { return true }, func(b *sitesBuilder) {
|
{"fromstring", func() bool { return true }, func(b *sitesBuilder) {
|
||||||
b.WithTemplates("home.html", `
|
b.WithTemplates("home.html", `
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
package bundler
|
package bundler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -92,13 +93,31 @@ func (c *Client) Concat(targetPath string, r resource.Resources) (resource.Resou
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rcsources = append(rcsources, rc)
|
rcsources = append(rcsources, rc)
|
||||||
}
|
}
|
||||||
|
|
||||||
readers := make([]io.Reader, len(rcsources))
|
var readers []io.Reader
|
||||||
|
|
||||||
|
// Arbitrary JavaScript files require a barrier between them to be safely concatenated together.
|
||||||
|
// Without this, the last line of one file can affect the first line of the next file and change how both files are interpreted.
|
||||||
|
if resolvedm.MainType == media.JavascriptType.MainType && resolvedm.SubType == media.JavascriptType.SubType {
|
||||||
|
readers = make([]io.Reader, 2*len(rcsources)-1)
|
||||||
|
j := 0
|
||||||
|
for i := 0; i < len(rcsources); i++ {
|
||||||
|
if i > 0 {
|
||||||
|
readers[j] = bytes.NewBufferString("\n;\n")
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
readers[j] = rcsources[i]
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
readers = make([]io.Reader, len(rcsources))
|
||||||
for i := 0; i < len(rcsources); i++ {
|
for i := 0; i < len(rcsources); i++ {
|
||||||
readers[i] = rcsources[i]
|
readers[i] = rcsources[i]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mr := io.MultiReader(readers...)
|
mr := io.MultiReader(readers...)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue