mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-30 22:39:58 +02:00
@@ -47,6 +47,7 @@ func (c *Client) ToCSS(res resources.ResourceTransformer, opts Options) (resourc
|
||||
}
|
||||
|
||||
return res.Transform(&toCSSTransformation{c: c, options: internalOptions})
|
||||
|
||||
}
|
||||
|
||||
type toCSSTransformation struct {
|
||||
|
@@ -14,6 +14,8 @@
|
||||
package scss_test
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
qt "github.com/frankban/quicktest"
|
||||
@@ -133,7 +135,7 @@ moo {
|
||||
-- config.toml --
|
||||
theme = 'mytheme'
|
||||
-- layouts/index.html --
|
||||
{{ $cssOpts := (dict "includePaths" (slice "node_modules/foo" ) "transpiler" "dartsass" ) }}
|
||||
{{ $cssOpts := (dict "includePaths" (slice "node_modules/foo" ) ) }}
|
||||
{{ $r := resources.Get "scss/main.scss" | toCSS $cssOpts | minify }}
|
||||
T1: {{ $r.Content }}
|
||||
-- themes/mytheme/assets/scss/components/_boo.scss --
|
||||
@@ -171,3 +173,75 @@ zoo {
|
||||
|
||||
b.AssertFileContent("public/index.html", `T1: moo{color:#ccc}boo{color:green}zoo{color:pink}`)
|
||||
}
|
||||
|
||||
func TestTransformErrors(t *testing.T) {
|
||||
if !scss.Supports() {
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
c := qt.New(t)
|
||||
|
||||
const filesTemplate = `
|
||||
-- config.toml --
|
||||
theme = 'mytheme'
|
||||
-- assets/scss/components/_foo.scss --
|
||||
/* comment line 1 */
|
||||
$foocolor: #ccc;
|
||||
|
||||
foo {
|
||||
color: $foocolor;
|
||||
}
|
||||
-- themes/mytheme/assets/scss/main.scss --
|
||||
/* comment line 1 */
|
||||
/* comment line 2 */
|
||||
@import "components/foo";
|
||||
/* comment line 4 */
|
||||
|
||||
$maincolor: #eee;
|
||||
|
||||
body {
|
||||
color: $maincolor;
|
||||
}
|
||||
|
||||
-- layouts/index.html --
|
||||
{{ $cssOpts := dict }}
|
||||
{{ $r := resources.Get "scss/main.scss" | toCSS $cssOpts | minify }}
|
||||
T1: {{ $r.Content }}
|
||||
|
||||
`
|
||||
|
||||
c.Run("error in main", func(c *qt.C) {
|
||||
b, err := hugolib.NewIntegrationTestBuilder(
|
||||
hugolib.IntegrationTestConfig{
|
||||
T: c,
|
||||
TxtarString: strings.Replace(filesTemplate, "$maincolor: #eee;", "$maincolor #eee;", 1),
|
||||
NeedsOsFS: true,
|
||||
}).BuildE()
|
||||
|
||||
b.Assert(err, qt.IsNotNil)
|
||||
b.Assert(err.Error(), qt.Contains, filepath.FromSlash(`themes/mytheme/assets/scss/main.scss:6:1": expected ':' after $maincolor in assignment statement`))
|
||||
fe := b.AssertIsFileError(err)
|
||||
b.Assert(fe.ErrorContext(), qt.IsNotNil)
|
||||
b.Assert(fe.ErrorContext().Lines, qt.DeepEquals, []string{"/* comment line 4 */", "", "$maincolor #eee;", "", "body {"})
|
||||
b.Assert(fe.ErrorContext().ChromaLexer, qt.Equals, "scss")
|
||||
|
||||
})
|
||||
|
||||
c.Run("error in import", func(c *qt.C) {
|
||||
b, err := hugolib.NewIntegrationTestBuilder(
|
||||
hugolib.IntegrationTestConfig{
|
||||
T: c,
|
||||
TxtarString: strings.Replace(filesTemplate, "$foocolor: #ccc;", "$foocolor #ccc;", 1),
|
||||
NeedsOsFS: true,
|
||||
}).BuildE()
|
||||
|
||||
b.Assert(err, qt.IsNotNil)
|
||||
b.Assert(err.Error(), qt.Contains, filepath.FromSlash(`assets/scss/components/_foo.scss:2:1": expected ':' after $foocolor in assignment statement`))
|
||||
fe := b.AssertIsFileError(err)
|
||||
b.Assert(fe.ErrorContext(), qt.IsNotNil)
|
||||
b.Assert(fe.ErrorContext().Lines, qt.DeepEquals, []string{"/* comment line 1 */", "$foocolor #ccc;", "", "foo {"})
|
||||
b.Assert(fe.ErrorContext().ChromaLexer, qt.Equals, "scss")
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
@@ -20,10 +20,13 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"path"
|
||||
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/bep/golibsass/libsass"
|
||||
"github.com/bep/golibsass/libsass/libsasserrors"
|
||||
"github.com/gohugoio/hugo/common/herrors"
|
||||
"github.com/gohugoio/hugo/helpers"
|
||||
"github.com/gohugoio/hugo/hugofs"
|
||||
"github.com/gohugoio/hugo/media"
|
||||
@@ -136,7 +139,14 @@ func (t *toCSSTransformation) Transform(ctx *resources.ResourceTransformationCtx
|
||||
|
||||
res, err := t.c.toCSS(options.to, ctx.To, ctx.From)
|
||||
if err != nil {
|
||||
return err
|
||||
if sasserr, ok := err.(libsasserrors.Error); ok {
|
||||
if sasserr.File == "stdin" && ctx.SourcePath != "" {
|
||||
sasserr.File = t.c.sfs.RealFilename(ctx.SourcePath)
|
||||
err = sasserr
|
||||
}
|
||||
}
|
||||
return herrors.NewFileErrorFromFileInErr(err, hugofs.Os, nil)
|
||||
|
||||
}
|
||||
|
||||
if options.from.EnableSourceMap && res.SourceMapContent != "" {
|
||||
@@ -180,7 +190,7 @@ func (c *Client) toCSS(options libsass.Options, dst io.Writer, src io.Reader) (l
|
||||
|
||||
res, err = transpiler.Execute(in)
|
||||
if err != nil {
|
||||
return res, fmt.Errorf("SCSS processing failed: %w", err)
|
||||
return res, err
|
||||
}
|
||||
|
||||
out := res.CSS
|
||||
|
Reference in New Issue
Block a user