@@ -27,7 +27,11 @@ const manifest = {
27
27
installMode : 'lazy' ,
28
28
updateMode : 'prefetch' ,
29
29
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
+ ] ,
31
35
} ,
32
36
} ,
33
37
] ,
@@ -37,182 +41,187 @@ describeServeBuilder(
37
41
executeDevServer ,
38
42
DEV_SERVER_BUILDER_INFO ,
39
43
( 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 ,
56
56
} ,
57
- i18n : {
58
- sourceLocale : {
59
- 'code' : 'fr' ,
60
- } ,
57
+ } ,
58
+ i18n : {
59
+ sourceLocale : {
60
+ 'code' : 'fr' ,
61
61
} ,
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); }` ,
63
79
} ) ;
64
80
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 ,
106
107
} ,
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 ,
116
117
} ,
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 : [ ] ,
124
119
} ,
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' ] ,
127
142
} ) ;
128
143
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
+ } ) ;
136
149
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
+ } ) ;
142
153
143
- harness . useTarget ( 'serve' , {
144
- ...BASE_OPTIONS ,
145
- } ) ;
154
+ const { result, response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
146
155
147
- const { result , response } = await executeOnceAndFetch ( harness , '/ngsw.json' ) ;
156
+ expect ( result ?. success ) . toBeTrue ( ) ;
148
157
149
- expect ( result ?. success ) . toBeTrue ( ) ;
158
+ expect ( await response ?. json ( ) ) . toBeDefined ( ) ;
159
+ } ) ;
150
160
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' ] ,
152
169
} ) ;
153
170
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); }` ,
214
175
} ) ;
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
+ } ) ;
217
226
} ,
218
227
) ;
0 commit comments