mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -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"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/resources/internal"
|
"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"
|
"github.com/spf13/afero"
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ func (t *transform) Transform(ctx *resources.ResourceTransformationCtx) error {
|
||||||
c: t.c,
|
c: t.c,
|
||||||
dependencyManager: ctx.DependencyManager,
|
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),
|
OutputStyle: godartsass.ParseOutputStyle(opts.OutputStyle),
|
||||||
EnableSourceMap: opts.EnableSourceMap,
|
EnableSourceMap: opts.EnableSourceMap,
|
||||||
|
|
|
@ -24,9 +24,14 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HugoVarsNamespace = "hugo:vars"
|
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 {
|
if vars == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -49,12 +54,22 @@ func CreateVarsStyleSheet(vars map[string]any) string {
|
||||||
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: %v;", prefix, k, v))
|
varsSlice = append(varsSlice, fmt.Sprintf("%s%s: %v;", prefix, k, v))
|
||||||
} else {
|
} else {
|
||||||
// unquote will preserve quotes around URLs etc. if needed.
|
// 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)
|
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
|
return varsStylesheet
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ import (
|
||||||
"github.com/gohugoio/hugo/identity"
|
"github.com/gohugoio/hugo/identity"
|
||||||
"github.com/gohugoio/hugo/media"
|
"github.com/gohugoio/hugo/media"
|
||||||
"github.com/gohugoio/hugo/resources"
|
"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.
|
// 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 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.
|
// 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/babel"
|
||||||
"github.com/gohugoio/hugo/resources/resource_transformers/cssjs"
|
"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/dartsass"
|
||||||
|
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass"
|
||||||
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss"
|
"github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss"
|
||||||
"github.com/gohugoio/hugo/tpl/internal"
|
"github.com/gohugoio/hugo/tpl/internal"
|
||||||
"github.com/gohugoio/hugo/tpl/internal/resourcehelpers"
|
"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")
|
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 (
|
var (
|
||||||
r resources.ResourceTransformer
|
r resources.ResourceTransformer
|
||||||
m map[string]any
|
m map[string]any
|
||||||
targetPath string
|
targetPath string
|
||||||
err error
|
err error
|
||||||
ok bool
|
ok bool
|
||||||
transpiler = transpilerLibSass
|
transpiler = sass.TranspilerLibSass
|
||||||
)
|
)
|
||||||
|
|
||||||
r, targetPath, ok = resourcehelpers.ResolveIfFirstArgIsString(args)
|
r, targetPath, ok = resourcehelpers.ResolveIfFirstArgIsString(args)
|
||||||
|
@ -113,15 +106,15 @@ func (ns *Namespace) Sass(args ...any) (resource.Resource, error) {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
if t, _, found := maps.LookupEqualFold(m, "transpiler"); found {
|
if t, _, found := maps.LookupEqualFold(m, "transpiler"); found {
|
||||||
switch t {
|
switch t {
|
||||||
case transpilerDart, transpilerLibSass:
|
case sass.TranspilerDart, sass.TranspilerLibSass:
|
||||||
transpiler = cast.ToString(t)
|
transpiler = cast.ToString(t)
|
||||||
default:
|
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
|
var options scss.Options
|
||||||
if targetPath != "" {
|
if targetPath != "" {
|
||||||
options.TargetPath = paths.ToSlashTrimLeading(targetPath)
|
options.TargetPath = paths.ToSlashTrimLeading(targetPath)
|
||||||
|
|
|
@ -18,6 +18,8 @@ import (
|
||||||
|
|
||||||
qt "github.com/frankban/quicktest"
|
qt "github.com/frankban/quicktest"
|
||||||
"github.com/gohugoio/hugo/hugolib"
|
"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) {
|
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/b.txt", "I am b.txt")
|
||||||
b.AssertFileContent("public/files/C.txt", "I am C.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