mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
resources: Address Dart Sass deprecation of global built-in functions
See https://github.com/sass/dart-sass/releases/tag/1.80.0 Fixes #12961
This commit is contained in:
parent
72352f205a
commit
889308dd85
6 changed files with 71 additions and 19 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue