@@ -128,5 +128,289 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
128128 ) ;
129129 } ) ;
130130 } ) ;
131+
132+ describe ( 'longhand syntax' , ( ) => {
133+ it ( 'processes a single script into a single output' , async ( ) => {
134+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
135+
136+ harness . useTarget ( 'build' , {
137+ ...BASE_OPTIONS ,
138+ scripts : [ { input : 'src/test-script-a.js' } ] ,
139+ } ) ;
140+
141+ const { result } = await harness . executeOnce ( ) ;
142+
143+ expect ( result ?. success ) . toBe ( true ) ;
144+
145+ harness . expectFile ( 'dist/scripts.js' ) . content . toContain ( 'console.log("a")' ) ;
146+ harness
147+ . expectFile ( 'dist/index.html' )
148+ . content . toContain ( '<script src="scripts.js" defer></script>' ) ;
149+ } ) ;
150+
151+ it ( 'processes a single script into a single output named with bundleName' , async ( ) => {
152+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
153+
154+ harness . useTarget ( 'build' , {
155+ ...BASE_OPTIONS ,
156+ scripts : [ { input : 'src/test-script-a.js' , bundleName : 'extra' } ] ,
157+ } ) ;
158+
159+ const { result } = await harness . executeOnce ( ) ;
160+
161+ expect ( result ?. success ) . toBe ( true ) ;
162+
163+ harness . expectFile ( 'dist/extra.js' ) . content . toContain ( 'console.log("a")' ) ;
164+ harness
165+ . expectFile ( 'dist/index.html' )
166+ . content . toContain ( '<script src="extra.js" defer></script>' ) ;
167+ } ) ;
168+
169+ it ( 'uses default bundleName when bundleName is empty string' , async ( ) => {
170+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
171+
172+ harness . useTarget ( 'build' , {
173+ ...BASE_OPTIONS ,
174+ scripts : [ { input : 'src/test-script-a.js' , bundleName : '' } ] ,
175+ } ) ;
176+
177+ const { result } = await harness . executeOnce ( ) ;
178+
179+ expect ( result ?. success ) . toBe ( true ) ;
180+
181+ harness . expectFile ( 'dist/scripts.js' ) . content . toContain ( 'console.log("a")' ) ;
182+ harness
183+ . expectFile ( 'dist/index.html' )
184+ . content . toContain ( '<script src="scripts.js" defer></script>' ) ;
185+ } ) ;
186+
187+ it ( 'processes multiple scripts with no bundleName into a single output' , async ( ) => {
188+ await harness . writeFiles ( {
189+ 'src/test-script-a.js' : 'console.log("a");' ,
190+ 'src/test-script-b.js' : 'console.log("b");' ,
191+ } ) ;
192+
193+ harness . useTarget ( 'build' , {
194+ ...BASE_OPTIONS ,
195+ scripts : [ { input : 'src/test-script-a.js' } , { input : 'src/test-script-b.js' } ] ,
196+ } ) ;
197+
198+ const { result } = await harness . executeOnce ( ) ;
199+
200+ expect ( result ?. success ) . toBe ( true ) ;
201+
202+ harness . expectFile ( 'dist/scripts.js' ) . content . toContain ( 'console.log("a")' ) ;
203+ harness . expectFile ( 'dist/scripts.js' ) . content . toContain ( 'console.log("b")' ) ;
204+ harness
205+ . expectFile ( 'dist/index.html' )
206+ . content . toContain ( '<script src="scripts.js" defer></script>' ) ;
207+ } ) ;
208+
209+ it ( 'processes multiple scripts with same bundleName into a single output' , async ( ) => {
210+ await harness . writeFiles ( {
211+ 'src/test-script-a.js' : 'console.log("a");' ,
212+ 'src/test-script-b.js' : 'console.log("b");' ,
213+ } ) ;
214+
215+ harness . useTarget ( 'build' , {
216+ ...BASE_OPTIONS ,
217+ scripts : [
218+ { input : 'src/test-script-a.js' , bundleName : 'extra' } ,
219+ { input : 'src/test-script-b.js' , bundleName : 'extra' } ,
220+ ] ,
221+ } ) ;
222+
223+ const { result } = await harness . executeOnce ( ) ;
224+
225+ expect ( result ?. success ) . toBe ( true ) ;
226+
227+ harness . expectFile ( 'dist/extra.js' ) . content . toContain ( 'console.log("a")' ) ;
228+ harness . expectFile ( 'dist/extra.js' ) . content . toContain ( 'console.log("b")' ) ;
229+ harness
230+ . expectFile ( 'dist/index.html' )
231+ . content . toContain ( '<script src="extra.js" defer></script>' ) ;
232+ } ) ;
233+
234+ it ( 'processes multiple scripts with different bundleNames into separate outputs' , async ( ) => {
235+ await harness . writeFiles ( {
236+ 'src/test-script-a.js' : 'console.log("a");' ,
237+ 'src/test-script-b.js' : 'console.log("b");' ,
238+ } ) ;
239+
240+ harness . useTarget ( 'build' , {
241+ ...BASE_OPTIONS ,
242+ scripts : [
243+ { input : 'src/test-script-a.js' , bundleName : 'extra' } ,
244+ { input : 'src/test-script-b.js' , bundleName : 'other' } ,
245+ ] ,
246+ } ) ;
247+
248+ const { result } = await harness . executeOnce ( ) ;
249+
250+ expect ( result ?. success ) . toBe ( true ) ;
251+
252+ harness . expectFile ( 'dist/extra.js' ) . content . toContain ( 'console.log("a")' ) ;
253+ harness . expectFile ( 'dist/other.js' ) . content . toContain ( 'console.log("b")' ) ;
254+ harness
255+ . expectFile ( 'dist/index.html' )
256+ . content . toContain ( '<script src="extra.js" defer></script>' ) ;
257+ harness
258+ . expectFile ( 'dist/index.html' )
259+ . content . toContain ( '<script src="other.js" defer></script>' ) ;
260+ } ) ;
261+
262+ it ( 'preserves order of multiple scripts in single output' , async ( ) => {
263+ await harness . writeFiles ( {
264+ 'src/test-script-a.js' : 'console.log("a");' ,
265+ 'src/test-script-b.js' : 'console.log("b");' ,
266+ 'src/test-script-c.js' : 'console.log("c");' ,
267+ 'src/test-script-d.js' : 'console.log("d");' ,
268+ } ) ;
269+
270+ harness . useTarget ( 'build' , {
271+ ...BASE_OPTIONS ,
272+ scripts : [
273+ { input : 'src/test-script-c.js' } ,
274+ { input : 'src/test-script-d.js' } ,
275+ { input : 'src/test-script-b.js' } ,
276+ { input : 'src/test-script-a.js' } ,
277+ ] ,
278+ } ) ;
279+
280+ const { result } = await harness . executeOnce ( ) ;
281+
282+ expect ( result ?. success ) . toBe ( true ) ;
283+
284+ harness
285+ . expectFile ( 'dist/scripts.js' )
286+ . content . toMatch (
287+ / c o n s o l e \. l o g \( " c " \) [ ; \s ] + c o n s o l e \. l o g \( " d " \) [ ; \s ] + c o n s o l e \. l o g \( " b " \) [ ; \s ] + c o n s o l e \. l o g \( " a " \) / ,
288+ ) ;
289+ } ) ;
290+
291+ it ( 'preserves order of multiple scripts with different bundleNames' , async ( ) => {
292+ await harness . writeFiles ( {
293+ 'src/test-script-a.js' : 'console.log("a");' ,
294+ 'src/test-script-b.js' : 'console.log("b");' ,
295+ 'src/test-script-c.js' : 'console.log("c");' ,
296+ 'src/test-script-d.js' : 'console.log("d");' ,
297+ } ) ;
298+
299+ harness . useTarget ( 'build' , {
300+ ...BASE_OPTIONS ,
301+ scripts : [
302+ { input : 'src/test-script-c.js' , bundleName : 'other' } ,
303+ { input : 'src/test-script-d.js' , bundleName : 'extra' } ,
304+ { input : 'src/test-script-b.js' , bundleName : 'extra' } ,
305+ { input : 'src/test-script-a.js' , bundleName : 'other' } ,
306+ ] ,
307+ } ) ;
308+
309+ const { result } = await harness . executeOnce ( ) ;
310+
311+ expect ( result ?. success ) . toBe ( true ) ;
312+
313+ harness
314+ . expectFile ( 'dist/other.js' )
315+ . content . toMatch ( / c o n s o l e \. l o g \( " c " \) [ ; \s ] + c o n s o l e \. l o g \( " a " \) / ) ;
316+ harness
317+ . expectFile ( 'dist/extra.js' )
318+ . content . toMatch ( / c o n s o l e \. l o g \( " d " \) [ ; \s ] + c o n s o l e \. l o g \( " b " \) / ) ;
319+ harness
320+ . expectFile ( 'dist/index.html' )
321+ . content . toMatch (
322+ / < s c r i p t s r c = " o t h e r .j s " d e f e r > < \/ s c r i p t > \s * < s c r i p t s r c = " e x t r a .j s " d e f e r > < \/ s c r i p t > / ,
323+ ) ;
324+ } ) ;
325+
326+ it ( 'adds script element to index when inject is true' , async ( ) => {
327+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
328+
329+ harness . useTarget ( 'build' , {
330+ ...BASE_OPTIONS ,
331+ scripts : [ { input : 'src/test-script-a.js' , inject : true } ] ,
332+ } ) ;
333+
334+ const { result } = await harness . executeOnce ( ) ;
335+
336+ expect ( result ?. success ) . toBe ( true ) ;
337+
338+ harness . expectFile ( 'dist/scripts.js' ) . content . toContain ( 'console.log("a")' ) ;
339+ harness
340+ . expectFile ( 'dist/index.html' )
341+ . content . toContain ( '<script src="scripts.js" defer></script>' ) ;
342+ } ) ;
343+
344+ it ( 'does not add script element to index when inject is false' , async ( ) => {
345+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
346+
347+ harness . useTarget ( 'build' , {
348+ ...BASE_OPTIONS ,
349+ scripts : [ { input : 'src/test-script-a.js' , inject : false } ] ,
350+ } ) ;
351+
352+ const { result } = await harness . executeOnce ( ) ;
353+
354+ expect ( result ?. success ) . toBe ( true ) ;
355+
356+ // `inject: false` causes the bundleName to be the input file name
357+ harness . expectFile ( 'dist/test-script-a.js' ) . content . toContain ( 'console.log("a")' ) ;
358+ harness
359+ . expectFile ( 'dist/index.html' )
360+ . content . not . toContain ( '<script src="test-script-a.js" defer></script>' ) ;
361+ } ) ;
362+
363+ it ( 'does not add script element to index with bundleName when inject is false' , async ( ) => {
364+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
365+
366+ harness . useTarget ( 'build' , {
367+ ...BASE_OPTIONS ,
368+ scripts : [ { input : 'src/test-script-a.js' , bundleName : 'extra' , inject : false } ] ,
369+ } ) ;
370+
371+ const { result } = await harness . executeOnce ( ) ;
372+
373+ expect ( result ?. success ) . toBe ( true ) ;
374+
375+ harness . expectFile ( 'dist/extra.js' ) . content . toContain ( 'console.log("a")' ) ;
376+ harness
377+ . expectFile ( 'dist/index.html' )
378+ . content . not . toContain ( '<script src="extra.js" defer></script>' ) ;
379+ } ) ;
380+
381+ it ( 'shows the output script as a chunk entry in the logging output' , async ( ) => {
382+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
383+
384+ harness . useTarget ( 'build' , {
385+ ...BASE_OPTIONS ,
386+ scripts : [ { input : 'src/test-script-a.js' } ] ,
387+ } ) ;
388+
389+ const { result, logs } = await harness . executeOnce ( ) ;
390+
391+ expect ( result ?. success ) . toBe ( true ) ;
392+
393+ expect ( logs ) . toContain (
394+ jasmine . objectContaining ( { message : jasmine . stringMatching ( / s c r i p t s \. j s .+ \d + b y t e s / ) } ) ,
395+ ) ;
396+ } ) ;
397+
398+ it ( 'shows the output script as a chunk entry with bundleName in the logging output' , async ( ) => {
399+ await harness . writeFile ( 'src/test-script-a.js' , 'console.log("a");' ) ;
400+
401+ harness . useTarget ( 'build' , {
402+ ...BASE_OPTIONS ,
403+ scripts : [ { input : 'src/test-script-a.js' , bundleName : 'extra' } ] ,
404+ } ) ;
405+
406+ const { result, logs } = await harness . executeOnce ( ) ;
407+
408+ expect ( result ?. success ) . toBe ( true ) ;
409+
410+ expect ( logs ) . toContain (
411+ jasmine . objectContaining ( { message : jasmine . stringMatching ( / e x t r a \. j s .+ \d + b y t e s / ) } ) ,
412+ ) ;
413+ } ) ;
414+ } ) ;
131415 } ) ;
132416} ) ;
0 commit comments