proscenium 0.11.0-x86_64-darwin → 0.12.0-x86_64-darwin
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 +49 -1
- data/lib/proscenium/css_module.rb +8 -0
- data/lib/proscenium/ext/proscenium +0 -0
- data/lib/proscenium/importer.rb +13 -2
- data/lib/proscenium/phlex/asset_inclusions.rb +96 -0
- data/lib/proscenium/phlex.rb +1 -9
- data/lib/proscenium/railtie.rb +2 -2
- data/lib/proscenium/version.rb +1 -1
- metadata +4 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 76d85fd732a66d80f8104ef66fbf03a77e81b9e68e45ccad767d0b8d3f814c3f
         | 
| 4 | 
            +
              data.tar.gz: a47fd7886d8dd72b2efa104e77419ab20dec6a5c218efbca80bb5dfed42cc5d2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: cdf1abe3a0fee2178852ae24b685fb5c92db0c269460884f92d0c40ae634c2fdc4e1a8b7f412d86f8fc2bf660709a2f8776e21c7d97c52335deea7a001a41797
         | 
| 7 | 
            +
              data.tar.gz: 54520808bdc76b4e3efa6e696e7eefcdbfae9610564820adbdeef781972bf6b37dc4181642d3e696a781c22f114c046582b1a95389f3bfc391dc1f8a3c11b551
         | 
    
        data/README.md
    CHANGED
    
    | @@ -46,7 +46,8 @@ Proscenium treats your client-side code as first class citizens of your Rails ap | |
