@@ -150,6 +150,133 @@ def setup
150
150
assert_not_equal set_two , @importmap . preloaded_module_paths ( resolver : ApplicationController . helpers , cache_key : "2" ) . to_s
151
151
end
152
152
153
+ test "preloaded_module_packages returns hash of resolved paths to packages when no entry_point specified" do
154
+ packages = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers )
155
+
156
+ md5 = packages [ "https://cdn.skypack.dev/md5" ]
157
+ assert md5 , "Should include md5 package"
158
+ assert_equal "md5" , md5 . name
159
+ assert_equal "https://cdn.skypack.dev/md5" , md5 . path
160
+ assert_equal true , md5 . preload
161
+
162
+ goodbye_controller_path = packages . keys . find { |path | path . include? ( "goodbye_controller" ) }
163
+ assert goodbye_controller_path , "Should include goodbye_controller package"
164
+ assert_equal "controllers/goodbye_controller" , packages [ goodbye_controller_path ] . name
165
+ assert_equal true , packages [ goodbye_controller_path ] . preload
166
+
167
+ leaflet = packages [ "https://cdn.skypack.dev/leaflet" ]
168
+ assert leaflet , "Should include leaflet package"
169
+ assert_equal "leaflet" , leaflet . name
170
+ assert_equal "https://cdn.skypack.dev/leaflet" , leaflet . path
171
+ assert_equal 'application' , leaflet . preload
172
+
173
+ chartkick = packages [ "https://cdn.skypack.dev/chartkick" ]
174
+ assert chartkick , "Should include chartkick package"
175
+ assert_equal "chartkick" , chartkick . name
176
+ assert_equal [ 'application' , 'alternate' ] , chartkick . preload
177
+
178
+ application_path = packages . keys . find { |path | path . include? ( "application" ) }
179
+ assert_nil application_path , "Should not include application package (preload: false)"
180
+
181
+ tinymce_path = packages . keys . find { |path | path . include? ( "tinymce" ) }
182
+ assert_nil tinymce_path , "Should not include tinymce package (preload: 'alternate')"
183
+ end
184
+
185
+ test "preloaded_module_packages returns hash based on single entry_point provided" do
186
+ packages = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , entry_point : "alternate" )
187
+
188
+ tinymce = packages [ "https://cdn.skypack.dev/tinymce" ]
189
+ assert tinymce , "Should include tinymce package for alternate entry point"
190
+ assert_equal "tinyMCE" , tinymce . name
191
+ assert_equal "https://cdn.skypack.dev/tinymce" , tinymce . path
192
+ assert_equal 'alternate' , tinymce . preload
193
+
194
+ # Should include packages for multiple entry points (chartkick preloads for both 'application' and 'alternate')
195
+ chartkick = packages [ "https://cdn.skypack.dev/chartkick" ]
196
+ assert chartkick , "Should include chartkick package"
197
+ assert_equal "chartkick" , chartkick . name
198
+ assert_equal [ 'application' , 'alternate' ] , chartkick . preload
199
+
200
+ # Should include always-preloaded packages
201
+ md5 = packages [ "https://cdn.skypack.dev/md5" ]
202
+ assert md5 , "Should include md5 package (always preloaded)"
203
+
204
+ leaflet_path = packages . keys . find { |path | path . include? ( "leaflet" ) }
205
+ assert_nil leaflet_path , "Should not include leaflet package (preload: 'application' only)"
206
+ end
207
+
208
+ test "preloaded_module_packages returns hash based on multiple entry_points provided" do
209
+ packages = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , entry_point : [ "application" , "alternate" ] )
210
+
211
+ leaflet = packages [ "https://cdn.skypack.dev/leaflet" ]
212
+ assert leaflet , "Should include leaflet package for application entry point"
213
+
214
+ # Should include packages for 'alternate' entry point
215
+ tinymce = packages [ "https://cdn.skypack.dev/tinymce" ]
216
+ assert tinymce , "Should include tinymce package for alternate entry point"
217
+
218
+ # Should include packages for multiple entry points
219
+ chartkick = packages [ "https://cdn.skypack.dev/chartkick" ]
220
+ assert chartkick , "Should include chartkick package for both entry points"
221
+
222
+ # Should include always-preloaded packages
223
+ md5 = packages [ "https://cdn.skypack.dev/md5" ]
224
+ assert md5 , "Should include md5 package (always preloaded)"
225
+
226
+ application_path = packages . keys . find { |path | path . include? ( "application" ) }
227
+ assert_nil application_path , "Should not include application package (preload: false)"
228
+ end
229
+
230
+ test "preloaded_module_packages includes package integrity when present" do
231
+ # Create a new importmap with a preloaded package that has integrity
232
+ importmap = Importmap ::Map . new . tap do |map |
233
+ map . pin "editor" , to : "rich_text.js" , preload : true , integrity : "sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb"
234
+ end
235
+
236
+ packages = importmap . preloaded_module_packages ( resolver : ApplicationController . helpers )
237
+
238
+ editor_path = packages . keys . find { |path | path . include? ( "rich_text" ) }
239
+ assert editor_path , "Should include editor package"
240
+ assert_equal "editor" , packages [ editor_path ] . name
241
+ assert_equal "sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb" , packages [ editor_path ] . integrity
242
+ end
243
+
244
+ test "preloaded_module_packages uses custom cache_key" do
245
+ set_one = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , cache_key : "1" ) . to_s
246
+
247
+ ActionController ::Base . asset_host = "http://assets.example.com"
248
+
249
+ set_two = @importmap . preloaded_module_packages ( resolver : ActionController ::Base . helpers , cache_key : "2" ) . to_s
250
+
251
+ assert_not_equal set_one , set_two
252
+ ensure
253
+ ActionController ::Base . asset_host = nil
254
+ end
255
+
256
+ test "preloaded_module_packages caches reset" do
257
+ set_one = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , cache_key : "1" ) . to_s
258
+ set_two = @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , cache_key : "2" ) . to_s
259
+
260
+ @importmap . pin "something" , to : "https://cdn.example.com/somewhere.js" , preload : true
261
+
262
+ assert_not_equal set_one , @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , cache_key : "1" ) . to_s
263
+ assert_not_equal set_two , @importmap . preloaded_module_packages ( resolver : ApplicationController . helpers , cache_key : "2" ) . to_s
264
+ end
265
+
266
+ test "preloaded_module_packages handles missing assets gracefully" do
267
+ importmap = Importmap ::Map . new . tap do |map |
268
+ map . pin "existing" , to : "application.js" , preload : true
269
+ map . pin "missing" , to : "nonexistent.js" , preload : true
270
+ end
271
+
272
+ packages = importmap . preloaded_module_packages ( resolver : ApplicationController . helpers )
273
+
274
+ assert_equal 1 , packages . size
275
+
276
+ existing_path = packages . keys . find { |path | path &.include? ( "application" ) }
277
+ assert existing_path , "Should include existing asset"
278
+ end
279
+
153
280
private
154
281
def generate_importmap_json
155
282
@generate_importmap_json ||= JSON . parse @importmap . to_json ( resolver : ApplicationController . helpers )
0 commit comments