Skip to content

Commit c73f0f8

Browse files
committed
css: extract wrapping logic to a helper function
1 parent a05a2f9 commit c73f0f8

1 file changed

Lines changed: 64 additions & 55 deletions

File tree

internal/linker/linker.go

Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5909,61 +5909,7 @@ func (c *linkerContext) generateChunkCSS(chunkIndex int, chunkWaitGroup *sync.Wa
59095909
rules = []css_ast.Rule{{Data: &css_ast.RAtLayer{Names: layers}}}
59105910
}
59115911

5912-
for i := len(entry.conditions) - 1; i >= 0; i-- {
5913-
conditions := entry.conditions[i]
5914-
5915-
// Generate "@layer" wrappers. Note that empty "@layer" rules still have
5916-
// a side effect (they set the layer order) so they cannot be removed.
5917-
for _, t := range conditions.Layers {
5918-
if len(rules) == 0 {
5919-
if t.Children == nil {
5920-
// Omit an empty "@layer {}" entirely
5921-
continue
5922-
} else {
5923-
// Generate "@layer foo;" instead of "@layer foo {}"
5924-
rules = nil
5925-
}
5926-
}
5927-
var prelude []css_ast.Token
5928-
if t.Children != nil {
5929-
prelude = *t.Children
5930-
}
5931-
prelude, ast.ImportRecords = css_ast.CloneTokensWithImportRecords(prelude, entry.conditionImportRecords, nil, ast.ImportRecords)
5932-
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
5933-
AtToken: "layer",
5934-
Prelude: prelude,
5935-
Rules: rules,
5936-
}}}
5937-
}
5938-
5939-
// Generate "@supports" wrappers. This is not done if the rule block is
5940-
// empty because empty "@supports" rules have no effect.
5941-
if len(rules) > 0 {
5942-
for _, t := range conditions.Supports {
5943-
t.Kind = css_lexer.TOpenParen
5944-
t.Text = "("
5945-
var prelude []css_ast.Token
5946-
prelude, ast.ImportRecords = css_ast.CloneTokensWithImportRecords([]css_ast.Token{t}, entry.conditionImportRecords, nil, ast.ImportRecords)
5947-
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
5948-
AtToken: "supports",
5949-
Prelude: prelude,
5950-
Rules: rules,
5951-
}}}
5952-
}
5953-
}
5954-
5955-
// Generate "@media" wrappers. This is not done if the rule block is
5956-
// empty because empty "@media" rules have no effect.
5957-
if len(rules) > 0 && len(conditions.Media) > 0 {
5958-
var prelude []css_ast.Token
5959-
prelude, ast.ImportRecords = css_ast.CloneTokensWithImportRecords(conditions.Media, entry.conditionImportRecords, nil, ast.ImportRecords)
5960-
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
5961-
AtToken: "media",
5962-
Prelude: prelude,
5963-
Rules: rules,
5964-
}}}
5965-
}
5966-
}
5912+
rules, ast.ImportRecords = wrapRulesWithConditions(rules, ast.ImportRecords, entry.conditions, entry.conditionImportRecords)
59675913

59685914
// Remove top-level duplicate rules across files
59695915
if c.options.MinifySyntax {
@@ -6253,6 +6199,69 @@ func (c *linkerContext) generateChunkCSS(chunkIndex int, chunkWaitGroup *sync.Wa
62536199
chunkWaitGroup.Done()
62546200
}
62556201

6202+
func wrapRulesWithConditions(
6203+
rules []css_ast.Rule, importRecords []ast.ImportRecord,
6204+
conditions []css_ast.ImportConditions, conditionImportRecords []ast.ImportRecord,
6205+
) ([]css_ast.Rule, []ast.ImportRecord) {
6206+
for i := len(conditions) - 1; i >= 0; i-- {
6207+
item := conditions[i]
6208+
6209+
// Generate "@layer" wrappers. Note that empty "@layer" rules still have
6210+
// a side effect (they set the layer order) so they cannot be removed.
6211+
for _, t := range item.Layers {
6212+
if len(rules) == 0 {
6213+
if t.Children == nil {
6214+
// Omit an empty "@layer {}" entirely
6215+
continue
6216+
} else {
6217+
// Generate "@layer foo;" instead of "@layer foo {}"
6218+
rules = nil
6219+
}
6220+
}
6221+
var prelude []css_ast.Token
6222+
if t.Children != nil {
6223+
prelude = *t.Children
6224+
}
6225+
prelude, importRecords = css_ast.CloneTokensWithImportRecords(prelude, conditionImportRecords, nil, importRecords)
6226+
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
6227+
AtToken: "layer",
6228+
Prelude: prelude,
6229+
Rules: rules,
6230+
}}}
6231+
}
6232+
6233+
// Generate "@supports" wrappers. This is not done if the rule block is
6234+
// empty because empty "@supports" rules have no effect.
6235+
if len(rules) > 0 {
6236+
for _, t := range item.Supports {
6237+
t.Kind = css_lexer.TOpenParen
6238+
t.Text = "("
6239+
var prelude []css_ast.Token
6240+
prelude, importRecords = css_ast.CloneTokensWithImportRecords([]css_ast.Token{t}, conditionImportRecords, nil, importRecords)
6241+
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
6242+
AtToken: "supports",
6243+
Prelude: prelude,
6244+
Rules: rules,
6245+
}}}
6246+
}
6247+
}
6248+
6249+
// Generate "@media" wrappers. This is not done if the rule block is
6250+
// empty because empty "@media" rules have no effect.
6251+
if len(rules) > 0 && len(item.Media) > 0 {
6252+
var prelude []css_ast.Token
6253+
prelude, importRecords = css_ast.CloneTokensWithImportRecords(item.Media, conditionImportRecords, nil, importRecords)
6254+
rules = []css_ast.Rule{{Data: &css_ast.RKnownAt{
6255+
AtToken: "media",
6256+
Prelude: prelude,
6257+
Rules: rules,
6258+
}}}
6259+
}
6260+
}
6261+
6262+
return rules, importRecords
6263+
}
6264+
62566265
type legalCommentEntry struct {
62576266
sourceIndex uint32
62586267
comments []string

0 commit comments

Comments
 (0)