bridgetown-core 1.2.0.beta5 → 1.3.0.beta1
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/bridgetown-core.gemspec +21 -23
- data/lib/bridgetown-core/collection.rb +1 -1
- data/lib/bridgetown-core/commands/new.rb +2 -0
- data/lib/bridgetown-core/commands/plugins.rb +19 -13
- data/lib/bridgetown-core/concerns/front_matter_importer.rb +2 -2
- data/lib/bridgetown-core/configuration/configuration_dsl.rb +6 -2
- data/lib/bridgetown-core/configuration.rb +1 -1
- data/lib/bridgetown-core/configurations/purgecss.rb +1 -1
- data/lib/bridgetown-core/errors.rb +10 -1
- data/lib/bridgetown-core/liquid_renderer/table.rb +3 -1
- data/lib/bridgetown-core/model/repo_origin.rb +2 -2
- data/lib/bridgetown-core/rack/boot.rb +13 -1
- data/lib/bridgetown-core/rack/routes.rb +40 -6
- data/lib/bridgetown-core/readers/layout_reader.rb +2 -2
- data/lib/bridgetown-core/utils/loaders_manager.rb +4 -0
- data/lib/bridgetown-core/utils.rb +18 -0
- data/lib/bridgetown-core/version.rb +2 -2
- data/lib/bridgetown-core/watcher.rb +1 -1
- data/lib/bridgetown-core.rb +54 -0
- data/lib/roda/plugins/bridgetown_server.rb +140 -0
- data/lib/site_template/Gemfile.erb +6 -3
- data/lib/site_template/server/roda_app.rb +4 -2
- data/lib/site_template/src/_posts/0000-00-00-welcome-to-bridgetown.md.erb +1 -1
- metadata +8 -39
- data/lib/bridgetown-core/commands/serve/servlet.rb +0 -68
- data/lib/bridgetown-core/commands/serve.rb +0 -253
- data/lib/bridgetown-core/rack/roda.rb +0 -157
- data/lib/roda/plugins/bridgetown_boot.rb +0 -25
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9176399e9b750178476e2d57edb346989426407d5d40e8958c5be3901626f77f
         | 
| 4 | 
            +
              data.tar.gz: a5130e5511c64acba6e6ee619a7529b49415e1c25b3e056cf4e709c4d78361da
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 849bff55f1997483ce24f67536daec7bdd53ff016d7e4ab8937b0184892680eb59f159d3a3d26c22fbc63ef63486ddd1b793943cd21fead6c281f0d2d9698f69
         | 
| 7 | 
            +
              data.tar.gz: e5c317edb3ae4e232cd2a56c885b44af5375d7daeff71f385e620d402cbe57c68cf32fdc6eb13508bb92e3e8dff254cf53e59f56790631692eee092c6eaa0463
         | 
    
        data/bridgetown-core.gemspec
    CHANGED
    
    | @@ -31,27 +31,25 @@ Gem::Specification.new do |s| | |
| 31 31 |  | 
| 32 32 | 
             
              s.required_ruby_version     = ">= 2.7.0"
         | 
