@styleframe/transpiler 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.tsbuildinfo +1 -0
- package/CHANGELOG.md +12 -0
- package/package.json +43 -0
- package/src/constants.ts +4 -0
- package/src/consume/at-rule.test.ts +339 -0
- package/src/consume/at-rule.ts +34 -0
- package/src/consume/consume.test.ts +259 -0
- package/src/consume/consume.ts +60 -0
- package/src/consume/container.test.ts +501 -0
- package/src/consume/container.ts +73 -0
- package/src/consume/css.test.ts +184 -0
- package/src/consume/css.ts +17 -0
- package/src/consume/declarations.test.ts +210 -0
- package/src/consume/declarations.ts +17 -0
- package/src/consume/index.ts +12 -0
- package/src/consume/primitive.test.ts +52 -0
- package/src/consume/primitive.ts +16 -0
- package/src/consume/ref.test.ts +84 -0
- package/src/consume/ref.ts +22 -0
- package/src/consume/root.test.ts +353 -0
- package/src/consume/root.ts +19 -0
- package/src/consume/selector.test.ts +441 -0
- package/src/consume/selector.ts +17 -0
- package/src/consume/theme.test.ts +215 -0
- package/src/consume/theme.ts +15 -0
- package/src/consume/utility.test.ts +696 -0
- package/src/consume/utility.ts +31 -0
- package/src/consume/variable.test.ts +197 -0
- package/src/consume/variable.ts +20 -0
- package/src/defaults.ts +21 -0
- package/src/generator/genAtRuleQuery.test.ts +148 -0
- package/src/generator/genAtRuleQuery.ts +3 -0
- package/src/generator/genDeclaration.test.ts +283 -0
- package/src/generator/genDeclaration.ts +9 -0
- package/src/generator/genDeclarationsBlock.test.ts +278 -0
- package/src/generator/genDeclarationsBlock.ts +7 -0
- package/src/generator/genDeclareVariable.test.ts +323 -0
- package/src/generator/genDeclareVariable.ts +6 -0
- package/src/generator/genInlineAtRule.test.ts +351 -0
- package/src/generator/genInlineAtRule.ts +5 -0
- package/src/generator/genReferenceVariable.test.ts +392 -0
- package/src/generator/genReferenceVariable.ts +5 -0
- package/src/generator/genSafePropertyName.test.ts +489 -0
- package/src/generator/genSafePropertyName.ts +5 -0
- package/src/generator/genSafeVariableName.test.ts +358 -0
- package/src/generator/genSafeVariableName.ts +21 -0
- package/src/generator/genSelector.test.ts +357 -0
- package/src/generator/genSelector.ts +5 -0
- package/src/generator/index.ts +9 -0
- package/src/index.ts +6 -0
- package/src/transpile.test.ts +825 -0
- package/src/transpile.ts +21 -0
- package/src/types.ts +15 -0
- package/src/utils.ts +18 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +7 -0
- package/vite.config.ts +5 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { genSelector } from "./genSelector";
|
|
3
|
+
|
|
4
|
+
describe("genSelector", () => {
|
|
5
|
+
it("should generate a selector with empty declarations", () => {
|
|
6
|
+
const result = genSelector(".container", []);
|
|
7
|
+
expect(result).toBe(".container {}");
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("should generate a selector with a single declaration", () => {
|
|
11
|
+
const result = genSelector(".button", ["color: red;"]);
|
|
12
|
+
expect(result).toBe(".button {\n\tcolor: red;\n}");
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should generate a selector with multiple declarations", () => {
|
|
16
|
+
const result = genSelector(".card", [
|
|
17
|
+
"color: red;",
|
|
18
|
+
"background: blue;",
|
|
19
|
+
"margin: 10px;",
|
|
20
|
+
]);
|
|
21
|
+
expect(result).toBe(
|
|
22
|
+
".card {\n\tcolor: red;\n\tbackground: blue;\n\tmargin: 10px;\n}",
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should handle class selectors", () => {
|
|
27
|
+
const result = genSelector(".primary-button", ["display: inline-block;"]);
|
|
28
|
+
expect(result).toBe(".primary-button {\n\tdisplay: inline-block;\n}");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should handle id selectors", () => {
|
|
32
|
+
const result = genSelector("#header", ["height: 60px;"]);
|
|
33
|
+
expect(result).toBe("#header {\n\theight: 60px;\n}");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should handle element selectors", () => {
|
|
37
|
+
const result = genSelector("body", ["margin: 0;", "padding: 0;"]);
|
|
38
|
+
expect(result).toBe("body {\n\tmargin: 0;\n\tpadding: 0;\n}");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should handle attribute selectors", () => {
|
|
42
|
+
const result = genSelector("[type='text']", ["border: 1px solid #ccc;"]);
|
|
43
|
+
expect(result).toBe("[type='text'] {\n\tborder: 1px solid #ccc;\n}");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should handle pseudo-class selectors", () => {
|
|
47
|
+
const result = genSelector(".link:hover", ["color: blue;"]);
|
|
48
|
+
expect(result).toBe(".link:hover {\n\tcolor: blue;\n}");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should handle pseudo-element selectors", () => {
|
|
52
|
+
const result = genSelector(".text::before", ["content: '→';"]);
|
|
53
|
+
expect(result).toBe(".text::before {\n\tcontent: '→';\n}");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should handle multiple pseudo-classes", () => {
|
|
57
|
+
const result = genSelector("input:focus:valid", ["border-color: green;"]);
|
|
58
|
+
expect(result).toBe("input:focus:valid {\n\tborder-color: green;\n}");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should handle descendant combinators", () => {
|
|
62
|
+
const result = genSelector(".container .item", ["padding: 10px;"]);
|
|
63
|
+
expect(result).toBe(".container .item {\n\tpadding: 10px;\n}");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should handle child combinators", () => {
|
|
67
|
+
const result = genSelector("ul > li", ["list-style: none;"]);
|
|
68
|
+
expect(result).toBe("ul > li {\n\tlist-style: none;\n}");
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should handle adjacent sibling combinators", () => {
|
|
72
|
+
const result = genSelector("h1 + p", ["margin-top: 0;"]);
|
|
73
|
+
expect(result).toBe("h1 + p {\n\tmargin-top: 0;\n}");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should handle general sibling combinators", () => {
|
|
77
|
+
const result = genSelector("h1 ~ p", ["color: gray;"]);
|
|
78
|
+
expect(result).toBe("h1 ~ p {\n\tcolor: gray;\n}");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should handle multiple selectors", () => {
|
|
82
|
+
const result = genSelector("h1, h2, h3", ["font-family: sans-serif;"]);
|
|
83
|
+
expect(result).toBe("h1, h2, h3 {\n\tfont-family: sans-serif;\n}");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should handle universal selector", () => {
|
|
87
|
+
const result = genSelector("*", ["box-sizing: border-box;"]);
|
|
88
|
+
expect(result).toBe("* {\n\tbox-sizing: border-box;\n}");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should handle complex attribute selectors", () => {
|
|
92
|
+
const result = genSelector("[class*='btn-']", ["border-radius: 4px;"]);
|
|
93
|
+
expect(result).toBe("[class*='btn-'] {\n\tborder-radius: 4px;\n}");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("should handle :not() pseudo-class", () => {
|
|
97
|
+
const result = genSelector("input:not([type='submit'])", [
|
|
98
|
+
"background: white;",
|
|
99
|
+
]);
|
|
100
|
+
expect(result).toBe(
|
|
101
|
+
"input:not([type='submit']) {\n\tbackground: white;\n}",
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should handle :nth-child() pseudo-class", () => {
|
|
106
|
+
const result = genSelector("li:nth-child(2n)", ["background: #f0f0f0;"]);
|
|
107
|
+
expect(result).toBe("li:nth-child(2n) {\n\tbackground: #f0f0f0;\n}");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("should handle :is() pseudo-class", () => {
|
|
111
|
+
const result = genSelector(":is(h1, h2, h3)", ["margin-top: 1rem;"]);
|
|
112
|
+
expect(result).toBe(":is(h1, h2, h3) {\n\tmargin-top: 1rem;\n}");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("should handle :where() pseudo-class", () => {
|
|
116
|
+
const result = genSelector(":where(.card, .panel)", ["border: 1px solid;"]);
|
|
117
|
+
expect(result).toBe(":where(.card, .panel) {\n\tborder: 1px solid;\n}");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should handle :has() pseudo-class", () => {
|
|
121
|
+
const result = genSelector(".container:has(> img)", ["display: flex;"]);
|
|
122
|
+
expect(result).toBe(".container:has(> img) {\n\tdisplay: flex;\n}");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("should handle namespace selectors", () => {
|
|
126
|
+
const result = genSelector("svg|circle", ["fill: red;"]);
|
|
127
|
+
expect(result).toBe("svg|circle {\n\tfill: red;\n}");
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("should handle complex nested selectors", () => {
|
|
131
|
+
const result = genSelector(".container > .row .col:first-child::before", [
|
|
132
|
+
"content: '';",
|
|
133
|
+
]);
|
|
134
|
+
expect(result).toBe(
|
|
135
|
+
".container > .row .col:first-child::before {\n\tcontent: '';\n}",
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("should handle selectors with special characters", () => {
|
|
140
|
+
const result = genSelector(".btn-primary\\:hover", ["opacity: 0.8;"]);
|
|
141
|
+
expect(result).toBe(".btn-primary\\:hover {\n\topacity: 0.8;\n}");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("should handle case-sensitive attribute selectors", () => {
|
|
145
|
+
const result = genSelector("[data-state='active' s]", ["color: green;"]);
|
|
146
|
+
expect(result).toBe("[data-state='active' s] {\n\tcolor: green;\n}");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("should handle case-insensitive attribute selectors", () => {
|
|
150
|
+
const result = genSelector("[type='email' i]", [
|
|
151
|
+
"text-transform: lowercase;",
|
|
152
|
+
]);
|
|
153
|
+
expect(result).toBe("[type='email' i] {\n\ttext-transform: lowercase;\n}");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("should handle :root selector", () => {
|
|
157
|
+
const result = genSelector(":root", [
|
|
158
|
+
"--primary-color: #007bff;",
|
|
159
|
+
"--font-size: 16px;",
|
|
160
|
+
]);
|
|
161
|
+
expect(result).toBe(
|
|
162
|
+
":root {\n\t--primary-color: #007bff;\n\t--font-size: 16px;\n}",
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("should handle :host selector", () => {
|
|
167
|
+
const result = genSelector(":host", ["display: block;"]);
|
|
168
|
+
expect(result).toBe(":host {\n\tdisplay: block;\n}");
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("should handle :host() with argument", () => {
|
|
172
|
+
const result = genSelector(":host(.dark)", ["background: black;"]);
|
|
173
|
+
expect(result).toBe(":host(.dark) {\n\tbackground: black;\n}");
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("should handle ::slotted() pseudo-element", () => {
|
|
177
|
+
const result = genSelector("::slotted(span)", ["color: red;"]);
|
|
178
|
+
expect(result).toBe("::slotted(span) {\n\tcolor: red;\n}");
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("should handle :nth-of-type() pseudo-class", () => {
|
|
182
|
+
const result = genSelector("p:nth-of-type(3)", ["font-weight: bold;"]);
|
|
183
|
+
expect(result).toBe("p:nth-of-type(3) {\n\tfont-weight: bold;\n}");
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("should handle :first-child pseudo-class", () => {
|
|
187
|
+
const result = genSelector("li:first-child", ["margin-top: 0;"]);
|
|
188
|
+
expect(result).toBe("li:first-child {\n\tmargin-top: 0;\n}");
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it("should handle :last-child pseudo-class", () => {
|
|
192
|
+
const result = genSelector("li:last-child", ["margin-bottom: 0;"]);
|
|
193
|
+
expect(result).toBe("li:last-child {\n\tmargin-bottom: 0;\n}");
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("should handle :only-child pseudo-class", () => {
|
|
197
|
+
const result = genSelector(".item:only-child", ["width: 100%;"]);
|
|
198
|
+
expect(result).toBe(".item:only-child {\n\twidth: 100%;\n}");
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("should handle :empty pseudo-class", () => {
|
|
202
|
+
const result = genSelector("div:empty", ["display: none;"]);
|
|
203
|
+
expect(result).toBe("div:empty {\n\tdisplay: none;\n}");
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it("should handle :target pseudo-class", () => {
|
|
207
|
+
const result = genSelector(":target", ["background: yellow;"]);
|
|
208
|
+
expect(result).toBe(":target {\n\tbackground: yellow;\n}");
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should handle :checked pseudo-class", () => {
|
|
212
|
+
const result = genSelector("input:checked", ["opacity: 1;"]);
|
|
213
|
+
expect(result).toBe("input:checked {\n\topacity: 1;\n}");
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("should handle :disabled pseudo-class", () => {
|
|
217
|
+
const result = genSelector("button:disabled", ["cursor: not-allowed;"]);
|
|
218
|
+
expect(result).toBe("button:disabled {\n\tcursor: not-allowed;\n}");
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("should handle :enabled pseudo-class", () => {
|
|
222
|
+
const result = genSelector("input:enabled", ["background: white;"]);
|
|
223
|
+
expect(result).toBe("input:enabled {\n\tbackground: white;\n}");
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("should handle :read-only pseudo-class", () => {
|
|
227
|
+
const result = genSelector("input:read-only", ["background: #f5f5f5;"]);
|
|
228
|
+
expect(result).toBe("input:read-only {\n\tbackground: #f5f5f5;\n}");
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it("should handle :read-write pseudo-class", () => {
|
|
232
|
+
const result = genSelector("input:read-write", ["background: white;"]);
|
|
233
|
+
expect(result).toBe("input:read-write {\n\tbackground: white;\n}");
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("should handle :placeholder-shown pseudo-class", () => {
|
|
237
|
+
const result = genSelector("input:placeholder-shown", ["opacity: 0.5;"]);
|
|
238
|
+
expect(result).toBe("input:placeholder-shown {\n\topacity: 0.5;\n}");
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it("should handle :valid pseudo-class", () => {
|
|
242
|
+
const result = genSelector("input:valid", ["border-color: green;"]);
|
|
243
|
+
expect(result).toBe("input:valid {\n\tborder-color: green;\n}");
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it("should handle :invalid pseudo-class", () => {
|
|
247
|
+
const result = genSelector("input:invalid", ["border-color: red;"]);
|
|
248
|
+
expect(result).toBe("input:invalid {\n\tborder-color: red;\n}");
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it("should handle :in-range pseudo-class", () => {
|
|
252
|
+
const result = genSelector("input:in-range", ["background: lightgreen;"]);
|
|
253
|
+
expect(result).toBe("input:in-range {\n\tbackground: lightgreen;\n}");
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it("should handle :out-of-range pseudo-class", () => {
|
|
257
|
+
const result = genSelector("input:out-of-range", [
|
|
258
|
+
"background: lightcoral;",
|
|
259
|
+
]);
|
|
260
|
+
expect(result).toBe("input:out-of-range {\n\tbackground: lightcoral;\n}");
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it("should handle :required pseudo-class", () => {
|
|
264
|
+
const result = genSelector("input:required", ["border-width: 2px;"]);
|
|
265
|
+
expect(result).toBe("input:required {\n\tborder-width: 2px;\n}");
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("should handle :optional pseudo-class", () => {
|
|
269
|
+
const result = genSelector("input:optional", ["border-width: 1px;"]);
|
|
270
|
+
expect(result).toBe("input:optional {\n\tborder-width: 1px;\n}");
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it("should handle ::placeholder pseudo-element", () => {
|
|
274
|
+
const result = genSelector("input::placeholder", ["color: #999;"]);
|
|
275
|
+
expect(result).toBe("input::placeholder {\n\tcolor: #999;\n}");
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("should handle ::selection pseudo-element", () => {
|
|
279
|
+
const result = genSelector("::selection", [
|
|
280
|
+
"background: blue;",
|
|
281
|
+
"color: white;",
|
|
282
|
+
]);
|
|
283
|
+
expect(result).toBe(
|
|
284
|
+
"::selection {\n\tbackground: blue;\n\tcolor: white;\n}",
|
|
285
|
+
);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it("should handle ::first-line pseudo-element", () => {
|
|
289
|
+
const result = genSelector("p::first-line", ["font-weight: bold;"]);
|
|
290
|
+
expect(result).toBe("p::first-line {\n\tfont-weight: bold;\n}");
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it("should handle ::first-letter pseudo-element", () => {
|
|
294
|
+
const result = genSelector("p::first-letter", [
|
|
295
|
+
"font-size: 2em;",
|
|
296
|
+
"float: left;",
|
|
297
|
+
]);
|
|
298
|
+
expect(result).toBe(
|
|
299
|
+
"p::first-letter {\n\tfont-size: 2em;\n\tfloat: left;\n}",
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("should handle ::backdrop pseudo-element", () => {
|
|
304
|
+
const result = genSelector("dialog::backdrop", [
|
|
305
|
+
"background: rgba(0,0,0,0.5);",
|
|
306
|
+
]);
|
|
307
|
+
expect(result).toBe(
|
|
308
|
+
"dialog::backdrop {\n\tbackground: rgba(0,0,0,0.5);\n}",
|
|
309
|
+
);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it("should handle ::marker pseudo-element", () => {
|
|
313
|
+
const result = genSelector("li::marker", ["color: red;"]);
|
|
314
|
+
expect(result).toBe("li::marker {\n\tcolor: red;\n}");
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it("should handle complex declarations with selector", () => {
|
|
318
|
+
const result = genSelector(".gradient-box", [
|
|
319
|
+
"background: linear-gradient(to right, red, blue);",
|
|
320
|
+
"box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);",
|
|
321
|
+
]);
|
|
322
|
+
expect(result).toBe(
|
|
323
|
+
".gradient-box {\n\tbackground: linear-gradient(to right, red, blue);\n\tbox-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}",
|
|
324
|
+
);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it("should handle selectors with media query-like syntax", () => {
|
|
328
|
+
const result = genSelector("@media (min-width: 768px)", ["display: flex;"]);
|
|
329
|
+
expect(result).toBe("@media (min-width: 768px) {\n\tdisplay: flex;\n}");
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it("should handle very long selector strings", () => {
|
|
333
|
+
const longSelector =
|
|
334
|
+
".container .section .row .column .card .header .title .text";
|
|
335
|
+
const result = genSelector(longSelector, ["color: blue;"]);
|
|
336
|
+
expect(result).toBe(`${longSelector} {\n\tcolor: blue;\n}`);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it("should handle selector with trailing whitespace", () => {
|
|
340
|
+
const result = genSelector(".button ", ["padding: 10px;"]);
|
|
341
|
+
expect(result).toBe(".button {\n\tpadding: 10px;\n}");
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("should handle selector with leading whitespace", () => {
|
|
345
|
+
const result = genSelector(" .button", ["padding: 10px;"]);
|
|
346
|
+
expect(result).toBe(" .button {\n\tpadding: 10px;\n}");
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it("should handle complex selector with all combinator types", () => {
|
|
350
|
+
const result = genSelector(".parent > .child + .sibling ~ .distant", [
|
|
351
|
+
"display: block;",
|
|
352
|
+
]);
|
|
353
|
+
expect(result).toBe(
|
|
354
|
+
".parent > .child + .sibling ~ .distant {\n\tdisplay: block;\n}",
|
|
355
|
+
);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./genAtRuleQuery";
|
|
2
|
+
export * from "./genDeclaration";
|
|
3
|
+
export * from "./genDeclarationsBlock";
|
|
4
|
+
export * from "./genDeclareVariable";
|
|
5
|
+
export * from "./genInlineAtRule";
|
|
6
|
+
export * from "./genSafePropertyName";
|
|
7
|
+
export * from "./genReferenceVariable";
|
|
8
|
+
export * from "./genSafeVariableName";
|
|
9
|
+
export * from "./genSelector";
|