Skip to content
/ hugo Public
forked from gohugoio/hugo

Commit

Permalink
resources: Address Dart Sass deprecation of global built-in functions
Browse files Browse the repository at this point in the history
  • Loading branch information
jmooring committed Oct 19, 2024
1 parent e971b7d commit 9a723a2
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 19 deletions.
4 changes: 2 additions & 2 deletions resources/resource_transformers/tocss/dartsass/transform.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
"github.com/gohugoio/hugo/resources"

"github.com/gohugoio/hugo/resources/internal"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/internal/sass"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass"

"github.com/spf13/afero"

Expand Down Expand Up @@ -85,7 +85,7 @@ func (t *transform) Transform(ctx *resources.ResourceTransformationCtx) error {
c: t.c,
dependencyManager: ctx.DependencyManager,

varsStylesheet: godartsass.Import{Content: sass.CreateVarsStyleSheet(opts.Vars)},
varsStylesheet: godartsass.Import{Content: sass.CreateVarsStyleSheet(sass.TranspilerDart, opts.Vars)},
},
OutputStyle: godartsass.ParseOutputStyle(opts.OutputStyle),
EnableSourceMap: opts.EnableSourceMap,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,14 @@ import (

const (
HugoVarsNamespace = "hugo:vars"
// Transpiler implementation can be controlled from the client by
// setting the 'transpiler' option.
// Default is currently 'libsass', but that may change.
TranspilerDart = "dartsass"
TranspilerLibSass = "libsass"
)

func CreateVarsStyleSheet(vars map[string]any) string {
func CreateVarsStyleSheet(transpiler string, vars map[string]any) string {
if vars == nil {
return ""
}
Expand All @@ -49,12 +54,22 @@ func CreateVarsStyleSheet(vars map[string]any) string {
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: %v;", prefix, k, v))
} else {
// unquote will preserve quotes around URLs etc. if needed.
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: unquote(%q);", prefix, k, v))
if transpiler == TranspilerDart {
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: string.unquote(%q);", prefix, k, v))
} else {
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: unquote(%q);", prefix, k, v))
}
}
}
}
sort.Strings(varsSlice)
varsStylesheet = strings.Join(varsSlice, "\n")

if transpiler == TranspilerDart {
varsStylesheet = `@use "sass:string";` + "\n" + strings.Join(varsSlice, "\n")
} else {
varsStylesheet = strings.Join(varsSlice, "\n")
}

return varsStylesheet
}

Expand Down
4 changes: 2 additions & 2 deletions resources/resource_transformers/tocss/scss/tocss.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import (
"github.com/gohugoio/hugo/identity"
"github.com/gohugoio/hugo/media"
"github.com/gohugoio/hugo/resources"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/internal/sass"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass"
)

// Used in tests. This feature requires Hugo to be built with the extended tag.
Expand Down Expand Up @@ -64,7 +64,7 @@ func (t *toCSSTransformation) Transform(ctx *resources.ResourceTransformationCtx
}
}

varsStylesheet := sass.CreateVarsStyleSheet(options.from.Vars)
varsStylesheet := sass.CreateVarsStyleSheet(sass.TranspilerLibSass, options.from.Vars)

// To allow for overrides of SCSS files anywhere in the project/theme hierarchy, we need
// to help libsass revolve the filename by looking in the composite filesystem first.
Expand Down
17 changes: 5 additions & 12 deletions tpl/css/css.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/gohugoio/hugo/resources/resource_transformers/babel"
"github.com/gohugoio/hugo/resources/resource_transformers/cssjs"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/dartsass"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss"
"github.com/gohugoio/hugo/tpl/internal"
"github.com/gohugoio/hugo/tpl/internal/resourcehelpers"
Expand Down Expand Up @@ -84,21 +85,13 @@ func (ns *Namespace) Sass(args ...any) (resource.Resource, error) {
return nil, errors.New("must not provide more arguments than resource object and options")
}

const (
// Transpiler implementation can be controlled from the client by
// setting the 'transpiler' option.
// Default is currently 'libsass', but that may change.
transpilerDart = "dartsass"
transpilerLibSass = "libsass"
)

var (
r resources.ResourceTransformer
m map[string]any
targetPath string
err error
ok bool
transpiler = transpilerLibSass
transpiler = sass.TranspilerLibSass
)

r, targetPath, ok = resourcehelpers.ResolveIfFirstArgIsString(args)
Expand All @@ -113,15 +106,15 @@ func (ns *Namespace) Sass(args ...any) (resource.Resource, error) {
if m != nil {
if t, _, found := maps.LookupEqualFold(m, "transpiler"); found {
switch t {
case transpilerDart, transpilerLibSass:
case sass.TranspilerDart, sass.TranspilerLibSass:
transpiler = cast.ToString(t)
default:
return nil, fmt.Errorf("unsupported transpiler %q; valid values are %q or %q", t, transpilerLibSass, transpilerDart)
return nil, fmt.Errorf("unsupported transpiler %q; valid values are %q or %q", t, sass.TranspilerLibSass, sass.TranspilerDart)
}
}
}

if transpiler == transpilerLibSass {
if transpiler == sass.TranspilerLibSass {
var options scss.Options
if targetPath != "" {
options.TargetPath = paths.ToSlashTrimLeading(targetPath)
Expand Down
44 changes: 44 additions & 0 deletions tpl/resources/resources_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import (

qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/hugolib"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/dartsass"
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss"
)

func TestCopy(t *testing.T) {
Expand Down Expand Up @@ -238,3 +240,45 @@ match /files/C*: 2|
b.AssertFileContent("public/files/b.txt", "I am b.txt")
b.AssertFileContent("public/files/C.txt", "I am C.txt")
}

// Issue #12961
func TestDartSassVars(t *testing.T) {
t.Parallel()

if !scss.Supports() || !dartsass.Supports() {
t.Skip()
}

files := `
-- hugo.toml --
disableKinds = ['page','section','rss','sitemap','taxonomy','term']
-- layouts/index.html --
{{ $opts := dict "transpiler" "dartsass" "outputStyle" "compressed" "vars" (dict "color" "red") }}
{{ with resources.Get "dartsass.scss" | css.Sass $opts }}
{{ .Content }}
{{ end }}
{{ $opts := dict "transpiler" "libsass" "outputStyle" "compressed" "vars" (dict "color" "blue") }}
{{ with resources.Get "libsass.scss" | css.Sass $opts }}
{{ .Content }}
{{ end }}
-- assets/dartsass.scss --
@use "hugo:vars" as v;
.dartsass {
color: v.$color;
}
-- assets/libsass.scss --
@import "hugo:vars";
.libsass {
color: $color;
}
`

b := hugolib.Test(t, files, hugolib.TestOptWarn())

b.AssertFileContent("public/index.html",
".dartsass{color:red}",
".libsass{color:blue}",
)
b.AssertLogContains("! WARN Dart Sass: hugo:vars")
}

0 comments on commit 9a723a2

Please sign in to comment.