diff --git a/resources/resource_transformers/postcss/integration_test.go b/resources/resource_transformers/postcss/integration_test.go index 5bb1a9ffe..c748f036b 100644 --- a/resources/resource_transformers/postcss/integration_test.go +++ b/resources/resource_transformers/postcss/integration_test.go @@ -22,19 +22,15 @@ import ( jww "github.com/spf13/jwalterweatherman" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/common/herrors" "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugolib" ) -func TestTransformPostCSS(t *testing.T) { - if !htesting.IsCI() { - t.Skip("Skip long running test when running locally") - } - - c := qt.New(t) - - files := ` +const postCSSIntegrationTestFiles = ` -- assets/css/components/a.css -- +/* A comment. */ +/* Another comment. */ class-in-a { color: blue; } @@ -98,51 +94,57 @@ module.exports = { ` - c.Run("Success", func(c *qt.C) { - b := hugolib.NewIntegrationTestBuilder( - hugolib.IntegrationTestConfig{ - T: c, - NeedsOsFS: true, - NeedsNpmInstall: true, - LogLevel: jww.LevelInfo, - TxtarString: files, - }).Build() +func TestTransformPostCSS(t *testing.T) { + if !htesting.IsCI() { + t.Skip("Skip long running test when running locally") + } - b.AssertLogContains("Hugo Environment: production") - b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("PostCSS Config File: %s/postcss.config.js", b.Cfg.WorkingDir))) - b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("package.json: %s/package.json", b.Cfg.WorkingDir))) - - b.AssertFileContent("public/index.html", ` -Styles RelPermalink: /css/styles.css -Styles Content: Len: 770875| -`) - }) - - c.Run("Error", func(c *qt.C) { - s, err := hugolib.NewIntegrationTestBuilder( - hugolib.IntegrationTestConfig{ - T: c, - NeedsOsFS: true, - NeedsNpmInstall: true, - TxtarString: strings.ReplaceAll(files, "color: blue;", "@apply foo;"), // Syntax error - }).BuildE() - s.AssertIsFileError(err) - }) -} - -// bookmark2 -func TestIntegrationTestTemplate(t *testing.T) { c := qt.New(t) - files := `` - b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{ T: c, - NeedsOsFS: false, - NeedsNpmInstall: false, - TxtarString: files, + NeedsOsFS: true, + NeedsNpmInstall: true, + LogLevel: jww.LevelInfo, + TxtarString: postCSSIntegrationTestFiles, }).Build() - b.Assert(true, qt.IsTrue) + b.AssertLogContains("Hugo Environment: production") + b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("PostCSS Config File: %s/postcss.config.js", b.Cfg.WorkingDir))) + b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("package.json: %s/package.json", b.Cfg.WorkingDir))) + + b.AssertFileContent("public/index.html", ` +Styles RelPermalink: /css/styles.css +Styles Content: Len: 770875| +`) + +} + +// 9880 +func TestTransformPostCSSError(t *testing.T) { + if !htesting.IsCI() { + t.Skip("Skip long running test when running locally") + } + + c := qt.New(t) + + s, err := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: c, + NeedsOsFS: true, + NeedsNpmInstall: true, + TxtarString: strings.ReplaceAll(postCSSIntegrationTestFiles, "color: blue;", "@apply foo;"), // Syntax error + }).BuildE() + + s.AssertIsFileError(err) + fe := herrors.UnwrapFileError(err) + pos := fe.Position() + c.Assert(strings.TrimPrefix(pos.Filename, s.H.WorkingDir), qt.Equals, filepath.FromSlash("/assets/css/components/a.css")) + c.Assert(pos.LineNumber, qt.Equals, 4) + errctx := fe.ErrorContext() + c.Assert(errctx, qt.IsNotNil) + c.Assert(errctx.Lines, qt.DeepEquals, []string{"/* Another comment. */", "class-in-a {", "\t@apply foo;", "}", ""}) + c.Assert(errctx.ChromaLexer, qt.Equals, "css") + } diff --git a/resources/resource_transformers/postcss/postcss.go b/resources/resource_transformers/postcss/postcss.go index 733c958cf..dd7ad1418 100644 --- a/resources/resource_transformers/postcss/postcss.go +++ b/resources/resource_transformers/postcss/postcss.go @@ -28,6 +28,7 @@ import ( "github.com/gohugoio/hugo/common/collections" "github.com/gohugoio/hugo/common/hexec" + "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/common/hugo" @@ -39,8 +40,6 @@ import ( "errors" - "github.com/gohugoio/hugo/hugofs" - "github.com/mitchellh/mapstructure" "github.com/gohugoio/hugo/common/herrors" @@ -391,8 +390,19 @@ func (imp *importResolver) toFileError(output string) error { return inErr } - realFilename := fi.(hugofs.FileMetaInfo).Meta().Filename + meta := fi.(hugofs.FileMetaInfo).Meta() + realFilename := meta.Filename + f, err := meta.Open() + if err != nil { + return inErr + } + defer f.Close() - return herrors.NewFileErrorFromFile(inErr, file.Filename, realFilename, hugofs.Os, herrors.SimpleLineMatcher) + ferr := herrors.NewFileError(realFilename, inErr) + pos := ferr.Position() + pos.LineNumber = file.Offset + 1 + return ferr.UpdatePosition(pos).UpdateContent(f, nil) + + //return herrors.NewFileErrorFromFile(inErr, file.Filename, realFilename, hugofs.Os, herrors.SimpleLineMatcher) }