importmap-rails 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +29 -1
- data/app/helpers/importmap/importmap_tags_helper.rb +3 -3
- data/lib/importmap/commands.rb +1 -1
- data/lib/importmap/map.rb +15 -5
- data/lib/importmap/npm.rb +1 -1
- data/lib/importmap/packager.rb +11 -5
- data/lib/importmap/version.rb +1 -1
- data/lib/tasks/importmap_tasks.rake +4 -1
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: bec8044eff12e2d9ad0a16b077c6aca6c1fd365ebcb218815910c778407f7f91
         | 
| 4 | 
            +
              data.tar.gz: c6b5ba9bb3b4e80762c1bdf49030d54504e6c865bab7dd8dda0e6df964ac3637
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1f76fcb0a38faba63a48c59c4735d3dc33cc6e24d30e55b689e33e2fb75285461bc7ec7c6684a4325666b3405956069a16c778ad09f26aa40b29d0e05b3fecf3
         | 
| 7 | 
            +
              data.tar.gz: 878c7a4bf22f8b130aaa6cd2f14ef84db3cda9924278a825ff7be98e9c3f0c50aa44adf1d87c207dd51239782470a2ca05c9964c00ecd01e0730a3dff169c6f8
         | 
    
        data/README.md
    CHANGED
    
    | @@ -141,6 +141,25 @@ pin "md5", preload: false # file lives in vendor/javascript/md5.js | |
| 141 141 | 
             
            ...
         | 
| 142 142 | 
             
            ```
         | 
| 143 143 |  | 
| 144 | 
            +
            You can also specify which entry points to preload a particular dependency in by providing `preload:` a string or array of strings.
         | 
| 145 | 
            +
             | 
| 146 | 
            +
            Example:
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            ```ruby
         | 
| 149 | 
            +
            # config/importmap.rb
         | 
| 150 | 
            +
            pin "@github/hotkey", to: "@github--hotkey.js", preload: 'application'
         | 
| 151 | 
            +
            pin "md5", preload: ['application', 'alternate']
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            # app/views/layouts/application.html.erb
         | 
| 154 | 
            +
            <%= javascript_importmap_tags 'alternate' %>
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            # will include the following link before the importmap is setup:
         | 
| 157 | 
            +
            <link rel="modulepreload" href="/assets/javascript/md5.js">
         | 
| 158 | 
            +
            ...
         | 
| 159 | 
            +
            ```
         | 
| 160 | 
            +
             | 
| 161 | 
            +
             | 
| 162 | 
            +
             | 
| 144 163 | 
             
            ## Composing import maps
         | 
| 145 164 |  | 
| 146 165 | 
             
            By default, Rails loads import map definition from the application's `config/importmap.rb` to the `Importmap::Map` object available at `Rails.application.importmap`.
         | 
| @@ -207,7 +226,7 @@ Import your module on the specific page. Note: you'll likely want to use a `cont | |
| 207 226 |  | 
| 208 227 | 
             
            ## Include a digest of the import map in your ETag
         | 
| 209 228 |  | 
| 210 | 
            -
            If you're using [ETags](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) generated by Rails helpers like `stale?` or `fresh_when`, you need to include the digest of the import map into this calculation. Otherwise your application will return  | 
| 229 | 
            +
            If you're using [ETags](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) generated by Rails helpers like `stale?` or `fresh_when`, you need to include the digest of the import map into this calculation. Otherwise your application will return [304](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304) cache responses even when your JavaScript assets have changed. You can avoid this with something like:
         | 
| 211 230 |  | 
| 212 231 | 
             
            ```ruby
         | 
| 213 232 | 
             
            class ApplicationController < ActionController::Base
         | 
| @@ -242,6 +261,15 @@ Importmap for Rails provides two commands to check your pinned packages: | |
| 242 261 | 
             
            - `./bin/importmap outdated` checks the NPM registry for new versions
         | 
| 243 262 | 
             
            - `./bin/importmap audit` checks the NPM registry for known security issues
         | 
| 244 263 |  | 
| 264 | 
            +
            ## Supporting legacy browsers such as Safari on iOS 15
         | 
| 265 | 
            +
             | 
| 266 | 
            +
            If you want to support [legacy browsers that do not support import maps](https://caniuse.com/import-maps) such as [iOS 15.8.1 released on 22 Jan 2024](https://support.apple.com/en-us/HT201222), insert [`es-module-shims`](https://github.com/guybedford/es-module-shims) before `javascript_importmap_tags` as below.
         | 
| 267 | 
            +
             | 
| 268 | 
            +
            ```erb
         | 
| 269 | 
            +
            <script async src="https://ga.jspm.io/npm:es-module-shims@1.8.2/dist/es-module-shims.js" data-turbo-track="reload"></script>
         | 
| 270 | 
            +
            <%= javascript_importmap_tags %>
         | 
| 271 | 
            +
            ```
         | 
| 272 | 
            +
             | 
| 245 273 | 
             
            ## License
         | 
| 246 274 |  | 
| 247 275 | 
             
            Importmap for Rails is released under the [MIT License](https://opensource.org/licenses/MIT).
         | 
| @@ -3,7 +3,7 @@ module Importmap::ImportmapTagsHelper | |
| 3 3 | 
             
              def javascript_importmap_tags(entry_point = "application", importmap: Rails.application.importmap)
         | 
| 4 4 | 
             
                safe_join [
         | 
| 5 5 | 
             
                  javascript_inline_importmap_tag(importmap.to_json(resolver: self)),
         | 
| 6 | 
            -
                  javascript_importmap_module_preload_tags(importmap),
         | 
| 6 | 
            +
                  javascript_importmap_module_preload_tags(importmap, entry_point: entry_point),
         | 
| 7 7 | 
             
                  javascript_import_module_tag(entry_point)
         | 
| 8 8 | 
             
                ], "\n"
         | 
| 9 9 | 
             
              end
         | 
| @@ -24,8 +24,8 @@ module Importmap::ImportmapTagsHelper | |
| 24 24 | 
             
              # Link tags for preloading all modules marked as preload: true in the `importmap`
         | 
| 25 25 | 
             
              # (defaults to Rails.application.importmap), such that they'll be fetched
         | 
| 26 26 | 
             
              # in advance by browsers supporting this link type (https://caniuse.com/?search=modulepreload).
         | 
| 27 | 
            -
              def javascript_importmap_module_preload_tags(importmap = Rails.application.importmap)
         | 
| 28 | 
            -
                javascript_module_preload_tag(*importmap.preloaded_module_paths(resolver: self))
         | 
| 27 | 
            +
              def javascript_importmap_module_preload_tags(importmap = Rails.application.importmap, entry_point: "application")
         | 
| 28 | 
            +
                javascript_module_preload_tag(*importmap.preloaded_module_paths(resolver: self, entry_point: entry_point, cache_key: entry_point))
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| 31 31 | 
             
              # Link tag(s) for preloading the JavaScript module residing in `*paths`. Will return one link tag per path element.
         | 
    
        data/lib/importmap/commands.rb
    CHANGED
    
    | @@ -92,7 +92,7 @@ class Importmap::Commands < Thor | |
| 92 92 | 
             
              desc "update", "Update outdated package pins"
         | 
| 93 93 | 
             
              def update
         | 
| 94 94 | 
             
                if (outdated_packages = npm.outdated_packages).any?
         | 
| 95 | 
            -
                  pin | 
| 95 | 
            +
                  pin(*outdated_packages.map(&:name))
         | 
| 96 96 | 
             
                else
         | 
| 97 97 | 
             
                  puts "No outdated packages found"
         | 
| 98 98 | 
             
                end
         | 
    
        data/lib/importmap/map.rb
    CHANGED
    
    | @@ -40,9 +40,9 @@ class Importmap::Map | |
| 40 40 | 
             
              # resolver that has been configured for the `asset_host` you want these resolved paths to use. In case you need to
         | 
| 41 41 | 
             
              # resolve for different asset hosts, you can pass in a custom `cache_key` to vary the cache used by this method for
         | 
| 42 42 | 
             
              # the different cases.
         | 
| 43 | 
            -
              def preloaded_module_paths(resolver:, cache_key: :preloaded_module_paths)
         | 
| 43 | 
            +
              def preloaded_module_paths(resolver:, entry_point: "application", cache_key: :preloaded_module_paths)
         | 
| 44 44 | 
             
                cache_as(cache_key) do
         | 
| 45 | 
            -
                  resolve_asset_paths(expanded_preloading_packages_and_directories, resolver: resolver).values
         | 
| 45 | 
            +
                  resolve_asset_paths(expanded_preloading_packages_and_directories(entry_point: entry_point), resolver: resolver).values
         | 
| 46 46 | 
             
                end
         | 
| 47 47 | 
             
              end
         | 
| 48 48 |  | 
| @@ -118,8 +118,8 @@ class Importmap::Map | |
| 118 118 | 
             
                  end.compact
         | 
| 119 119 | 
             
                end
         | 
| 120 120 |  | 
| 121 | 
            -
                def expanded_preloading_packages_and_directories
         | 
| 122 | 
            -
                  expanded_packages_and_directories.select { |name, mapping| mapping.preload }
         | 
| 121 | 
            +
                def expanded_preloading_packages_and_directories(entry_point:)
         | 
| 122 | 
            +
                  expanded_packages_and_directories.select { |name, mapping| mapping.preload.in?([true, false]) ? mapping.preload : (Array(mapping.preload) & Array(entry_point)).any? }
         | 
| 123 123 | 
             
                end
         | 
| 124 124 |  | 
| 125 125 | 
             
                def expanded_packages_and_directories
         | 
| @@ -141,7 +141,17 @@ class Importmap::Map | |
| 141 141 | 
             
                end
         | 
| 142 142 |  | 
| 143 143 | 
             
                def module_name_from(filename, mapping)
         | 
| 144 | 
            -
                   | 
| 144 | 
            +
                  # Regex explanation:
         | 
| 145 | 
            +
                  # (?:\/|^) # Matches either / OR the start of the string
         | 
| 146 | 
            +
                  # index   # Matches the word index
         | 
| 147 | 
            +
                  # $       # Matches the end of the string
         | 
| 148 | 
            +
                  #
         | 
| 149 | 
            +
                  # Sample matches
         | 
| 150 | 
            +
                  # index
         | 
| 151 | 
            +
                  # folder/index
         | 
| 152 | 
            +
                  index_regex = /(?:\/|^)index$/
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  [ mapping.under, filename.to_s.remove(filename.extname).remove(index_regex).presence ].compact.join("/")
         | 
| 145 155 | 
             
                end
         | 
| 146 156 |  | 
| 147 157 | 
             
                def module_path_from(filename, mapping)
         | 
    
        data/lib/importmap/npm.rb
    CHANGED
    
    | @@ -86,7 +86,7 @@ class Importmap::Npm | |
| 86 86 | 
             
                end
         | 
| 87 87 |  | 
| 88 88 | 
             
                def find_latest_version(response)
         | 
| 89 | 
            -
                  latest_version = response.dig('dist-tags', 'latest')
         | 
| 89 | 
            +
                  latest_version = response.is_a?(String) ? response : response.dig('dist-tags', 'latest')
         | 
| 90 90 | 
             
                  return latest_version if latest_version
         | 
| 91 91 |  | 
| 92 92 | 
             
                  return unless response['versions']
         | 
    
        data/lib/importmap/packager.rb
    CHANGED
    
    | @@ -19,10 +19,10 @@ class Importmap::Packager | |
| 19 19 |  | 
| 20 20 | 
             
              def import(*packages, env: "production", from: "jspm")
         | 
| 21 21 | 
             
                response = post_json({
         | 
| 22 | 
            -
                  "install"      => Array(packages), | 
| 22 | 
            +
                  "install"      => Array(packages),
         | 
| 23 23 | 
             
                  "flattenScope" => true,
         | 
| 24 24 | 
             
                  "env"          => [ "browser", "module", env ],
         | 
| 25 | 
            -
                  "provider"     => from | 
| 25 | 
            +
                  "provider"     => normalize_provider(from)
         | 
| 26 26 | 
             
                })
         | 
| 27 27 |  | 
| 28 28 | 
             
                case response.code
         | 
| @@ -69,6 +69,10 @@ class Importmap::Packager | |
| 69 69 | 
             
                  raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
         | 
| 70 70 | 
             
                end
         | 
| 71 71 |  | 
| 72 | 
            +
                def normalize_provider(name)
         | 
| 73 | 
            +
                  name.to_s == "jspm" ? "jspm.io" : name.to_s
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 72 76 | 
             
                def extract_parsed_imports(response)
         | 
| 73 77 | 
             
                  JSON.parse(response.body).dig("map", "imports")
         | 
| 74 78 | 
             
                end
         | 
| @@ -80,7 +84,7 @@ class Importmap::Packager | |
| 80 84 | 
             
                    raise HTTPError, "Unexpected response code (#{response.code})"
         | 
| 81 85 | 
             
                  end
         | 
| 82 86 | 
             
                end
         | 
| 83 | 
            -
             | 
| 87 | 
            +
             | 
| 84 88 | 
             
                def parse_service_error(response)
         | 
| 85 89 | 
             
                  JSON.parse(response.body.to_s)["error"]
         | 
| 86 90 | 
             
                rescue JSON::ParserError
         | 
| @@ -113,14 +117,16 @@ class Importmap::Packager | |
| 113 117 | 
             
                  response = Net::HTTP.get_response(URI(url))
         | 
| 114 118 |  | 
| 115 119 | 
             
                  if response.code == "200"
         | 
| 116 | 
            -
                    save_vendored_package(package, response.body)
         | 
| 120 | 
            +
                    save_vendored_package(package, url, response.body)
         | 
| 117 121 | 
             
                  else
         | 
| 118 122 | 
             
                    handle_failure_response(response)
         | 
| 119 123 | 
             
                  end
         | 
| 120 124 | 
             
                end
         | 
| 121 125 |  | 
| 122 | 
            -
                def save_vendored_package(package, source)
         | 
| 126 | 
            +
                def save_vendored_package(package, url, source)
         | 
| 123 127 | 
             
                  File.open(vendored_package_path(package), "w+") do |vendored_package|
         | 
| 128 | 
            +
                    vendored_package.write "// #{package}#{extract_package_version_from(url)} downloaded from #{url}\n\n"
         | 
| 129 | 
            +
             | 
| 124 130 | 
             
                    vendored_package.write remove_sourcemap_comment_from(source).force_encoding("UTF-8")
         | 
| 125 131 | 
             
                  end
         | 
| 126 132 | 
             
                end
         | 
    
        data/lib/importmap/version.rb
    CHANGED
    
    
| @@ -1,6 +1,9 @@ | |
| 1 1 | 
             
            namespace :importmap do
         | 
| 2 2 | 
             
              desc "Setup Importmap for the app"
         | 
| 3 3 | 
             
              task :install do
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                previous_location = ENV["LOCATION"]
         | 
| 5 | 
            +
                ENV["LOCATION"] = File.expand_path("../install/install.rb", __dir__)
         | 
| 6 | 
            +
                Rake::Task["app:template"].invoke
         | 
| 7 | 
            +
                ENV["LOCATION"] = previous_location
         | 
| 5 8 | 
             
              end
         | 
| 6 9 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: importmap-rails
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.0. | 
| 4 | 
            +
              version: 2.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David Heinemeier Hansson
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-10-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: railties
         | 
| @@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 95 95 | 
             
                - !ruby/object:Gem::Version
         | 
| 96 96 | 
             
                  version: '0'
         | 
| 97 97 | 
             
            requirements: []
         | 
| 98 | 
            -
            rubygems_version: 3. | 
| 98 | 
            +
            rubygems_version: 3.2.33
         | 
| 99 99 | 
             
            signing_key:
         | 
| 100 100 | 
             
            specification_version: 4
         | 
| 101 101 | 
             
            summary: Use ESM with importmap to manage modern JavaScript in Rails without transpiling
         |