| 46 46 | 
             
            - [ViewComponent Support](#viewcomponent-support)
         | 
| 47 47 | 
             
            - [Cache Busting](#cache-busting)
         | 
| 48 48 | 
             
            - [rjs is back!](#rjs-is-back)
         | 
| 49 | 
            -
            - [ | 
| 49 | 
            +
            - [Resolution](#resolution)
         | 
| 50 | 
            +
              - [Assets from Rails Engines](#assets-from-rails-engines)
         | 
| 50 51 | 
             
            - [Thanks](#thanks)
         | 
| 51 52 | 
             
            - [Development](#development)
         | 
| 52 53 |  | 
| @@ -237,6 +238,32 @@ body { | |
| 237 238 | 
             
            }
         | 
| 238 239 | 
             
            ```
         | 
| 239 240 |  | 
| 241 | 
            +
            ### Unbundling
         | 
| 242 | 
            +
             | 
| 243 | 
            +
            Sometimes you don't want to bundle an import. For example, you want to ensure that only one instance of React is loaded. In this cases, you can use the `unbundle` prefix
         | 
| 244 | 
            +
             | 
| 245 | 
            +
            ```js
         | 
| 246 | 
            +
            import React from 'unbundle:react'
         | 
| 247 | 
            +
            ```
         | 
| 248 | 
            +
             | 
| 249 | 
            +
            This only works any bare and local imports.
         | 
| 250 | 
            +
             | 
| 251 | 
            +
            You can also use the `unbundle` prefix in your import map, which ensures that all imports of a particular path is always unbundled:
         | 
| 252 | 
            +
             | 
| 253 | 
            +
            ```json
         | 
| 254 | 
            +
            {
         | 
| 255 | 
            +
              "imports": {
         | 
| 256 | 
            +
                "react": "unbundle:react"
         | 
| 257 | 
            +
              }
         | 
| 258 | 
            +
            }
         | 
| 259 | 
            +
            ```
         | 
| 260 | 
            +
             | 
| 261 | 
            +
            Then just import as normal:
         | 
| 262 | 
            +
             | 
| 263 | 
            +
            ```js
         | 
| 264 | 
            +
            import React from 'react'
         | 
| 265 | 
            +
            ```
         | 
| 266 | 
            +
             | 
| 240 267 | 
             
            ## Import Maps
         | 
| 241 268 |  | 
| 242 269 | 
             
            > **[WIP]**
         | 
| @@ -644,6 +671,27 @@ class MyView < Proscenium::Phlex | |
| 644 671 | 
             
            end
         | 
| 645 672 | 
             
            ```
         | 
| 646 673 |  | 
| 674 | 
            +
            In your layouts, include `Proscenium::Phlex::AssetInclusions`, and call the `include_assets` helper.
         | 
| 675 | 
            +
             | 
| 676 | 
            +
            ```ruby
         | 
| 677 | 
            +
            class ApplicationLayout < Proscenium::Phlex
         | 
| 678 | 
            +
              include Proscenium::Phlex::AssetInclusions
         | 
| 679 | 
            +
             | 
| 680 | 
            +
              def template(&)
         | 
| 681 | 
            +
                doctype
         | 
| 682 | 
            +
                html do
         | 
| 683 | 
            +
                  head do
         | 
| 684 | 
            +
                    title { 'My Awesome App' }
         | 
| 685 | 
            +
                    include_assets
         | 
| 686 | 
            +
                  end
         | 
| 687 | 
            +
                  body(&)
         | 
| 688 | 
            +
                end
         | 
| 689 | 
            +
              end
         | 
| 690 | 
            +
            end
         | 
| 691 | 
            +
            ```
         | 
| 692 | 
            +
             | 
| 693 | 
            +
            You can specifically include CCS and JS assets using the `include_stylesheets` and `include_javascripts` helpers, allowing you to control where they are included in the HTML.
         | 
| 694 | 
            +
             | 
| 647 695 | 
             
            ### Side-loading
         | 
| 648 696 |  | 
| 649 697 | 
             
            Any Phlex class that inherits `Proscenium::Phlex` will automatically be [side-loaded](#side-loading).
         | 
| @@ -18,10 +18,18 @@ module Proscenium::CssModule | |
| 18 18 | 
             
              # Accepts one or more CSS class names, and transforms them into CSS module names.
         | 
| 19 19 | 
             
              #
         | 
| 20 20 | 
             
              # @param name [String,Symbol,Array<String,Symbol>]
         | 
| 21 | 
            +
              # @return [String] the transformed CSS module names concatenated as a string.
         | 
| 21 22 | 
             
              def css_module(*names)
         | 
| 22 23 | 
             
                cssm.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
         | 
| 23 24 | 
             
              end
         | 
| 24 25 |  | 
| 26 | 
            +
              # @param name [String,Symbol,Array<String,Symbol>]
         | 
| 27 | 
            +
              # @return [String] the transformed CSS module names concatenated as a string.
         | 
| 28 | 
            +
              def class_names(*names)
         | 
| 29 | 
            +
                names = names.flatten.compact
         | 
| 30 | 
            +
                cssm.class_names(*names).map { |name, _| name }.join(' ') unless names.empty?
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 25 33 | 
             
              private
         | 
| 26 34 |  | 
| 27 35 | 
             
              def cssm
         | 
| Binary file | 
    
        data/lib/proscenium/importer.rb
    CHANGED
    
    | @@ -79,14 +79,25 @@ module Proscenium | |
| 79 79 | 
             
                  def each_stylesheet(delete: false)
         | 
| 80 80 | 
             
                    return if imported.blank?
         | 
| 81 81 |  | 
| 82 | 
            -
                    blk = proc  | 
| 82 | 
            +
                    blk = proc do |key, options|
         | 
| 83 | 
            +
                      if key.end_with?(*CSS_EXTENSIONS)
         | 
| 84 | 
            +
                        yield(key, options)
         | 
| 85 | 
            +
                        true
         | 
| 86 | 
            +
                      end
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
             | 
| 83 89 | 
             
                    delete ? imported.delete_if(&blk) : imported.each(&blk)
         | 
| 84 90 | 
             
                  end
         | 
| 85 91 |  | 
| 86 92 | 
             
                  def each_javascript(delete: false)
         | 
| 87 93 | 
             
                    return if imported.blank?
         | 
| 88 94 |  | 
| 89 | 
            -
                    blk = proc  | 
| 95 | 
            +
                    blk = proc do |key, options|
         | 
| 96 | 
            +
                      if key.end_with?(*JS_EXTENSIONS)
         | 
| 97 | 
            +
                        yield(key, options)
         | 
| 98 | 
            +
                        true
         | 
| 99 | 
            +
                      end
         | 
| 100 | 
            +
                    end
         | 
| 90 101 | 
             
                    delete ? imported.delete_if(&blk) : imported.each(&blk)
         | 
| 91 102 | 
             
                  end
         | 
| 92 103 |  | 
| @@ -0,0 +1,96 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Proscenium::Phlex::AssetInclusions
         | 
| 4 | 
            +
              include Phlex::Rails::Helpers::ContentFor
         | 
| 5 | 
            +
              include Phlex::Rails::Helpers::StyleSheetPath
         | 
| 6 | 
            +
              include Phlex::Rails::Helpers::JavaScriptPath
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def include_stylesheets
         | 
| 9 | 
            +
                comment { '[PROSCENIUM_STYLESHEETS]' }
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def include_javascripts(defer_lazy_scripts: false)
         | 
| 13 | 
            +
                comment { '[PROSCENIUM_JAVASCRIPTS]' }
         | 
| 14 | 
            +
                !defer_lazy_scripts && include_lazy_javascripts
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def include_lazy_javascripts
         | 
| 18 | 
            +
                comment { '[PROSCENIUM_LAZY_SCRIPTS]' }
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def include_assets(defer_lazy_scripts: false)
         | 
| 22 | 
            +
                include_stylesheets
         | 
| 23 | 
            +
                include_javascripts(defer_lazy_scripts: defer_lazy_scripts)
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def after_template
         | 
| 27 | 
            +
                super
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                @_buffer.gsub! '<!-- [PROSCENIUM_STYLESHEETS] -->', capture_stylesheets!
         | 
| 30 | 
            +
                @_buffer.gsub! '<!-- [PROSCENIUM_JAVASCRIPTS] -->', capture_javascripts!
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                if content_for?(:proscenium_lazy_scripts)
         | 
| 33 | 
            +
                  flush
         | 
| 34 | 
            +
                  @_buffer.gsub!('<!-- [PROSCENIUM_LAZY_SCRIPTS] -->', capture do
         | 
| 35 | 
            +
                    content_for(:proscenium_lazy_scripts)
         | 
| 36 | 
            +
                  end)
         | 
| 37 | 
            +
                else
         | 
| 38 | 
            +
                  @_buffer.gsub! '<!-- [PROSCENIUM_LAZY_SCRIPTS] -->', ''
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              private
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def capture_stylesheets!
         | 
| 45 | 
            +
                capture do
         | 
| 46 | 
            +
                  Proscenium::Importer.each_stylesheet(delete: true) do |path, _path_options|
         | 
| 47 | 
            +
                    link rel: 'stylesheet', href: stylesheet_path(path, extname: false)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def capture_javascripts! # rubocop:disable Metrics/*
         | 
| 53 | 
            +
                unless Rails.application.config.proscenium.code_splitting &&
         | 
| 54 | 
            +
                       Proscenium::Importer.multiple_js_imported?
         | 
| 55 | 
            +
                  return capture do
         | 
| 56 | 
            +
                    Proscenium::Importer.each_javascript(delete: true) do |path, _|
         | 
| 57 | 
            +
                      script(src: javascript_path(path, extname: false), type: :module)
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                imports = Proscenium::Importer.imported.dup
         | 
| 63 | 
            +
                paths_to_build = []
         | 
| 64 | 
            +
                Proscenium::Importer.each_javascript(delete: true) do |x, _|
         | 
| 65 | 
            +
                  paths_to_build << x.delete_prefix('/')
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                result = Proscenium::Builder.build(paths_to_build.join(';'), base_url: helpers.request.base_url)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                # Remove the react components from the results, so they are not side loaded. Instead they
         | 
| 71 | 
            +
                # are lazy loaded by the component manager.
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                capture do
         | 
| 74 | 
            +
                  scripts = {}
         | 
| 75 | 
            +
                  result.split(';').each do |x|
         | 
| 76 | 
            +
                    inpath, outpath = x.split('::')
         | 
| 77 | 
            +
                    inpath.prepend '/'
         | 
| 78 | 
            +
                    outpath.delete_prefix! 'public'
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    next unless imports.key?(inpath)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    if (import = imports[inpath]).delete(:lazy)
         | 
| 83 | 
            +
                      scripts[inpath] = import.merge(outpath: outpath)
         | 
| 84 | 
            +
                    else
         | 
| 85 | 
            +
                      script(src: javascript_path(outpath, extname: false), type: :module)
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  content_for :proscenium_lazy_scripts do
         | 
| 90 | 
            +
                    script type: 'application/json', id: 'prosceniumLazyScripts' do
         | 
| 91 | 
            +
                      unsafe_raw scripts.to_json
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
            end
         | 
    
        data/lib/proscenium/phlex.rb
    CHANGED
    
    | @@ -8,19 +8,11 @@ module Proscenium | |
| 8 8 |  | 
| 9 9 | 
             
                autoload :CssModules
         | 
| 10 10 | 
             
                autoload :ReactComponent
         | 
| 11 | 
            +
                autoload :AssetInclusions
         | 
| 11 12 |  | 
| 12 | 
            -
                extend ::Phlex::Rails::HelperMacros
         | 
| 13 | 
            -
                include ::Phlex::Rails::Helpers::JavaScriptIncludeTag
         | 
| 14 | 
            -
                include ::Phlex::Rails::Helpers::StyleSheetLinkTag
         | 
| 15 13 | 
             
                include Proscenium::SourcePath
         | 
| 16 14 | 
             
                include CssModules
         | 
| 17 15 |  | 
| 18 | 
            -
                define_output_helper :side_load_stylesheets # deprecated
         | 
| 19 | 
            -
                define_output_helper :include_stylesheets
         | 
| 20 | 
            -
                define_output_helper :side_load_javascripts # deprecated
         | 
| 21 | 
            -
                define_output_helper :include_javascripts
         | 
| 22 | 
            -
                define_output_helper :declare_lazy_scripts
         | 
| 23 | 
            -
             | 
| 24 16 | 
             
                module Sideload
         | 
| 25 17 | 
             
                  def before_template
         | 
| 26 18 | 
             
                    Proscenium::SideLoad.sideload_inheritance_chain self
         | 
    
        data/lib/proscenium/railtie.rb
    CHANGED
    
    | @@ -54,8 +54,8 @@ module Proscenium | |
| 54 54 |  | 
| 55 55 | 
             
                initializer 'proscenium.middleware' do |app|
         | 
| 56 56 | 
             
                  app.middleware.insert_after ActionDispatch::Static, Middleware
         | 
| 57 | 
            -
                   | 
| 58 | 
            -
                   | 
| 57 | 
            +
                  app.middleware.insert_after ActionDispatch::Static, Rack::ETag, 'no-cache'
         | 
| 58 | 
            +
                  app.middleware.insert_after ActionDispatch::Static, Rack::ConditionalGet
         | 
| 59 59 | 
             
                end
         | 
| 60 60 |  | 
| 61 61 | 
             
                initializer 'proscenium.monkey_patches' do
         | 
    
        data/lib/proscenium/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: proscenium
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.12.0
         | 
| 5 5 | 
             
            platform: x86_64-darwin
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Joel Moss
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023-10 | 
| 11 | 
            +
            date: 2023-11-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activesupport
         | 
| @@ -111,6 +111,7 @@ files: | |
| 111 111 | 
             
            - lib/proscenium/middleware/url.rb
         | 
| 112 112 | 
             
            - lib/proscenium/monkey.rb
         | 
| 113 113 | 
             
            - lib/proscenium/phlex.rb
         | 
| 114 | 
            +
            - lib/proscenium/phlex/asset_inclusions.rb
         | 
| 114 115 | 
             
            - lib/proscenium/phlex/css_modules.rb
         | 
| 115 116 | 
             
            - lib/proscenium/phlex/react_component.rb
         | 
| 116 117 | 
             
            - lib/proscenium/railtie.rb
         | 
| @@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 148 149 | 
             
                - !ruby/object:Gem::Version
         | 
| 149 150 | 
             
                  version: '0'
         | 
| 150 151 | 
             
            requirements: []
         | 
| 151 | 
            -
            rubygems_version: 3.4. | 
| 152 | 
            +
            rubygems_version: 3.4.21
         | 
| 152 153 | 
             
            signing_key:
         | 
| 153 154 | 
             
            specification_version: 4
         | 
| 154 155 | 
             
            summary: The engine powering your Rails frontend
         |