@@ -31,17 +31,34 @@ const spyOnCompiler = (implementation) => {
31
31
return compiler ;
32
32
} ) ;
33
33
34
- const mockRestore = ( ) => initSpy . mockRestore ( ) ;
35
-
36
34
const spies = {
37
35
initSpy,
38
- mockRestore,
36
+ mockClear ( ) {
37
+ if ( this . compileStringSpy ) {
38
+ this . compileStringSpy . mockClear ( ) ;
39
+ }
40
+ } ,
41
+ mockRestore ( ) {
42
+ initSpy . mockRestore ( ) ;
43
+ delete this . compileStringSpy ;
44
+ } ,
39
45
} ;
40
46
41
47
return spies ;
42
48
} ;
43
49
44
50
describe ( "implementation option" , ( ) => {
51
+ const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
52
+ const dartSassSpy = jest . spyOn ( dartSass , "render" ) ;
53
+ const dartSassSpyModernAPI = jest . spyOn ( dartSass , "compileStringAsync" ) ;
54
+ const dartSassCompilerSpies = spyOnCompiler ( dartSass ) ;
55
+ const sassEmbeddedSpy = jest . spyOn ( sassEmbedded , "render" ) ;
56
+ const sassEmbeddedSpyModernAPI = jest . spyOn (
57
+ sassEmbedded ,
58
+ "compileStringAsync" ,
59
+ ) ;
60
+ const sassEmbeddedCompilerSpies = spyOnCompiler ( sassEmbedded ) ;
61
+
45
62
implementations . forEach ( ( item ) => {
46
63
let implementationName ;
47
64
let implementation ;
@@ -56,17 +73,6 @@ describe("implementation option", () => {
56
73
}
57
74
58
75
it ( `'${ implementationName } ', '${ api } ' API` , async ( ) => {
59
- const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
60
- const dartSassSpy = jest . spyOn ( dartSass , "render" ) ;
61
- const dartSassSpyModernAPI = jest . spyOn ( dartSass , "compileStringAsync" ) ;
62
- const dartSassCompilerSpies = spyOnCompiler ( dartSass ) ;
63
- const sassEmbeddedSpy = jest . spyOn ( sassEmbedded , "render" ) ;
64
- const sassEmbeddedSpyModernAPI = jest . spyOn (
65
- sassEmbedded ,
66
- "compileStringAsync" ,
67
- ) ;
68
- const sassEmbeddedCompilerSpies = spyOnCompiler ( sassEmbedded ) ;
69
-
70
76
const testId = getTestId ( "language" , "scss" ) ;
71
77
const options = { api, implementation } ;
72
78
const compiler = getCompiler ( testId , { loader : { options } } ) ;
@@ -83,10 +89,8 @@ describe("implementation option", () => {
83
89
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 1 ) ;
84
90
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
85
91
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
86
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
87
92
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
88
93
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
89
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
90
94
} else if (
91
95
implementationName === "dart-sass" ||
92
96
implementationName === "dart-sass_string"
@@ -95,68 +99,56 @@ describe("implementation option", () => {
95
99
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
96
100
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
97
101
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 1 ) ;
98
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
99
102
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
100
103
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
101
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
102
104
} else if ( api === "modern-compiler" ) {
103
105
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
104
106
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
105
107
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
106
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 1 ) ;
107
108
expect ( dartSassCompilerSpies . compileStringSpy ) . toHaveBeenCalledTimes (
108
109
1 ,
109
110
) ;
110
111
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
111
112
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
112
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
113
113
} else if ( api === "legacy" ) {
114
114
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
115
115
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 1 ) ;
116
116
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
117
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
118
117
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
119
118
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
120
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
121
119
}
122
120
} else if ( implementationName === "sass-embedded" ) {
123
121
if ( api === "modern" ) {
124
122
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
125
123
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
126
124
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
127
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
128
125
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
129
126
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 1 ) ;
130
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
131
127
} else if ( api === "modern-compiler" ) {
132
128
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
133
129
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
134
130
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
135
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
136
131
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 0 ) ;
137
132
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
138
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 1 ) ;
139
133
expect (
140
134
sassEmbeddedCompilerSpies . compileStringSpy ,
141
135
) . toHaveBeenCalledTimes ( 1 ) ;
142
136
} else if ( api === "legacy" ) {
143
137
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
144
138
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
145
139
expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
146
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
147
140
expect ( sassEmbeddedSpy ) . toHaveBeenCalledTimes ( 1 ) ;
148
141
expect ( sassEmbeddedSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
149
- expect ( sassEmbeddedCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 0 ) ;
150
142
}
151
143
}
152
144
153
- nodeSassSpy . mockRestore ( ) ;
154
- dartSassSpy . mockRestore ( ) ;
155
- dartSassSpyModernAPI . mockRestore ( ) ;
156
- dartSassCompilerSpies . mockRestore ( ) ;
157
- sassEmbeddedSpy . mockRestore ( ) ;
158
- sassEmbeddedSpyModernAPI . mockRestore ( ) ;
159
- sassEmbeddedCompilerSpies . mockRestore ( ) ;
145
+ nodeSassSpy . mockClear ( ) ;
146
+ dartSassSpy . mockClear ( ) ;
147
+ dartSassSpyModernAPI . mockClear ( ) ;
148
+ dartSassCompilerSpies . mockClear ( ) ;
149
+ sassEmbeddedSpy . mockClear ( ) ;
150
+ sassEmbeddedSpyModernAPI . mockClear ( ) ;
151
+ sassEmbeddedCompilerSpies . mockClear ( ) ;
160
152
} ) ;
161
153
} ) ;
162
154
@@ -173,9 +165,6 @@ describe("implementation option", () => {
173
165
} ) ;
174
166
175
167
it ( "not specify" , async ( ) => {
176
- const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
177
- const dartSassSpy = jest . spyOn ( dartSass , "render" ) ;
178
-
179
168
const testId = getTestId ( "language" , "scss" ) ;
180
169
const options = { } ;
181
170
const compiler = getCompiler ( testId , { loader : { options } } ) ;
@@ -191,14 +180,11 @@ describe("implementation option", () => {
191
180
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
192
181
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 1 ) ;
193
182
194
- nodeSassSpy . mockRestore ( ) ;
195
- dartSassSpy . mockRestore ( ) ;
183
+ nodeSassSpy . mockClear ( ) ;
184
+ dartSassSpy . mockClear ( ) ;
196
185
} ) ;
197
186
198
187
it ( "not specify with legacy API" , async ( ) => {
199
- const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
200
- const dartSassSpy = jest . spyOn ( dartSass , "render" ) ;
201
-
202
188
const testId = getTestId ( "language" , "scss" ) ;
203
189
const options = {
204
190
api : "legacy" ,
@@ -216,14 +202,11 @@ describe("implementation option", () => {
216
202
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
217
203
expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 1 ) ;
218
204
219
- nodeSassSpy . mockRestore ( ) ;
220
- dartSassSpy . mockRestore ( ) ;
205
+ nodeSassSpy . mockClear ( ) ;
206
+ dartSassSpy . mockClear ( ) ;
221
207
} ) ;
222
208
223
209
it ( "not specify with modern API" , async ( ) => {
224
- const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
225
- const dartSassSpy = jest . spyOn ( dartSass , "compileStringAsync" ) ;
226
-
227
210
const testId = getTestId ( "language" , "scss" ) ;
228
211
const options = {
229
212
api : "modern" ,
@@ -239,17 +222,13 @@ describe("implementation option", () => {
239
222
expect ( getErrors ( stats ) ) . toMatchSnapshot ( "errors" ) ;
240
223
241
224
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
242
- expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 1 ) ;
225
+ expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 1 ) ;
243
226
244
- nodeSassSpy . mockRestore ( ) ;
245
- dartSassSpy . mockRestore ( ) ;
227
+ nodeSassSpy . mockClear ( ) ;
228
+ dartSassSpyModernAPI . mockClear ( ) ;
246
229
} ) ;
247
230
248
- it . skip ( "not specify with modern-compiler API" , async ( ) => {
249
- const nodeSassSpy = jest . spyOn ( nodeSass , "render" ) ;
250
- const dartSassSpy = jest . spyOn ( dartSass , "compileStringAsync" ) ;
251
- const dartSassCompilerSpies = spyOnCompiler ( dartSass ) ;
252
-
231
+ it ( "not specify with modern-compiler API" , async ( ) => {
253
232
const testId = getTestId ( "language" , "scss" ) ;
254
233
const options = {
255
234
api : "modern-compiler" ,
@@ -265,17 +244,44 @@ describe("implementation option", () => {
265
244
expect ( getErrors ( stats ) ) . toMatchSnapshot ( "errors" ) ;
266
245
267
246
expect ( nodeSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
268
- expect ( dartSassSpy ) . toHaveBeenCalledTimes ( 0 ) ;
269
- // TODO: this isn't being called because the compiler is already initialized
270
- // from a previous test.
271
- expect ( dartSassCompilerSpies . initSpy ) . toHaveBeenCalledTimes ( 1 ) ;
247
+ expect ( dartSassSpyModernAPI ) . toHaveBeenCalledTimes ( 0 ) ;
272
248
expect ( dartSassCompilerSpies . compileStringSpy ) . toHaveBeenCalledTimes ( 1 ) ;
273
249
274
- nodeSassSpy . mockRestore ( ) ;
275
- dartSassSpy . mockRestore ( ) ;
276
- dartSassCompilerSpies . mockRestore ( ) ;
250
+ nodeSassSpy . mockClear ( ) ;
251
+ dartSassSpyModernAPI . mockClear ( ) ;
252
+ dartSassCompilerSpies . mockClear ( ) ;
277
253
} ) ;
278
254
255
+ it . each ( [ "dart-sass" , "sass-embedded" ] ) (
256
+ "should support switching the implementation within the same process when using the modern-compiler API" ,
257
+ async ( implementationName ) => {
258
+ const testId = getTestId ( "language" , "scss" ) ;
259
+ const options = {
260
+ api : "modern-compiler" ,
261
+ implementation : getImplementationByName ( implementationName ) ,
262
+ } ;
263
+ const compiler = getCompiler ( testId , { loader : { options } } ) ;
264
+ const stats = await compile ( compiler ) ;
265
+ const { css, sourceMap } = getCodeFromBundle ( stats , compiler ) ;
266
+
267
+ expect ( css ) . toBeDefined ( ) ;
268
+ expect ( sourceMap ) . toBeUndefined ( ) ;
269
+
270
+ expect ( getWarnings ( stats ) ) . toMatchSnapshot ( "warnings" ) ;
271
+ expect ( getErrors ( stats ) ) . toMatchSnapshot ( "errors" ) ;
272
+
273
+ expect ( dartSassCompilerSpies . compileStringSpy ) . toHaveBeenCalledTimes (
274
+ implementationName === "dart-sass" ? 1 : 0 ,
275
+ ) ;
276
+ expect ( sassEmbeddedCompilerSpies . compileStringSpy ) . toHaveBeenCalledTimes (
277
+ implementationName === "sass-embedded" ? 1 : 0 ,
278
+ ) ;
279
+
280
+ dartSassCompilerSpies . mockClear ( ) ;
281
+ sassEmbeddedCompilerSpies . mockClear ( ) ;
282
+ } ,
283
+ ) ;
284
+
279
285
it ( "should throw an error on an unknown sass implementation" , async ( ) => {
280
286
const testId = getTestId ( "language" , "scss" ) ;
281
287
const options = {
0 commit comments