| 33 33 |  | 
| 34 | 
            -
              s.add_runtime_dependency("activemodel", | 
| 35 | 
            -
              s.add_runtime_dependency("activesupport", | 
| 36 | 
            -
              s.add_runtime_dependency("addressable", | 
| 37 | 
            -
              s.add_runtime_dependency("amazing_print", | 
| 38 | 
            -
              s.add_runtime_dependency("colorator", | 
| 39 | 
            -
              s.add_runtime_dependency("erubi", | 
| 40 | 
            -
              s.add_runtime_dependency("faraday", | 
| 41 | 
            -
              s.add_runtime_dependency(" | 
| 42 | 
            -
              s.add_runtime_dependency("hash_with_dot_access", | 
| 43 | 
            -
              s.add_runtime_dependency("i18n", | 
| 44 | 
            -
              s.add_runtime_dependency("kramdown", | 
| 45 | 
            -
              s.add_runtime_dependency("kramdown-parser-gfm", | 
| 46 | 
            -
              s.add_runtime_dependency("liquid", | 
| 47 | 
            -
              s.add_runtime_dependency("listen", | 
| 48 | 
            -
              s.add_runtime_dependency("rake", | 
| 49 | 
            -
              s.add_runtime_dependency("roda", | 
| 50 | 
            -
              s.add_runtime_dependency("rouge", | 
| 51 | 
            -
              s.add_runtime_dependency("serbea", | 
| 52 | 
            -
              s.add_runtime_dependency(" | 
| 53 | 
            -
              s.add_runtime_dependency(" | 
| 54 | 
            -
              s.add_runtime_dependency(" | 
| 55 | 
            -
              s.add_runtime_dependency("webrick",               "~> 1.7")
         | 
| 56 | 
            -
              s.add_runtime_dependency("zeitwerk",              "~> 2.5")
         | 
| 34 | 
            +
              s.add_runtime_dependency("activemodel",               [">= 6.0", "< 8.0"])
         | 
| 35 | 
            +
              s.add_runtime_dependency("activesupport",             [">= 6.0", "< 8.0"])
         | 
| 36 | 
            +
              s.add_runtime_dependency("addressable",               "~> 2.4")
         | 
| 37 | 
            +
              s.add_runtime_dependency("amazing_print",             "~> 1.2")
         | 
| 38 | 
            +
              s.add_runtime_dependency("colorator",                 "~> 1.0")
         | 
| 39 | 
            +
              s.add_runtime_dependency("erubi",                     "~> 1.9")
         | 
| 40 | 
            +
              s.add_runtime_dependency("faraday",                   "~> 2.0")
         | 
| 41 | 
            +
              s.add_runtime_dependency("faraday-follow_redirects",  "~> 0.3")
         | 
| 42 | 
            +
              s.add_runtime_dependency("hash_with_dot_access",      "~> 1.2")
         | 
| 43 | 
            +
              s.add_runtime_dependency("i18n",                      "~> 1.0")
         | 
| 44 | 
            +
              s.add_runtime_dependency("kramdown",                  "~> 2.1")
         | 
| 45 | 
            +
              s.add_runtime_dependency("kramdown-parser-gfm",       "~> 1.0")
         | 
| 46 | 
            +
              s.add_runtime_dependency("liquid",                    "~> 5.0")
         | 
| 47 | 
            +
              s.add_runtime_dependency("listen",                    "~> 3.0")
         | 
| 48 | 
            +
              s.add_runtime_dependency("rake",                      ">= 13.0")
         | 
| 49 | 
            +
              s.add_runtime_dependency("roda",                      "~> 3.46")
         | 
| 50 | 
            +
              s.add_runtime_dependency("rouge",                     "~> 3.0")
         | 
| 51 | 
            +
              s.add_runtime_dependency("serbea",                    "~> 1.0")
         | 
| 52 | 
            +
              s.add_runtime_dependency("thor",                      "~> 1.1")
         | 
| 53 | 
            +
              s.add_runtime_dependency("tilt",                      "~> 2.0")
         | 
| 54 | 
            +
              s.add_runtime_dependency("zeitwerk",                  "~> 2.5")
         | 
| 57 55 | 
             
            end
         | 
| @@ -282,7 +282,7 @@ module Bridgetown | |
| 282 282 | 
             
                  if model_is_multi_locale?(model, model_relative_path)
         | 
| 283 283 | 
             
                    # If the model specifies a locales key, use that to determine the
         | 
| 284 284 | 
             
                    # the locale of each resource, otherwise fall back to `site.config.available_locales`
         | 
| 285 | 
            -
                    locales = model.locales || site.config.available_locales
         | 
| 285 | 
            +
                    locales = model.attributes[:locales] || site.config.available_locales
         | 
| 286 286 |  | 
| 287 287 | 
             
                    locales.each do |locale|
         | 
| 288 288 | 
             
                      model.locale = locale.to_sym
         | 
| @@ -80,6 +80,8 @@ module Bridgetown | |
| 80 80 | 
             
                    after_install new_site_path, args.join(" "), options
         | 
| 81 81 | 
             
                  rescue ArgumentError => e
         | 
| 82 82 | 
             
                    say_status :alert, e.message, :red
         | 
| 83 | 
            +
                  ensure
         | 
| 84 | 
            +
                    self.class.created_site_dir = nil # reset afterwards, otherwise hanging tmp dirs in test
         | 
| 83 85 | 
             
                  end
         | 
| 84 86 |  | 
| 85 87 | 
             
                  protected
         | 
| @@ -126,7 +126,7 @@ module Bridgetown | |
| 126 126 | 
             
                    Layouts, you'd run:\n
         | 
| 127 127 | 
             
                    bridgetown plugins cd SamplePlugin/Layouts
         | 
| 128 128 | 
             
                  DOC
         | 
| 129 | 
            -
                  desc "cd <origin/dir>", "Open  | 
| 129 | 
            +
                  desc "cd <origin/dir>", "Open content folder within the plugin origin"
         | 
| 130 130 |  | 
| 131 131 | 
             
                  # This is super useful if you want to copy files out of plugins to override.
         | 
| 132 132 | 
             
                  #
         | 
| @@ -177,38 +177,43 @@ module Bridgetown | |
| 177 177 | 
             
                    end
         | 
| 178 178 | 
             
                  end
         | 
| 179 179 |  | 
| 180 | 
            -
                  desc "new NAME", "Create a new plugin NAME  | 
| 180 | 
            +
                  desc "new NAME", "Create a new plugin NAME (snake_case_name_preferred)"
         | 
| 181 181 | 
             
                  def new(name)
         | 
| 182 182 | 
             
                    folder_name = name.underscore
         | 
| 183 183 | 
             
                    module_name = folder_name.camelize
         | 
| 184 184 |  | 
| 185 | 
            -
                    run "git clone  | 
| 186 | 
            -
                    new_gemspec = "#{ | 
| 185 | 
            +
                    run "git clone https://github.com/bridgetownrb/bridgetown-sample-plugin #{name}"
         | 
| 186 | 
            +
                    new_gemspec = "#{folder_name}.gemspec"
         | 
| 187 187 |  | 
| 188 188 | 
             
                    inside name do # rubocop:todo Metrics/BlockLength
         | 
| 189 189 | 
             
                      destroy_existing_repo
         | 
| 190 190 | 
             
                      initialize_new_repo
         | 
| 191 191 |  | 
| 192 | 
            -
                      FileUtils.mv " | 
| 192 | 
            +
                      FileUtils.mv "sample_plugin.gemspec", new_gemspec
         | 
| 193 193 | 
             
                      gsub_file new_gemspec, "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
         | 
| 194 194 | 
             
                      gsub_file new_gemspec, "bridgetown-sample-plugin", name
         | 
| 195 | 
            -
                      gsub_file new_gemspec, " | 
| 195 | 
            +
                      gsub_file new_gemspec, "sample_plugin", folder_name
         | 
| 196 196 | 
             
                      gsub_file new_gemspec, "SamplePlugin", module_name
         | 
| 197 197 |  | 
| 198 198 | 
             
                      gsub_file "package.json", "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
         | 
| 199 199 | 
             
                      gsub_file "package.json", "bridgetown-sample-plugin", name
         | 
| 200 | 
            +
                      gsub_file "package.json", "sample_plugin", folder_name
         | 
| 200 201 |  | 
| 201 202 | 
             
                      FileUtils.mv "lib/sample_plugin.rb", "lib/#{folder_name}.rb"
         | 
| 202 | 
            -
                      gsub_file "lib/#{ | 
| 203 | 
            -
                      gsub_file "lib/#{ | 
| 203 | 
            +
                      gsub_file "lib/#{folder_name}.rb", "sample_plugin", folder_name
         | 
| 204 | 
            +
                      gsub_file "lib/#{folder_name}.rb", "SamplePlugin", module_name
         | 
| 204 205 |  | 
| 205 206 | 
             
                      FileUtils.mv "lib/sample_plugin", "lib/#{folder_name}"
         | 
| 206 | 
            -
                      gsub_file "lib/#{ | 
| 207 | 
            -
                      gsub_file "lib/#{ | 
| 207 | 
            +
                      gsub_file "lib/#{folder_name}/builder.rb", "SamplePlugin", module_name
         | 
| 208 | 
            +
                      gsub_file "lib/#{folder_name}/builder.rb", "sample_plugin", folder_name
         | 
| 209 | 
            +
                      gsub_file "lib/#{folder_name}/version.rb", "SamplePlugin", module_name
         | 
| 208 210 |  | 
| 209 211 | 
             
                      FileUtils.mv "test/test_sample_plugin.rb", "test/test_#{folder_name}.rb"
         | 
| 210 212 | 
             
                      gsub_file "test/test_#{folder_name}.rb", "SamplePlugin", module_name
         | 
| 211 | 
            -
                      gsub_file "test/ | 
| 213 | 
            +
                      gsub_file "test/test_#{folder_name}.rb", "sample plugin", module_name
         | 
| 214 | 
            +
                      gsub_file "test/helper.rb", "sample_plugin", folder_name
         | 
| 215 | 
            +
                      gsub_file "test/fixtures/src/index.html", "sample_plugin", folder_name
         | 
| 216 | 
            +
                      gsub_file "test/fixtures/config/initializers.rb", "sample_plugin", folder_name
         | 
| 212 217 |  | 
| 213 218 | 
             
                      FileUtils.mv "components/sample_plugin", "components/#{folder_name}"
         | 
| 214 219 | 
             
                      FileUtils.mv "content/sample_plugin", "content/#{folder_name}"
         | 
| @@ -220,14 +225,15 @@ module Bridgetown | |
| 220 225 |  | 
| 221 226 | 
             
                      gsub_file "components/#{folder_name}/plugin_component.rb", "SamplePlugin", module_name
         | 
| 222 227 |  | 
| 223 | 
            -
                      gsub_file "frontend/javascript/index.js", " | 
| 228 | 
            +
                      gsub_file "frontend/javascript/index.js", "sample_plugin", folder_name
         | 
| 224 229 | 
             
                      gsub_file "frontend/javascript/index.js", "SamplePlugin", module_name
         | 
| 230 | 
            +
                      gsub_file "frontend/styles/index.css", "sample_plugin", folder_name
         | 
| 225 231 | 
             
                    end
         | 
| 226 232 | 
             
                    say ""
         | 
| 227 233 | 
             
                    say_status "Done!", "Have fun writing your new #{name} plugin :)"
         | 
| 228 234 | 
             
                    say_status "Remember:", "Don't forget to rename the SamplePlugin" \
         | 
| 229 235 | 
             
                                            " code identifiers and paths to your own" \
         | 
| 230 | 
            -
                                            "  | 
| 236 | 
            +
                                            " identifier, as well as update your README" \
         | 
| 231 237 | 
             
                                            " and CHANGELOG files as necessary."
         | 
| 232 238 | 
             
                  end
         | 
| 233 239 |  | 
| @@ -9,9 +9,9 @@ module Bridgetown | |
| 9 9 |  | 
| 10 10 | 
             
                YAML_HEADER = %r!\A---\s*\n!.freeze
         | 
| 11 11 | 
             
                YAML_BLOCK = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
         | 
| 12 | 
            -
                RUBY_HEADER = %r!\A[ | 
| 12 | 
            +
                RUBY_HEADER = %r!\A[~`#-]{3,}(?:ruby|<%|{%)\s*\n!.freeze
         | 
| 13 13 | 
             
                RUBY_BLOCK =
         | 
| 14 | 
            -
                  %r!#{RUBY_HEADER.source}(.*?\n?)^((?:%>|%})?[ | 
| 14 | 
            +
                  %r!#{RUBY_HEADER.source}(.*?\n?)^((?:%>|%})?[~`#-]{3,}\s*$\n?)!m.freeze
         | 
| 15 15 |  | 
| 16 16 | 
             
                def read_front_matter(file_path) # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
         | 
| 17 17 | 
             
                  file_contents = File.read(
         | 
| @@ -49,7 +49,7 @@ module Bridgetown | |
| 49 49 | 
             
                    priority: Bridgetown::Hooks::DEFAULT_PRIORITY,
         | 
| 50 50 | 
             
                    &block
         | 
| 51 51 | 
             
                  )
         | 
| 52 | 
            -
                    Bridgetown::Hooks.register_one(owner, event, priority: priority, &block)
         | 
| 52 | 
            +
                    Bridgetown::Hooks.register_one(owner, event, priority: priority, reloadable: false, &block)
         | 
| 53 53 | 
             
                  end
         | 
| 54 54 |  | 
| 55 55 | 
             
                  def source_manifest(**kwargs)
         | 
| @@ -72,6 +72,10 @@ module Bridgetown | |
| 72 72 | 
             
                    @scope.roda_initializers << block
         | 
| 73 73 | 
             
                  end
         | 
| 74 74 |  | 
| 75 | 
            +
                  def timezone(tz) # rubocop:disable Naming/MethodParameterName
         | 
| 76 | 
            +
                    Bridgetown.set_timezone(tz)
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 75 79 | 
             
                  def method_missing(key, *value, &block) # rubocop:disable Style/MissingRespondToMissing
         | 
| 76 80 | 
             
                    return get(key) if value.empty? && block.nil?
         | 
| 77 81 |  | 
| @@ -132,7 +136,7 @@ module Bridgetown | |
| 132 136 |  | 
| 133 137 | 
             
                    if require_initializer
         | 
| 134 138 | 
             
                      init_file_name = File.join(@scope.root_dir, "config", "#{name}.rb")
         | 
| 135 | 
            -
                       | 
| 139 | 
            +
                      load(init_file_name) if File.exist?(init_file_name)
         | 
| 136 140 | 
             
                    end
         | 
| 137 141 |  | 
| 138 142 | 
             
                    @scope.initializers[name.to_sym]
         | 
| @@ -134,7 +134,7 @@ module Bridgetown | |
| 134 134 | 
             
                  initializers_file = File.join(root_dir, "config", "initializers.rb")
         | 
| 135 135 | 
             
                  return unless File.file?(initializers_file)
         | 
| 136 136 |  | 
| 137 | 
            -
                   | 
| 137 | 
            +
                  load initializers_file
         | 
| 138 138 |  | 
| 139 139 | 
             
                  return unless initializers # no initializers have been set up
         | 
| 140 140 |  | 
| @@ -31,7 +31,7 @@ create_builder "purgecss.rb" do | |
| 31 31 | 
             
                        manifest = JSON.parse(File.read(manifest_file))
         | 
| 32 32 |  | 
| 33 33 | 
             
                        if Bridgetown::Utils.frontend_bundler_type == :esbuild
         | 
| 34 | 
            -
                          css_file = manifest["styles/index.css"].split("/").last
         | 
| 34 | 
            +
                          css_file = (manifest["styles/index.css"] || manifest["styles/index.scss"]).split("/").last
         | 
| 35 35 | 
             
                          css_path = ["output", "_bridgetown", "static", css_file].join("/")
         | 
| 36 36 | 
             
                        else
         | 
| 37 37 | 
             
                          css_file = manifest["main.css"].split("/").last
         | 
| @@ -15,10 +15,13 @@ module Bridgetown | |
| 15 15 | 
             
                InvalidURLError             = Class.new(FatalException)
         | 
| 16 16 | 
             
                InvalidConfigurationError   = Class.new(FatalException)
         | 
| 17 17 |  | 
| 18 | 
            -
                def self.print_build_error(exc, trace: false, logger: Bridgetown.logger)
         | 
| 18 | 
            +
                def self.print_build_error(exc, trace: false, logger: Bridgetown.logger, server: false) # rubocop:disable Metrics
         | 
| 19 19 | 
             
                  logger.error "Exception raised:", exc.class.to_s.bold
         | 
| 20 20 | 
             
                  logger.error exc.message.reset_ansi
         | 
| 21 21 |  | 
| 22 | 
            +
                  build_errors_file = Bridgetown.build_errors_path if !server && Bridgetown::Current.site
         | 
| 23 | 
            +
                  build_errors_data = "#{exc.class}: #{exc.message}"
         | 
| 24 | 
            +
             | 
| 22 25 | 
             
                  trace_args = ["-t", "--trace"]
         | 
| 23 26 | 
             
                  print_trace_msg = true
         | 
| 24 27 | 
             
                  traces = if trace || ARGV.find { |arg| trace_args.include?(arg) }
         | 
| @@ -29,6 +32,12 @@ module Bridgetown | |
| 29 32 | 
             
                           end
         | 
| 30 33 | 
             
                  traces.each_with_index do |backtrace_line, index|
         | 
| 31 34 | 
             
                    logger.error "#{index + 1}:", backtrace_line.reset_ansi
         | 
| 35 | 
            +
                    build_errors_data << "\n#{backtrace_line}" if index < 2
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  if build_errors_file
         | 
| 39 | 
            +
                    FileUtils.mkdir_p(File.dirname(build_errors_file))
         | 
| 40 | 
            +
                    File.write(build_errors_file, build_errors_data, mode: "w")
         | 
| 32 41 | 
             
                  end
         | 
| 33 42 |  | 
| 34 43 | 
             
                  return unless print_trace_msg
         | 
| @@ -7,9 +7,9 @@ module Bridgetown | |
| 7 7 | 
             
                  include Bridgetown::Utils::RubyFrontMatterDSL
         | 
| 8 8 |  | 
| 9 9 | 
             
                  YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
         | 
| 10 | 
            -
                  RUBY_FRONT_MATTER_HEADER = %r!\A[ | 
| 10 | 
            +
                  RUBY_FRONT_MATTER_HEADER = %r!\A[~`#-]{3,}(?:ruby|<%|{%)\s*\n!.freeze
         | 
| 11 11 | 
             
                  RUBY_FRONT_MATTER_REGEXP =
         | 
| 12 | 
            -
                    %r!#{RUBY_FRONT_MATTER_HEADER.source}(.*?\n?)^((?:%>|%})?[ | 
| 12 | 
            +
                    %r!#{RUBY_FRONT_MATTER_HEADER.source}(.*?\n?)^((?:%>|%})?[~`#-]{3,}\s*$\n?)!m.freeze
         | 
| 13 13 |  | 
| 14 14 | 
             
                  # @return [String]
         | 
| 15 15 | 
             
                  attr_accessor :content
         | 
| @@ -8,12 +8,22 @@ require "roda/plugins/public" | |
| 8 8 | 
             
            Bridgetown::Current.preloaded_configuration ||= Bridgetown.configuration
         | 
| 9 9 |  | 
| 10 10 | 
             
            require_relative "logger"
         | 
| 11 | 
            -
            require_relative "roda"
         | 
| 12 11 | 
             
            require_relative "routes"
         | 
| 13 12 | 
             
            require_relative "static_indexes"
         | 
| 14 13 |  | 
| 15 14 | 
             
            module Bridgetown
         | 
| 16 15 | 
             
              module Rack
         | 
| 16 | 
            +
                class Roda < ::Roda
         | 
| 17 | 
            +
                  def self.inherited(klass)
         | 
| 18 | 
            +
                    Bridgetown::Deprecator.deprecation_message(
         | 
| 19 | 
            +
                      "The `Bridgetown::Rack::Roda' class will be removed in favor of using the " \
         | 
| 20 | 
            +
                      "`bridgetown_server' plugin in a future version"
         | 
| 21 | 
            +
                    )
         | 
| 22 | 
            +
                    super
         | 
| 23 | 
            +
                    klass.plugin :bridgetown_server
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 17 27 | 
             
                class << self
         | 
| 18 28 | 
             
                  # @return [Bridgetown::Utils::LoadersManager]
         | 
| 19 29 | 
             
                  attr_accessor :loaders_manager
         | 
| @@ -56,6 +66,8 @@ module Bridgetown | |
| 56 66 | 
             
                        loader.reload
         | 
| 57 67 | 
             
                        loader.eager_load
         | 
| 58 68 | 
             
                        Bridgetown::Rack::Routes.reload_subclasses
         | 
| 69 | 
            +
                      rescue SyntaxError => e
         | 
| 70 | 
            +
                        Bridgetown::Errors.print_build_error(e)
         | 
| 59 71 | 
             
                      end.start
         | 
| 60 72 | 
             
                    end
         | 
| 61 73 | 
             
                  end
         | 
| @@ -20,6 +20,37 @@ module Bridgetown | |
| 20 20 | 
             
                  }.freeze
         | 
| 21 21 |  | 
| 22 22 | 
             
                  class << self
         | 
| 23 | 
            +
                    # rubocop:disable Bridgetown/NoPutsAllowed, Metrics/MethodLength
         | 
| 24 | 
            +
                    def print_routes
         | 
| 25 | 
            +
                      # TODO: this needs to be fully documented
         | 
| 26 | 
            +
                      routes = begin
         | 
| 27 | 
            +
                        JSON.parse(
         | 
| 28 | 
            +
                          File.read(
         | 
| 29 | 
            +
                            File.join(Bridgetown::Current.preloaded_configuration.root_dir, ".routes.json")
         | 
| 30 | 
            +
                          )
         | 
| 31 | 
            +
                        )
         | 
| 32 | 
            +
                      rescue StandardError
         | 
| 33 | 
            +
                        []
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                      puts
         | 
| 36 | 
            +
                      puts "Routes:"
         | 
| 37 | 
            +
                      puts "======="
         | 
| 38 | 
            +
                      if routes.blank?
         | 
| 39 | 
            +
                        puts "No routes found. Have you commented all of your routes?"
         | 
| 40 | 
            +
                        puts "Documentation: https://github.com/jeremyevans/roda-route_list#basic-usage-"
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      routes.each do |route|
         | 
| 44 | 
            +
                        puts [
         | 
| 45 | 
            +
                          route["methods"]&.join("|") || "GET",
         | 
| 46 | 
            +
                          route["path"],
         | 
| 47 | 
            +
                          route["file"] ? "\n  File: #{route["file"]}" : nil,
         | 
| 48 | 
            +
                        ].compact.join(" ")
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
                      puts
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                    # rubocop:enable Bridgetown/NoPutsAllowed, Metrics/MethodLength
         | 
| 53 | 
            +
             | 
| 23 54 | 
             
                    # @return [Hash<String, Class(Routes)>]
         | 
| 24 55 | 
             
                    attr_accessor :tracked_subclasses
         | 
| 25 56 |  | 
| @@ -80,7 +111,7 @@ module Bridgetown | |
| 80 111 | 
             
                    # Initialize a new Routes instance and execute the route as part of the
         | 
| 81 112 | 
             
                    # Roda app request cycle
         | 
| 82 113 | 
             
                    #
         | 
| 83 | 
            -
                    # @param roda_app [ | 
| 114 | 
            +
                    # @param roda_app [Roda]
         | 
| 84 115 | 
             
                    def merge(roda_app)
         | 
| 85 116 | 
             
                      return unless router_block
         | 
| 86 117 |  | 
| @@ -90,7 +121,7 @@ module Bridgetown | |
| 90 121 | 
             
                    # Start the Roda app request cycle. There are two different code paths
         | 
| 91 122 | 
             
                    # depending on if there's a site `base_path` configured
         | 
| 92 123 | 
             
                    #
         | 
| 93 | 
            -
                    # @param roda_app [ | 
| 124 | 
            +
                    # @param roda_app [Roda]
         | 
| 94 125 | 
             
                    # @return [void]
         | 
| 95 126 | 
             
                    def start!(roda_app)
         | 
| 96 127 | 
             
                      if Bridgetown::Current.preloaded_configuration.base_path == "/"
         | 
| @@ -112,7 +143,7 @@ module Bridgetown | |
| 112 143 | 
             
                    # run through all the Routes blocks. If the file-based router plugin
         | 
| 113 144 | 
             
                    # is available, kick off that request process next.
         | 
| 114 145 | 
             
                    #
         | 
| 115 | 
            -
                    # @param roda_app [ | 
| 146 | 
            +
                    # @param roda_app [Roda]
         | 
| 116 147 | 
             
                    # @return [void]
         | 
| 117 148 | 
             
                    def load_all_routes(roda_app)
         | 
| 118 149 | 
             
                      roda_app.request.public
         | 
| @@ -127,11 +158,12 @@ module Bridgetown | |
| 127 158 | 
             
                      end
         | 
| 128 159 | 
             
                    end
         | 
| 129 160 |  | 
| 130 | 
            -
                    # @param app [ | 
| 131 | 
            -
                    def setup_live_reload(app) # rubocop:disable Metrics | 
| 161 | 
            +
                    # @param app [Roda]
         | 
| 162 | 
            +
                    def setup_live_reload(app) # rubocop:disable Metrics
         | 
| 132 163 | 
             
                      sleep_interval = 0.2
         | 
| 133 164 | 
             
                      file_to_check = File.join(Bridgetown::Current.preloaded_configuration.destination,
         | 
| 134 165 | 
             
                                                "index.html")
         | 
| 166 | 
            +
                      errors_file = Bridgetown.build_errors_path
         | 
| 135 167 |  | 
| 136 168 | 
             
                      app.request.get "_bridgetown/live_reload" do
         | 
| 137 169 | 
             
                        app.response["Content-Type"] = "text/event-stream"
         | 
| @@ -146,6 +178,8 @@ module Bridgetown | |
| 146 178 | 
             
                            if @_mod < new_mod
         | 
| 147 179 | 
             
                              out << "data: reloaded!\n\n"
         | 
| 148 180 | 
             
                              break
         | 
| 181 | 
            +
                            elsif File.exist?(errors_file)
         | 
| 182 | 
            +
                              out << "event: builderror\ndata: #{File.read(errors_file).to_json}\n\n"
         | 
| 149 183 | 
             
                            else
         | 
| 150 184 | 
             
                              out << "data: #{new_mod}\n\n"
         | 
| 151 185 | 
             
                            end
         | 
| @@ -157,7 +191,7 @@ module Bridgetown | |
| 157 191 | 
             
                    end
         | 
| 158 192 | 
             
                  end
         | 
| 159 193 |  | 
| 160 | 
            -
                  # @param roda_app [ | 
| 194 | 
            +
                  # @param roda_app [Roda]
         | 
| 161 195 | 
             
                  def initialize(roda_app)
         | 
| 162 196 | 
             
                    @_roda_app = roda_app
         | 
| 163 197 | 
             
                  end
         | 
| @@ -11,13 +11,13 @@ module Bridgetown | |
| 11 11 |  | 
| 12 12 | 
             
                def read
         | 
| 13 13 | 
             
                  layout_entries.each do |layout_file|
         | 
| 14 | 
            -
                    @layouts[layout_name(layout_file)] = | 
| 14 | 
            +
                    @layouts[layout_name(layout_file)] =
         | 
| 15 15 | 
             
                      Layout.new(site, layout_directory, layout_file)
         | 
| 16 16 | 
             
                  end
         | 
| 17 17 |  | 
| 18 18 | 
             
                  site.config.source_manifests.filter_map(&:layouts).each do |plugin_layouts|
         | 
| 19 19 | 
             
                    layout_entries(plugin_layouts).each do |layout_file|
         | 
| 20 | 
            -
                      @layouts[layout_name(layout_file)] ||= | 
| 20 | 
            +
                      @layouts[layout_name(layout_file)] ||=
         | 
| 21 21 | 
             
                        Layout.new(site, plugin_layouts, layout_file, from_plugin: true)
         | 
| 22 22 | 
             
                    end
         | 
| 23 23 | 
             
                  end
         | 
| @@ -13,6 +13,8 @@ module Bridgetown | |
| 13 13 | 
             
                    @config = config
         | 
| 14 14 | 
             
                    @loaders = {}
         | 
| 15 15 | 
             
                    @root_dir = config.root_dir
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    FileUtils.rm_f(Bridgetown.build_errors_path)
         | 
| 16 18 | 
             
                  end
         | 
| 17 19 |  | 
| 18 20 | 
             
                  def unload_loaders
         | 
| @@ -75,6 +77,8 @@ module Bridgetown | |
| 75 77 | 
             
                  end
         | 
| 76 78 |  | 
| 77 79 | 
             
                  def reload_loaders
         | 
| 80 | 
            +
                    FileUtils.rm_f(Bridgetown.build_errors_path)
         | 
| 81 | 
            +
             | 
| 78 82 | 
             
                    @loaders.each do |load_path, loader|
         | 
| 79 83 | 
             
                      next unless reloading_enabled?(load_path)
         | 
| 80 84 |  | 
| @@ -466,6 +466,7 @@ module Bridgetown | |
| 466 466 | 
             
                    function startReloadConnection() {
         | 
| 467 467 | 
             
                      const evtSource = new EventSource("#{site.base_path(strip_slash_only: true)}/_bridgetown/live_reload")
         | 
| 468 468 | 
             
                      evtSource.onmessage = event => {
         | 
| 469 | 
            +
                        if (document.querySelector("#bridgetown-build-error")) document.querySelector("#bridgetown-build-error").close()
         | 
| 469 470 | 
             
                        if (event.data == "reloaded!") {
         | 
| 470 471 | 
             
                          location.reload()
         | 
| 471 472 | 
             
                        } else {
         | 
| @@ -477,6 +478,23 @@ module Bridgetown | |
| 477 478 | 
             
                          }
         | 
| 478 479 | 
             
                        }
         | 
| 479 480 | 
             
                      }
         | 
| 481 | 
            +
                      evtSource.addEventListener("builderror", event => {
         | 
| 482 | 
            +
                        let dialog = document.querySelector("#bridgetown-build-error")
         | 
| 483 | 
            +
                        if (!dialog) {
         | 
| 484 | 
            +
                          dialog = document.createElement("dialog")
         | 
| 485 | 
            +
                          dialog.id = "bridgetown-build-error"
         | 
| 486 | 
            +
                          dialog.style.borderColor = "red"
         | 
| 487 | 
            +
                          dialog.style.fontSize = "110%"
         | 
| 488 | 
            +
                          dialog.innerHTML = `
         | 
| 489 | 
            +
                            <p style="color:red">There was an error when building the site:</p>
         | 
| 490 | 
            +
                            <output><pre></pre></output>
         | 
| 491 | 
            +
                            <p><small>Check your Bridgetown logs for further details.</small></p>
         | 
| 492 | 
            +
                          `
         | 
| 493 | 
            +
                          document.body.appendChild(dialog)
         | 
| 494 | 
            +
                          dialog.showModal()
         | 
| 495 | 
            +
                        }
         | 
| 496 | 
            +
                        dialog.querySelector("pre").textContent = JSON.parse(event.data)
         | 
| 497 | 
            +
                      })
         | 
| 480 498 | 
             
                      evtSource.onerror = event => {
         | 
| 481 499 | 
             
                        if (evtSource.readyState === 2) {
         | 
| 482 500 | 
             
                          // reconnect with new object
         | 
| @@ -106,7 +106,7 @@ module Bridgetown | |
| 106 106 | 
             
                    end
         | 
| 107 107 | 
             
                    Bridgetown.logger.info "Done! 🎉", "#{"Completed".bold.green} in less than " \
         | 
| 108 108 | 
             
                                                      "#{(Time.now - time).ceil(2)} seconds."
         | 
| 109 | 
            -
                  rescue StandardError => e
         | 
| 109 | 
            +
                  rescue StandardError, SyntaxError => e
         | 
| 110 110 | 
             
                    Bridgetown::Errors.print_build_error(e, trace: options[:trace])
         | 
| 111 111 | 
             
                  end
         | 
| 112 112 | 
             
                  Bridgetown.logger.info ""
         | 
    
        data/lib/bridgetown-core.rb
    CHANGED
    
    | @@ -136,6 +136,8 @@ module Bridgetown | |
| 136 136 | 
             
                end
         | 
| 137 137 | 
             
                alias_method :env, :environment
         | 
| 138 138 |  | 
| 139 | 
            +
                # Set up the Bridgetown execution environment before attempting to load any
         | 
| 140 | 
            +
                # plugins or gems prior to a site build
         | 
| 139 141 | 
             
                def begin!
         | 
| 140 142 | 
             
                  ENV["RACK_ENV"] ||= environment
         | 
| 141 143 |  | 
| @@ -178,6 +180,38 @@ module Bridgetown | |
| 178 180 | 
             
                  end
         | 
| 179 181 | 
             
                end
         | 
| 180 182 |  | 
| 183 | 
            +
                # Initialize a preflight configuration object, copying initializers and
         | 
| 184 | 
            +
                # source manifests from a previous standard configuration if necessary.
         | 
| 185 | 
            +
                # Typically only needed in test suites to reset before a new test.
         | 
| 186 | 
            +
                #
         | 
| 187 | 
            +
                # @return [Bridgetown::Configuration::Preflight]
         | 
| 188 | 
            +
                def reset_configuration! # rubocop:disable Metrics/AbcSize
         | 
| 189 | 
            +
                  if Bridgetown::Current.preloaded_configuration.nil?
         | 
| 190 | 
            +
                    return Bridgetown::Current.preloaded_configuration =
         | 
| 191 | 
            +
                             Bridgetown::Configuration::Preflight.new
         | 
| 192 | 
            +
                  end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                  return unless Bridgetown::Current.preloaded_configuration.is_a?(Bridgetown::Configuration)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                  previous_config = Bridgetown::Current.preloaded_configuration
         | 
| 197 | 
            +
                  new_config = Bridgetown::Configuration::Preflight.new
         | 
| 198 | 
            +
                  new_config.initializers = previous_config.initializers
         | 
| 199 | 
            +
                  new_config.source_manifests = previous_config.source_manifests
         | 
| 200 | 
            +
                  if new_config.initializers
         | 
| 201 | 
            +
                    new_config.initializers.delete(:init)
         | 
| 202 | 
            +
                    new_config.initializers.select! do |_k, initializer|
         | 
| 203 | 
            +
                      next false if initializer.block.source_location[0].start_with?(
         | 
| 204 | 
            +
                        File.join(previous_config.root_dir, "config")
         | 
| 205 | 
            +
                      )
         | 
| 206 | 
            +
             | 
| 207 | 
            +
                      initializer.completed = false
         | 
| 208 | 
            +
                      true
         | 
| 209 | 
            +
                    end
         | 
| 210 | 
            +
                  end
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                  Bridgetown::Current.preloaded_configuration = new_config
         | 
| 213 | 
            +
                end
         | 
| 214 | 
            +
             | 
| 181 215 | 
             
                def initializer(name, prepend: false, replace: false, &block) # rubocop:todo Metrics
         | 
| 182 216 | 
             
                  unless Bridgetown::Current.preloaded_configuration
         | 
| 183 217 | 
             
                    raise "The `#{name}' initializer in #{block.source_location[0]} was called " \
         | 
| @@ -276,6 +310,14 @@ module Bridgetown | |
| 276 310 | 
             
                def set_timezone(timezone)
         | 
| 277 311 | 
             
                  ENV["TZ"] = timezone
         | 
| 278 312 | 
             
                end
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                # Get the current TZ environment variable
         | 
| 315 | 
            +
                #
         | 
| 316 | 
            +
                # @return [String]
         | 
| 317 | 
            +
                def timezone
         | 
| 318 | 
            +
                  ENV["TZ"]
         | 
| 319 | 
            +
                end
         | 
| 320 | 
            +
             | 
| 279 321 | 
             
                # rubocop:enable Naming/AccessorMethodName
         | 
| 280 322 |  | 
| 281 323 | 
             
                # Fetch the logger instance for this Bridgetown process.
         | 
| @@ -335,6 +377,18 @@ module Bridgetown | |
| 335 377 | 
             
                    File.join(base_directory, clean_path)
         | 
| 336 378 | 
             
                  end
         | 
| 337 379 | 
             
                end
         | 
| 380 | 
            +
             | 
| 381 | 
            +
                # When there's a build error, error details will be logged to a file which the dev server
         | 
| 382 | 
            +
                #   can read and pass along to the browser.
         | 
| 383 | 
            +
                #
         | 
| 384 | 
            +
                # @return [String] the path to the cached errors file
         | 
| 385 | 
            +
                def build_errors_path
         | 
| 386 | 
            +
                  File.join(
         | 
| 387 | 
            +
                    (Bridgetown::Current.site&.config || Bridgetown::Current.preloaded_configuration).root_dir,
         | 
| 388 | 
            +
                    ".bridgetown-cache",
         | 
| 389 | 
            +
                    "build_errors.txt"
         | 
| 390 | 
            +
                  )
         | 
| 391 | 
            +
                end
         | 
| 338 392 | 
             
              end
         | 
| 339 393 | 
             
            end
         | 
| 340 394 |  |