File tree Expand file tree Collapse file tree 2 files changed +70
-4
lines changed Expand file tree Collapse file tree 2 files changed +70
-4
lines changed Original file line number Diff line number Diff line change 1
1
import { bench , describe } from 'vitest'
2
- import { cloneAstNode , toCss } from './ast'
2
+ import { cloneAstNode , toCss , type AstNode } from './ast'
3
3
import * as CSS from './css-parser'
4
4
5
5
const css = String . raw
@@ -34,7 +34,31 @@ describe('Cloning AST nodes', () => {
34
34
ast . map ( cloneAstNode )
35
35
} )
36
36
37
+ bench ( 'cloneAstNode (with spread)' , ( ) => {
38
+ ast . map ( cloneAstNodeSpread )
39
+ } )
40
+
37
41
bench ( 'structuredClone()' , ( ) => {
38
42
structuredClone ( ast )
39
43
} )
40
44
} )
45
+
46
+ function cloneAstNodeSpread < T extends AstNode > ( node : T ) : T {
47
+ switch ( node . kind ) {
48
+ case 'rule' :
49
+ case 'at-rule' :
50
+ case 'at-root' :
51
+ return { ...node , nodes : node . nodes . map ( cloneAstNodeSpread ) }
52
+
53
+ case 'context' :
54
+ return { ...node , context : { ...node . context } , nodes : node . nodes . map ( cloneAstNodeSpread ) }
55
+
56
+ case 'declaration' :
57
+ case 'comment' :
58
+ return { ...node }
59
+
60
+ default :
61
+ node satisfies never
62
+ throw new Error ( `Unknown node kind: ${ ( node as any ) . kind } ` )
63
+ }
64
+ }
Original file line number Diff line number Diff line change @@ -125,16 +125,58 @@ export function atRoot(nodes: AstNode[]): AtRoot {
125
125
export function cloneAstNode < T extends AstNode > ( node : T ) : T {
126
126
switch ( node . kind ) {
127
127
case 'rule' :
128
+ return {
129
+ kind : node . kind ,
130
+ selector : node . selector ,
131
+ nodes : node . nodes . map ( cloneAstNode ) ,
132
+ src : node . src ,
133
+ dst : node . dst ,
134
+ } satisfies StyleRule as T
135
+
128
136
case 'at-rule' :
137
+ return {
138
+ kind : node . kind ,
139
+ name : node . name ,
140
+ params : node . params ,
141
+ nodes : node . nodes . map ( cloneAstNode ) ,
142
+ src : node . src ,
143
+ dst : node . dst ,
144
+ } satisfies AtRule as T
145
+
129
146
case 'at-root' :
130
- return { ...node , nodes : node . nodes . map ( cloneAstNode ) }
147
+ return {
148
+ kind : node . kind ,
149
+ nodes : node . nodes . map ( cloneAstNode ) ,
150
+ src : node . src ,
151
+ dst : node . dst ,
152
+ } satisfies AtRoot as T
131
153
132
154
case 'context' :
133
- return { ...node , context : { ...node . context } , nodes : node . nodes . map ( cloneAstNode ) }
155
+ return {
156
+ kind : node . kind ,
157
+ context : { ...node . context } ,
158
+ nodes : node . nodes . map ( cloneAstNode ) ,
159
+ src : node . src ,
160
+ dst : node . dst ,
161
+ } satisfies Context as T
134
162
135
163
case 'declaration' :
164
+ return {
165
+ kind : node . kind ,
166
+ property : node . property ,
167
+ value : node . value ,
168
+ important : node . important ,
169
+ src : node . src ,
170
+ dst : node . dst ,
171
+ } satisfies Declaration as T
172
+
136
173
case 'comment' :
137
- return { ...node }
174
+ return {
175
+ kind : node . kind ,
176
+ value : node . value ,
177
+ src : node . src ,
178
+ dst : node . dst ,
179
+ } satisfies Comment as T
138
180
139
181
default :
140
182
node satisfies never
You can’t perform that action at this time.
0 commit comments