@@ -27,7 +27,11 @@ const manifest = {
2727 installMode : 'lazy' ,
2828 updateMode : 'prefetch' ,
2929 resources : {
30- files : [ '/assets/**' , '/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)' ] ,
30+ files : [
31+ '/media/**' ,
32+ '/assets/**' ,
33+ '/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)' ,
34+ ] ,
3135 } ,
3236 } ,
3337 ] ,
@@ -37,182 +41,187 @@ describeServeBuilder(
3741 executeDevServer ,
3842 DEV_SERVER_BUILDER_INFO ,
3943 ( harness , setupTarget , isViteRun ) => {
40- // TODO(fix-vite): currently this is broken in vite.
41- ( isViteRun ? xdescribe : describe ) (
42- 'Behavior: "dev-server builder serves service worker"' ,
43- ( ) => {
44- beforeEach ( async ( ) => {
45- // Application code is not needed for these tests
46- await harness . writeFile ( 'src/main.ts' , '' ) ;
47- await harness . writeFile ( 'src/polyfills.ts' , '' ) ;
48-
49- harness . useProject ( 'test' , {
50- root : '.' ,
51- sourceRoot : 'src' ,
52- cli : {
53- cache : {
54- enabled : false ,
55- } ,
44+ describe ( 'Behavior: "dev-server builder serves service worker"' , ( ) => {
45+ beforeEach ( async ( ) => {
46+ // Application code is not needed for these tests
47+ await harness . writeFile ( 'src/main.ts' , '' ) ;
48+ await harness . writeFile ( 'src/polyfills.ts' , '' ) ;
49+
50+ harness . useProject ( 'test' , {
51+ root : '.' ,
52+ sourceRoot : 'src' ,
53+ cli : {
54+ cache : {
55+ enabled : false ,
5656 } ,
57- i18n : {
58- sourceLocale : {
59- 'code' : 'fr' ,
60- } ,
57+ } ,
58+ i18n : {
59+ sourceLocale : {
60+ 'code' : 'fr' ,
6161 } ,
62- } ) ;
62+ } ,
63+ } ) ;
64+ } ) ;
65+
66+ it ( 'works with service worker' , async ( ) => {
67+ setupTarget ( harness , {
68+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69+ serviceWorker : ( isViteRun ? 'ngsw-config.json' : true ) as any ,
70+ resourcesOutputPath : isViteRun ? undefined : 'media' ,
71+ assets : [ 'src/favicon.ico' , 'src/assets' ] ,
72+ styles : [ 'src/styles.css' ] ,
73+ } ) ;
74+
75+ await harness . writeFiles ( {
76+ 'ngsw-config.json' : JSON . stringify ( manifest ) ,
77+ 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
78+ 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
6379 } ) ;
6480
65- it ( 'works with service worker' , async ( ) => {
66- setupTarget ( harness , {
67- serviceWorker : true ,
68- assets : [ 'src/favicon.ico' , 'src/assets' ] ,
69- styles : [ 'src/styles.css' ] ,
70- } ) ;
71-
72- await harness . writeFiles ( {
73- 'ngsw-config.json' : JSON . stringify ( manifest ) ,
74- 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
75- 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
76- } ) ;
77-
78- harness . useTarget ( 'serve' , {
79- ...BASE_OPTIONS ,
80- } ) ;
81-
82- const { result, response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
83-
84- expect ( result ?. success ) . toBeTrue ( ) ;
85-
86- expect ( await response ?. json ( ) ) . toEqual (
87- jasmine . objectContaining ( {
88- configVersion : 1 ,
89- index : '/index.html' ,
90- navigationUrls : [
91- { positive : true , regex : '^\\/.*$' } ,
92- { positive : false , regex : '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' } ,
93- { positive : false , regex : '^\\/(?:.+\\/)?[^/]*__[^/]*$' } ,
94- { positive : false , regex : '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' } ,
95- ] ,
96- assetGroups : [
97- {
98- name : 'app' ,
99- installMode : 'prefetch' ,
100- updateMode : 'prefetch' ,
101- urls : [ '/favicon.ico' , '/index.html' ] ,
102- cacheQueryOptions : {
103- ignoreVary : true ,
104- } ,
105- patterns : [ ] ,
81+ harness . useTarget ( 'serve' , {
82+ ...BASE_OPTIONS ,
83+ } ) ;
84+
85+ const { result, response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
86+
87+ expect ( result ?. success ) . toBeTrue ( ) ;
88+
89+ expect ( await response ?. json ( ) ) . toEqual (
90+ jasmine . objectContaining ( {
91+ configVersion : 1 ,
92+ index : '/index.html' ,
93+ navigationUrls : [
94+ { positive : true , regex : '^\\/.*$' } ,
95+ { positive : false , regex : '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' } ,
96+ { positive : false , regex : '^\\/(?:.+\\/)?[^/]*__[^/]*$' } ,
97+ { positive : false , regex : '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' } ,
98+ ] ,
99+ assetGroups : [
100+ {
101+ name : 'app' ,
102+ installMode : 'prefetch' ,
103+ updateMode : 'prefetch' ,
104+ urls : [ '/favicon.ico' , '/index.html' ] ,
105+ cacheQueryOptions : {
106+ ignoreVary : true ,
106107 } ,
107- {
108- name : 'assets' ,
109- installMode : 'lazy' ,
110- updateMode : 'prefetch ' ,
111- urls : [ '/assets/folder-asset.txt' , '/spectrum.png' ] ,
112- cacheQueryOptions : {
113- ignoreVary : true ,
114- } ,
115- patterns : [ ] ,
108+ patterns : [ ] ,
109+ } ,
110+ {
111+ name : 'assets ' ,
112+ installMode : 'lazy' ,
113+ updateMode : 'prefetch' ,
114+ urls : [ '/assets/folder-asset.txt' , '/media/spectrum.png' ] ,
115+ cacheQueryOptions : {
116+ ignoreVary : true ,
116117 } ,
117- ] ,
118- dataGroups : [ ] ,
119- hashTable : {
120- '/favicon.ico' : '84161b857f5c547e3699ddfbffc6d8d737542e01' ,
121- '/assets/folder-asset.txt' : '617f202968a6a81050aa617c2e28e1dca11ce8d4' ,
122- '/index.html' : '9d232e3e13b4605d197037224a2a6303dd337480' ,
123- '/spectrum.png' : '8d048ece46c0f3af4b598a95fd8e4709b631c3c0' ,
118+ patterns : [ ] ,
124119 } ,
125- } ) ,
126- ) ;
120+ ] ,
121+ dataGroups : [ ] ,
122+ hashTable : {
123+ '/favicon.ico' : '84161b857f5c547e3699ddfbffc6d8d737542e01' ,
124+ '/assets/folder-asset.txt' : '617f202968a6a81050aa617c2e28e1dca11ce8d4' ,
125+ '/index.html' : isViteRun
126+ ? 'e5b73e6798d2782bf59dd5272d254d5bde364695'
127+ : '9d232e3e13b4605d197037224a2a6303dd337480' ,
128+ '/media/spectrum.png' : '8d048ece46c0f3af4b598a95fd8e4709b631c3c0' ,
129+ } ,
130+ } ) ,
131+ ) ;
132+ } ) ;
133+
134+ it ( 'works with localize' , async ( ) => {
135+ setupTarget ( harness , {
136+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
137+ serviceWorker : ( isViteRun ? 'ngsw-config.json' : true ) as any ,
138+ resourcesOutputPath : isViteRun ? undefined : 'media' ,
139+ assets : [ 'src/favicon.ico' , 'src/assets' ] ,
140+ styles : [ 'src/styles.css' ] ,
141+ localize : [ 'fr' ] ,
127142 } ) ;
128143
129- it ( 'works with localize' , async ( ) => {
130- setupTarget ( harness , {
131- serviceWorker : true ,
132- assets : [ 'src/favicon.ico' , 'src/assets' ] ,
133- styles : [ 'src/styles.css' ] ,
134- localize : [ 'fr' ] ,
135- } ) ;
144+ await harness . writeFiles ( {
145+ 'ngsw-config.json' : JSON . stringify ( manifest ) ,
146+ 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
147+ 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
148+ } ) ;
136149
137- await harness . writeFiles ( {
138- 'ngsw-config.json' : JSON . stringify ( manifest ) ,
139- 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
140- 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
141- } ) ;
150+ harness . useTarget ( 'serve' , {
151+ ...BASE_OPTIONS ,
152+ } ) ;
142153
143- harness . useTarget ( 'serve' , {
144- ...BASE_OPTIONS ,
145- } ) ;
154+ const { result, response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
146155
147- const { result , response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
156+ expect ( result ?. success ) . toBeTrue ( ) ;
148157
149- expect ( result ?. success ) . toBeTrue ( ) ;
158+ expect ( await response ?. json ( ) ) . toBeDefined ( ) ;
159+ } ) ;
150160
151- expect ( await response ?. json ( ) ) . toBeDefined ( ) ;
161+ // TODO(fix-vite): currently this is broken in vite due to watcher never terminates.
162+ ( isViteRun ? xit : it ) ( 'works in watch mode' , async ( ) => {
163+ setupTarget ( harness , {
164+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
165+ serviceWorker : ( isViteRun ? 'ngsw-config.json' : true ) as any ,
166+ resourcesOutputPath : isViteRun ? undefined : 'media' ,
167+ assets : [ 'src/favicon.ico' , 'src/assets' ] ,
168+ styles : [ 'src/styles.css' ] ,
152169 } ) ;
153170
154- it ( 'works in watch mode' , async ( ) => {
155- setupTarget ( harness , {
156- serviceWorker : true ,
157- assets : [ 'src/favicon.ico' , 'src/assets' ] ,
158- styles : [ 'src/styles.css' ] ,
159- } ) ;
160-
161- await harness . writeFiles ( {
162- 'ngsw-config.json' : JSON . stringify ( manifest ) ,
163- 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
164- 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
165- } ) ;
166-
167- harness . useTarget ( 'serve' , {
168- ...BASE_OPTIONS ,
169- watch : true ,
170- } ) ;
171-
172- const buildCount = await harness
173- . execute ( )
174- . pipe (
175- timeout ( BUILD_TIMEOUT ) ,
176- concatMap ( async ( { result } , index ) => {
177- expect ( result ?. success ) . toBeTrue ( ) ;
178- const response = await fetch ( new URL ( 'ngsw.json' , `${ result ?. baseUrl } ` ) ) ;
179- const { hashTable } = ( await response . json ( ) ) as { hashTable : object } ;
180- const hashTableEntries = Object . keys ( hashTable ) ;
181-
182- switch ( index ) {
183- case 0 :
184- expect ( hashTableEntries ) . toEqual ( [
185- '/assets/folder-asset.txt' ,
186- '/favicon.ico' ,
187- '/index.html' ,
188- '/spectrum.png' ,
189- ] ) ;
190-
191- await harness . writeFile (
192- 'src/assets/folder-new-asset.txt' ,
193- harness . readFile ( 'src/assets/folder-asset.txt' ) ,
194- ) ;
195- break ;
196-
197- case 1 :
198- expect ( hashTableEntries ) . toEqual ( [
199- '/assets/folder-asset.txt' ,
200- '/assets/folder-new-asset.txt' ,
201- '/favicon.ico' ,
202- '/index.html' ,
203- '/spectrum.png' ,
204- ] ) ;
205- break ;
206- }
207- } ) ,
208- take ( 2 ) ,
209- count ( ) ,
210- )
211- . toPromise ( ) ;
212-
213- expect ( buildCount ) . toBe ( 2 ) ;
171+ await harness . writeFiles ( {
172+ 'ngsw-config.json' : JSON . stringify ( manifest ) ,
173+ 'src/assets/folder-asset.txt' : 'folder-asset.txt' ,
174+ 'src/styles.css' : `body { background: url(./spectrum.png); }` ,
214175 } ) ;
215- } ,
216- ) ;
176+
177+ harness . useTarget ( 'serve' , {
178+ ...BASE_OPTIONS ,
179+ watch : true ,
180+ } ) ;
181+
182+ const buildCount = await harness
183+ . execute ( )
184+ . pipe (
185+ timeout ( BUILD_TIMEOUT ) ,
186+ concatMap ( async ( { result } , index ) => {
187+ expect ( result ?. success ) . toBeTrue ( ) ;
188+ const response = await fetch ( new URL ( 'ngsw.json' , `${ result ?. baseUrl } ` ) ) ;
189+ const { hashTable } = ( await response . json ( ) ) as { hashTable : object } ;
190+ const hashTableEntries = Object . keys ( hashTable ) ;
191+
192+ switch ( index ) {
193+ case 0 :
194+ expect ( hashTableEntries ) . toEqual ( [
195+ '/assets/folder-asset.txt' ,
196+ '/favicon.ico' ,
197+ '/index.html' ,
198+ '/media/spectrum.png' ,
199+ ] ) ;
200+
201+ await harness . writeFile (
202+ 'src/assets/folder-new-asset.txt' ,
203+ harness . readFile ( 'src/assets/folder-asset.txt' ) ,
204+ ) ;
205+ break ;
206+
207+ case 1 :
208+ expect ( hashTableEntries ) . toEqual ( [
209+ '/assets/folder-asset.txt' ,
210+ '/assets/folder-new-asset.txt' ,
211+ '/favicon.ico' ,
212+ '/index.html' ,
213+ '/media/spectrum.png' ,
214+ ] ) ;
215+ break ;
216+ }
217+ } ) ,
218+ take ( 2 ) ,
219+ count ( ) ,
220+ )
221+ . toPromise ( ) ;
222+
223+ expect ( buildCount ) . toBe ( 2 ) ;
224+ } ) ;
225+ } ) ;
217226 } ,
218227) ;
0 commit comments