@@ -430,6 +430,24 @@ func CloneTokensWithImportRecords(
430430 return tokensOut , importRecordsOut
431431}
432432
433+ func CloneMediaQueriesWithImportRecords (
434+ queriesIn []MediaQuery , importRecordsIn []ast.ImportRecord ,
435+ queriesOut []MediaQuery , importRecordsOut []ast.ImportRecord ,
436+ ) ([]MediaQuery , []ast.ImportRecord ) {
437+ // Preallocate the output array if we can
438+ if queriesOut == nil {
439+ queriesOut = make ([]MediaQuery , 0 , len (queriesIn ))
440+ }
441+
442+ // Recursively clone each query
443+ for _ , query := range queriesIn {
444+ query .Data , importRecordsOut = query .Data .CloneWithImportRecords (importRecordsIn , importRecordsOut )
445+ queriesOut = append (queriesOut , query )
446+ }
447+
448+ return queriesOut , importRecordsOut
449+ }
450+
433451type Rule struct {
434452 Data R
435453 Loc logger.Loc
@@ -495,7 +513,7 @@ type ImportConditions struct {
495513 // @import url(...) list-of-media-queries;
496514 //
497515 // From: https://developer.mozilla.org/en-US/docs/Web/CSS/@import#syntax
498- Media []Token
516+ Queries []MediaQuery
499517
500518 // These two fields will only ever have zero or one tokens. However, they are
501519 // implemented as arrays for convenience because most of esbuild's helper
@@ -508,7 +526,7 @@ func (c *ImportConditions) CloneWithImportRecords(importRecordsIn []ast.ImportRe
508526 result := ImportConditions {}
509527 result .Layers , importRecordsOut = CloneTokensWithImportRecords (c .Layers , importRecordsIn , nil , importRecordsOut )
510528 result .Supports , importRecordsOut = CloneTokensWithImportRecords (c .Supports , importRecordsIn , nil , importRecordsOut )
511- result .Media , importRecordsOut = CloneTokensWithImportRecords (c .Media , importRecordsIn , nil , importRecordsOut )
529+ result .Queries , importRecordsOut = CloneMediaQueriesWithImportRecords (c .Queries , importRecordsIn , nil , importRecordsOut )
512530 return result , importRecordsOut
513531}
514532
@@ -754,7 +772,6 @@ func (r *RAtLayer) Hash() (uint32, bool) {
754772}
755773
756774type RAtMedia struct {
757- AtToken string
758775 Queries []MediaQuery
759776 Rules []Rule
760777 CloseBraceLoc logger.Loc
@@ -779,7 +796,9 @@ type MediaQuery struct {
779796
780797type MQ interface {
781798 Equal (query MQ , check * CrossFileEqualityCheck ) bool
799+ EqualIgnoringWhitespace (query MQ ) bool
782800 Hash () uint32
801+ CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord )
783802}
784803
785804func MediaQueriesEqual (a []MediaQuery , b []MediaQuery , check * CrossFileEqualityCheck ) bool {
@@ -794,6 +813,18 @@ func MediaQueriesEqual(a []MediaQuery, b []MediaQuery, check *CrossFileEqualityC
794813 return true
795814}
796815
816+ func MediaQueriesEqualIgnoringWhitespace (a []MediaQuery , b []MediaQuery ) bool {
817+ if len (a ) != len (b ) {
818+ return false
819+ }
820+ for i , ai := range a {
821+ if ! ai .Data .EqualIgnoringWhitespace (b [i ].Data ) {
822+ return false
823+ }
824+ }
825+ return true
826+ }
827+
797828func HashMediaQueries (hash uint32 , queries []MediaQuery ) uint32 {
798829 hash = helpers .HashCombine (hash , uint32 (len (queries )))
799830 for _ , q := range queries {
@@ -821,13 +852,26 @@ func (q *MQType) Equal(query MQ, check *CrossFileEqualityCheck) bool {
821852 return ok && q .Op == p .Op && q .Type == p .Type
822853}
823854
855+ func (q * MQType ) EqualIgnoringWhitespace (query MQ ) bool {
856+ p , ok := query .(* MQType )
857+ return ok && q .Op == p .Op && q .Type == p .Type
858+ }
859+
824860func (q * MQType ) Hash () uint32 {
825861 hash := uint32 (0 )
826862 hash = helpers .HashCombine (hash , uint32 (q .Op ))
827863 hash = helpers .HashCombineString (hash , q .Type )
828864 return hash
829865}
830866
867+ func (q * MQType ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
868+ var andOrNull MQ
869+ if q .AndOrNull .Data != nil {
870+ andOrNull , importRecordsOut = q .AndOrNull .Data .CloneWithImportRecords (importRecordsIn , importRecordsOut )
871+ }
872+ return & MQType {Op : q .Op , Type : q .Type , AndOrNull : MediaQuery {Data : andOrNull }}, importRecordsOut
873+ }
874+
831875type MQNot struct {
832876 Inner MediaQuery
833877}
@@ -837,12 +881,22 @@ func (q *MQNot) Equal(query MQ, check *CrossFileEqualityCheck) bool {
837881 return ok && q .Inner .Data .Equal (p .Inner .Data , check )
838882}
839883
884+ func (q * MQNot ) EqualIgnoringWhitespace (query MQ ) bool {
885+ p , ok := query .(* MQNot )
886+ return ok && q .Inner .Data .EqualIgnoringWhitespace (p .Inner .Data )
887+ }
888+
840889func (q * MQNot ) Hash () uint32 {
841890 hash := uint32 (1 )
842891 hash = helpers .HashCombine (hash , q .Inner .Data .Hash ())
843892 return hash
844893}
845894
895+ func (q * MQNot ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
896+ inner , importRecordsOut := q .Inner .Data .CloneWithImportRecords (importRecordsIn , importRecordsOut )
897+ return & MQNot {Inner : MediaQuery {Data : inner }}, importRecordsOut
898+ }
899+
846900type MQBinaryOp uint8
847901
848902const (
@@ -860,28 +914,53 @@ func (q *MQBinary) Equal(query MQ, check *CrossFileEqualityCheck) bool {
860914 return ok && q .Op == p .Op && MediaQueriesEqual (q .Terms , p .Terms , check )
861915}
862916
917+ func (q * MQBinary ) EqualIgnoringWhitespace (query MQ ) bool {
918+ p , ok := query .(* MQBinary )
919+ return ok && q .Op == p .Op && MediaQueriesEqualIgnoringWhitespace (q .Terms , p .Terms )
920+ }
921+
863922func (q * MQBinary ) Hash () uint32 {
864923 hash := uint32 (2 )
865924 hash = helpers .HashCombine (hash , uint32 (q .Op ))
866925 hash = HashMediaQueries (hash , q .Terms )
867926 return hash
868927}
869928
870- type MQGeneralEnclosed struct {
929+ func (q * MQBinary ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
930+ terms := make ([]MediaQuery , 0 , len (q .Terms ))
931+ for _ , term := range q .Terms {
932+ var clone MQ
933+ clone , importRecordsOut = term .Data .CloneWithImportRecords (importRecordsIn , importRecordsOut )
934+ terms = append (terms , MediaQuery {Data : clone })
935+ }
936+ return & MQBinary {Op : q .Op , Terms : terms }, importRecordsOut
937+ }
938+
939+ type MQArbitraryTokens struct {
871940 Tokens []Token
872941}
873942
874- func (q * MQGeneralEnclosed ) Equal (query MQ , check * CrossFileEqualityCheck ) bool {
875- p , ok := query .(* MQGeneralEnclosed )
943+ func (q * MQArbitraryTokens ) Equal (query MQ , check * CrossFileEqualityCheck ) bool {
944+ p , ok := query .(* MQArbitraryTokens )
876945 return ok && TokensEqual (q .Tokens , p .Tokens , check )
877946}
878947
879- func (q * MQGeneralEnclosed ) Hash () uint32 {
948+ func (q * MQArbitraryTokens ) EqualIgnoringWhitespace (query MQ ) bool {
949+ p , ok := query .(* MQArbitraryTokens )
950+ return ok && TokensEqualIgnoringWhitespace (q .Tokens , p .Tokens )
951+ }
952+
953+ func (q * MQArbitraryTokens ) Hash () uint32 {
880954 hash := uint32 (3 )
881955 hash = HashTokens (hash , q .Tokens )
882956 return hash
883957}
884958
959+ func (q * MQArbitraryTokens ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
960+ tokens , importRecordsOut := CloneTokensWithImportRecords (q .Tokens , importRecordsIn , nil , importRecordsOut )
961+ return & MQArbitraryTokens {Tokens : tokens }, importRecordsOut
962+ }
963+
885964type MQPlainOrBoolean struct {
886965 Name string
887966 ValueOrNil []Token
@@ -892,13 +971,26 @@ func (q *MQPlainOrBoolean) Equal(query MQ, check *CrossFileEqualityCheck) bool {
892971 return ok && q .Name == p .Name && TokensEqual (q .ValueOrNil , p .ValueOrNil , check )
893972}
894973
974+ func (q * MQPlainOrBoolean ) EqualIgnoringWhitespace (query MQ ) bool {
975+ p , ok := query .(* MQPlainOrBoolean )
976+ return ok && q .Name == p .Name && TokensEqualIgnoringWhitespace (q .ValueOrNil , p .ValueOrNil )
977+ }
978+
895979func (q * MQPlainOrBoolean ) Hash () uint32 {
896980 hash := uint32 (4 )
897981 hash = helpers .HashCombineString (hash , q .Name )
898982 hash = HashTokens (hash , q .ValueOrNil )
899983 return hash
900984}
901985
986+ func (q * MQPlainOrBoolean ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
987+ var valueOrNil []Token
988+ if q .ValueOrNil != nil {
989+ valueOrNil , importRecordsOut = CloneTokensWithImportRecords (q .ValueOrNil , importRecordsIn , nil , importRecordsOut )
990+ }
991+ return & MQPlainOrBoolean {Name : q .Name , ValueOrNil : valueOrNil }, importRecordsOut
992+ }
993+
902994type MQRange struct {
903995 Before []Token
904996 Name string
@@ -914,6 +1006,12 @@ func (q *MQRange) Equal(query MQ, check *CrossFileEqualityCheck) bool {
9141006 TokensEqual (q .Before , p .Before , check ) && TokensEqual (q .After , p .After , check )
9151007}
9161008
1009+ func (q * MQRange ) EqualIgnoringWhitespace (query MQ ) bool {
1010+ p , ok := query .(* MQRange )
1011+ return ok && q .BeforeCmp == p .BeforeCmp && q .AfterCmp == p .AfterCmp && q .Name == p .Name &&
1012+ TokensEqualIgnoringWhitespace (q .Before , p .Before ) && TokensEqualIgnoringWhitespace (q .After , p .After )
1013+ }
1014+
9171015func (q * MQRange ) Hash () uint32 {
9181016 hash := uint32 (5 )
9191017 hash = HashTokens (hash , q .Before )
@@ -924,6 +1022,18 @@ func (q *MQRange) Hash() uint32 {
9241022 return hash
9251023}
9261024
1025+ func (q * MQRange ) CloneWithImportRecords (importRecordsIn []ast.ImportRecord , importRecordsOut []ast.ImportRecord ) (MQ , []ast.ImportRecord ) {
1026+ before , importRecordsOut := CloneTokensWithImportRecords (q .Before , importRecordsIn , nil , importRecordsOut )
1027+ after , importRecordsOut := CloneTokensWithImportRecords (q .After , importRecordsIn , nil , importRecordsOut )
1028+ return & MQRange {
1029+ Before : before ,
1030+ BeforeCmp : q .BeforeCmp ,
1031+ Name : q .Name ,
1032+ AfterCmp : q .AfterCmp ,
1033+ After : after ,
1034+ }, importRecordsOut
1035+ }
1036+
9271037type MQCmp uint8
9281038
9291039const (
0 commit comments