diff options
author | Joe Mooring <[email protected]> | 2024-10-18 16:10:46 -0700 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-11-01 14:05:27 +0100 |
commit | 889308dd854b0907069d7bc6dd44ed760bc6e819 (patch) | |
tree | 71208681d828904c97b876ee517065d22d2bd002 | |
parent | 72352f205afeef8310dcc276fc7a72db311a1621 (diff) | |
download | hugo-889308dd854b0907069d7bc6dd44ed760bc6e819.tar.gz hugo-889308dd854b0907069d7bc6dd44ed760bc6e819.zip |
resources: Address Dart Sass deprecation of global built-in functions
See https://github.com/sass/dart-sass/releases/tag/1.80.0
Fixes #12961
-rw-r--r-- | resources/resource_transformers/tocss/dartsass/transform.go | 4 | ||||
-rw-r--r-- | resources/resource_transformers/tocss/sass/helpers.go (renamed from resources/resource_transformers/tocss/internal/sass/helpers.go) | 21 | ||||
-rw-r--r-- | resources/resource_transformers/tocss/sass/helpers_test.go (renamed from resources/resource_transformers/tocss/internal/sass/helpers_test.go) | 0 | ||||
-rw-r--r-- | resources/resource_transformers/tocss/scss/tocss.go | 4 | ||||
-rw-r--r-- | tpl/css/css.go | 17 | ||||
-rw-r--r-- | tpl/resources/resources_integration_test.go | 44 |
6 files changed, 71 insertions, 19 deletions
diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index f0bd6634a..d8b6ae5b4 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -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" @@ -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, diff --git a/resources/resource_transformers/tocss/internal/sass/helpers.go b/resources/resource_transformers/tocss/sass/helpers.go index c1cef141e..d4091a39c 100644 --- a/resources/resource_transformers/tocss/internal/sass/helpers.go +++ b/resources/resource_transformers/tocss/sass/helpers.go @@ -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 "" } @@ -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 } diff --git a/resources/resource_transformers/tocss/internal/sass/helpers_test.go b/resources/resource_transformers/tocss/sass/helpers_test.go index ef31fdd8f..ef31fdd8f 100644 --- a/resources/resource_transformers/tocss/internal/sass/helpers_test.go +++ b/resources/resource_transformers/tocss/sass/helpers_test.go diff --git a/resources/resource_transformers/tocss/scss/tocss.go b/resources/resource_transformers/tocss/scss/tocss.go index 36ef2a77d..4b9c51ce0 100644 --- a/resources/resource_transformers/tocss/scss/tocss.go +++ b/resources/resource_transformers/tocss/scss/tocss.go @@ -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. @@ -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. diff --git a/tpl/css/css.go b/tpl/css/css.go index 48a526c17..199deda69 100644 --- a/tpl/css/css.go +++ b/tpl/css/css.go @@ -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" @@ -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) @@ -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) diff --git a/tpl/resources/resources_integration_test.go b/tpl/resources/resources_integration_test.go index cfd03dc73..563b3c455 100644 --- a/tpl/resources/resources_integration_test.go +++ b/tpl/resources/resources_integration_test.go @@ -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) { @@ -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") +} |