summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-06-08 16:29:04 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-06-12 13:47:38 +0200
commitf210188da3ce901d7bdef095c2021f8365bf11e4 (patch)
tree7ad37a4f91c2486e6adc99b285552dc1f42a4774 /common
parentc782ebd89c4e40f9c7ce363359efc64e8355ad17 (diff)
Upgrade to v2 of the Dart Sass Embedded Protocol
Fixes #11059
Diffstat (limited to 'common')
-rw-r--r--common/herrors/file_error.go14
-rw-r--r--common/hugo/hugo.go56
2 files changed, 62 insertions, 8 deletions
diff --git a/common/herrors/file_error.go b/common/herrors/file_error.go
index 30417897f..ae86a700c 100644
--- a/common/herrors/file_error.go
+++ b/common/herrors/file_error.go
@@ -15,11 +15,14 @@ package herrors
import (
"encoding/json"
+
+ godartsassv1 "github.com/bep/godartsass"
+
"fmt"
"io"
"path/filepath"
- "github.com/bep/godartsass"
+ "github.com/bep/godartsass/v2"
"github.com/bep/golibsass/libsass/libsasserrors"
"github.com/gohugoio/hugo/common/paths"
"github.com/gohugoio/hugo/common/text"
@@ -145,6 +148,8 @@ func (e *fileError) causeString() string {
// Avoid repeating the file info in the error message.
case godartsass.SassError:
return v.Message
+ case godartsassv1.SassError:
+ return v.Message
case libsasserrors.Error:
return v.Message
default:
@@ -385,6 +390,13 @@ func extractPosition(e error) (pos text.Position) {
pos.Filename = filename
pos.Offset = start.Offset
pos.ColumnNumber = start.Column
+ case godartsassv1.SassError:
+ span := v.Span
+ start := span.Start
+ filename, _ := paths.UrlToFilename(span.Url)
+ pos.Filename = filename
+ pos.Offset = start.Offset
+ pos.ColumnNumber = start.Column
case libsasserrors.Error:
pos.Filename = v.File
pos.LineNumber = v.Line
diff --git a/common/hugo/hugo.go b/common/hugo/hugo.go
index 4769852a0..c28dd0b53 100644
--- a/common/hugo/hugo.go
+++ b/common/hugo/hugo.go
@@ -22,9 +22,13 @@ import (
"sort"
"strings"
"sync"
+
+ godartsassv1 "github.com/bep/godartsass"
+ "github.com/mitchellh/mapstructure"
+
"time"
- "github.com/bep/godartsass"
+ "github.com/bep/godartsass/v2"
"github.com/gohugoio/hugo/common/hexec"
"github.com/gohugoio/hugo/hugofs/files"
@@ -238,7 +242,10 @@ func GetDependencyListNonGo() []string {
}
if dartSass := dartSassVersion(); dartSass.ProtocolVersion != "" {
- const dartSassPath = "github.com/sass/dart-sass-embedded"
+ var dartSassPath = "github.com/sass/dart-sass-embedded"
+ if IsDartSassV2() {
+ dartSassPath = "github.com/sass/dart-sass"
+ }
deps = append(deps,
formatDep(dartSassPath+"/protocol", dartSass.ProtocolVersion),
formatDep(dartSassPath+"/compiler", dartSass.CompilerVersion),
@@ -283,11 +290,46 @@ type Dependency struct {
}
func dartSassVersion() godartsass.DartSassVersion {
- // This is also duplicated in the dartsass package.
- const dartSassEmbeddedBinaryName = "dart-sass-embedded"
- if !hexec.InPath(dartSassEmbeddedBinaryName) {
+ if DartSassBinaryName == "" {
return godartsass.DartSassVersion{}
}
- v, _ := godartsass.Version(dartSassEmbeddedBinaryName)
- return v
+ if IsDartSassV2() {
+ v, _ := godartsass.Version(DartSassBinaryName)
+ return v
+ }
+
+ v, _ := godartsassv1.Version(DartSassBinaryName)
+ var vv godartsass.DartSassVersion
+ mapstructure.WeakDecode(v, &vv)
+ return vv
+}
+
+// DartSassBinaryName is the name of the Dart Sass binary to use.
+// TODO(beop) find a better place for this.
+var DartSassBinaryName string
+
+func init() {
+ DartSassBinaryName = os.Getenv("DART_SASS_BINARY")
+ if DartSassBinaryName == "" {
+ for _, name := range dartSassBinaryNamesV2 {
+ if hexec.InPath(name) {
+ DartSassBinaryName = name
+ break
+ }
+ }
+ if DartSassBinaryName == "" {
+ if hexec.InPath(dartSassBinaryNameV1) {
+ DartSassBinaryName = dartSassBinaryNameV1
+ }
+ }
+ }
+}
+
+var (
+ dartSassBinaryNameV1 = "dart-sass-embedded"
+ dartSassBinaryNamesV2 = []string{"dart-sass", "sass"}
+)
+
+func IsDartSassV2() bool {
+ return !strings.Contains(DartSassBinaryName, "embedded")
}