bridgetown-core 2.0.0.beta2 → 2.0.0.beta4

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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/bridgetown-core.gemspec +43 -42
  4. data/lib/bridgetown-core/cache.rb +3 -19
  5. data/lib/bridgetown-core/cleaner.rb +17 -19
  6. data/lib/bridgetown-core/collection.rb +6 -5
  7. data/lib/bridgetown-core/commands/base.rb +7 -0
  8. data/lib/bridgetown-core/commands/build.rb +35 -22
  9. data/lib/bridgetown-core/commands/concerns/actions.rb +4 -0
  10. data/lib/bridgetown-core/commands/console.rb +0 -1
  11. data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +7 -6
  12. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +14 -13
  13. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
  14. data/lib/bridgetown-core/commands/esbuild/update.rb +17 -3
  15. data/lib/bridgetown-core/commands/esbuild.rb +1 -1
  16. data/lib/bridgetown-core/commands/start.rb +12 -2
  17. data/lib/bridgetown-core/component.rb +1 -1
  18. data/lib/bridgetown-core/concerns/intuitive_expectations.rb +67 -0
  19. data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
  20. data/lib/bridgetown-core/concerns/publishable.rb +2 -0
  21. data/lib/bridgetown-core/concerns/site/content.rb +4 -1
  22. data/lib/bridgetown-core/concerns/site/extensible.rb +6 -1
  23. data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +33 -18
  24. data/lib/bridgetown-core/concerns/site/localizable.rb +2 -0
  25. data/lib/bridgetown-core/concerns/site/processable.rb +2 -0
  26. data/lib/bridgetown-core/concerns/site/renderable.rb +3 -0
  27. data/lib/bridgetown-core/concerns/site/ssr.rb +1 -2
  28. data/lib/bridgetown-core/concerns/site/writable.rb +1 -0
  29. data/lib/bridgetown-core/concerns/viewable.rb +46 -0
  30. data/lib/bridgetown-core/configuration.rb +29 -23
  31. data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +5 -5
  32. data/lib/bridgetown-core/configurations/minitesting.rb +24 -64
  33. data/lib/bridgetown-core/converter.rb +2 -7
  34. data/lib/bridgetown-core/converters/erb_templates.rb +11 -7
  35. data/lib/bridgetown-core/converters/identity.rb +3 -11
  36. data/lib/bridgetown-core/converters/liquid_templates.rb +3 -5
  37. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  38. data/lib/bridgetown-core/converters/markdown.rb +11 -14
  39. data/lib/bridgetown-core/converters/serbea_templates.rb +10 -8
  40. data/lib/bridgetown-core/drops/drop.rb +29 -42
  41. data/lib/bridgetown-core/drops/resource_drop.rb +3 -12
  42. data/lib/bridgetown-core/errors.rb +2 -8
  43. data/lib/bridgetown-core/filters/condition_helpers.rb +6 -9
  44. data/lib/bridgetown-core/filters/date_filters.rb +22 -35
  45. data/lib/bridgetown-core/filters/grouping_filters.rb +11 -11
  46. data/lib/bridgetown-core/filters.rb +53 -72
  47. data/lib/bridgetown-core/front_matter/defaults.rb +14 -19
  48. data/lib/bridgetown-core/generated_page.rb +6 -6
  49. data/lib/bridgetown-core/generators/prototype_generator.rb +0 -2
  50. data/lib/bridgetown-core/helpers.rb +2 -2
  51. data/lib/bridgetown-core/hooks.rb +0 -1
  52. data/lib/bridgetown-core/layout.rb +3 -4
  53. data/lib/bridgetown-core/liquid_extensions.rb +3 -5
  54. data/lib/bridgetown-core/log_adapter.rb +37 -56
  55. data/lib/bridgetown-core/plugin_manager.rb +7 -3
  56. data/lib/bridgetown-core/rack/boot.rb +7 -57
  57. data/lib/bridgetown-core/rack/default_config.ru +14 -0
  58. data/lib/bridgetown-core/rack/loader_hooks.rb +83 -0
  59. data/lib/bridgetown-core/rack/logger.rb +0 -2
  60. data/lib/bridgetown-core/rack/routes.rb +3 -2
  61. data/lib/bridgetown-core/resource/base.rb +8 -8
  62. data/lib/bridgetown-core/resource/permalink_processor.rb +1 -1
  63. data/lib/bridgetown-core/resource/relations.rb +3 -1
  64. data/lib/bridgetown-core/ruby_template_view.rb +0 -1
  65. data/lib/bridgetown-core/static_file.rb +15 -20
  66. data/lib/bridgetown-core/tags/class_map.rb +1 -1
  67. data/lib/bridgetown-core/tags/post_url.rb +2 -32
  68. data/lib/bridgetown-core/utils/initializers.rb +2 -2
  69. data/lib/bridgetown-core/utils/require_gems.rb +1 -3
  70. data/lib/bridgetown-core/utils.rb +41 -44
  71. data/lib/bridgetown-core/watcher.rb +2 -3
  72. data/lib/bridgetown-core.rb +29 -10
  73. data/lib/roda/plugins/bridgetown_server.rb +13 -25
  74. data/lib/roda/plugins/bridgetown_ssr.rb +21 -3
  75. data/lib/roda/plugins/flashier.rb +57 -0
  76. data/lib/roda/plugins/generic_index.html +127 -0
  77. data/lib/roda/plugins/ssg.rb +3 -2
  78. data/lib/site_template/config/initializers.rb +2 -0
  79. data/lib/site_template/package.json.erb +1 -0
  80. data/lib/site_template/postcss.config.js.erb +1 -1
  81. metadata +26 -7
  82. data/lib/bridgetown-core/commands/doctor.rb +0 -147
@@ -11,23 +11,19 @@ module Bridgetown
11
11
  error: ::Logger::ERROR,
12
12
  }.freeze
13
13
 
14
- # Public: Create a new instance of a log writer
14
+ # Create a new instance of a log writer
15
15
  #
16
- # writer - Logger compatible instance
17
- # log_level - (optional, symbol) the log level
18
- #
19
- # Returns nothing
16
+ # @param writer [Logger] compatible instance
17
+ # @param log_level [Symbol] the log level (`debug` | `info` | `warn` | `error`)
20
18
  def initialize(writer, level = :info)
21
19
  @messages = []
22
20
  @writer = writer
23
21
  self.log_level = level
24
22
  end
25
23
 
26
- # Public: Set the log level on the writer
27
- #
28
- # level - (symbol) the log level
24
+ # Set the log level on the writer
29
25
  #
30
- # Returns nothing
26
+ # @param log_level [Symbol] the log level (`debug` | `info` | `warn` | `error`)
31
27
  def log_level=(level)
32
28
  writer.level = level if level.is_a?(Integer) && level.between?(0, 3)
33
29
  writer.level = LOG_LEVELS[level] ||
@@ -45,63 +41,52 @@ module Bridgetown
45
41
  debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s
46
42
  end
47
43
 
48
- # Public: Print a debug message
49
- #
50
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
51
- # message - the message detail
44
+ # Print a debug message
52
45
  #
53
- # Returns nothing
46
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
47
+ # @param message [String] the message detail
54
48
  def debug(topic, message = nil, &)
55
49
  write(:debug, topic, message, &)
56
50
  end
57
51
 
58
- # Public: Print a message
52
+ # Print an informational message
59
53
  #
60
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
61
- # message - the message detail
62
- #
63
- # Returns nothing
54
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
55
+ # @param message [String] the message detail
64
56
  def info(topic, message = nil, &)
65
57
  write(:info, topic, message, &)
66
58
  end
67
59
 
68
- # Public: Print a message
69
- #
70
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
71
- # message - the message detail
60
+ # Print a warning message
72
61
  #
73
- # Returns nothing
62
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
63
+ # @param message [String] the message detail
74
64
  def warn(topic, message = nil, &)
75
65
  write(:warn, topic, message, &)
76
66
  end
77
67
 
78
- # Public: Print an error message
79
- #
80
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
81
- # message - the message detail
68
+ # Print an error message
82
69
  #
83
- # Returns nothing
70
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
71
+ # @param message [String] the message detail
84
72
  def error(topic, message = nil, &)
85
73
  write(:error, topic, message, &)
86
74
  end
87
75
 
88
- # Public: Print an error message and immediately abort the process
76
+ # Print an error message and immediately abort the process
89
77
  #
90
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
91
- # message - the message detail (can be omitted)
92
- #
93
- # Returns nothing
78
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
79
+ # @param message [String] the message detail
94
80
  def abort_with(topic, message = nil, &)
95
81
  error(topic, message, &)
96
82
  abort
97
83
  end
98
84
 
99
- # Internal: Build a topic method
100
- #
101
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
102
- # message - the message detail
85
+ # Build a topic method
103
86
  #
104
- # Returns the formatted message
87
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
88
+ # @param message [String] the message detail
89
+ # @return [String] the formatted message
105
90
  def message(topic, message = nil)
106
91
  raise ArgumentError, "block or message, not both" if block_given? && message
107
92
 
@@ -113,34 +98,30 @@ module Bridgetown
113
98
  out
114
99
  end
115
100
 
116
- # Internal: Format the topic
117
- #
118
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
119
- # colon -
101
+ # Format the topic
120
102
  #
121
- # Returns the formatted topic statement
103
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
104
+ # @param colon [Boolean]
105
+ # @return [String] formatted topic statement
122
106
  def formatted_topic(topic, colon = false) # rubocop:disable Style/OptionalBooleanParameter
123
107
  "#{topic}#{colon ? ": " : " "}".rjust(20)
124
108
  end
125
109
 
126
- # Internal: Check if the message should be written given the log level.
110
+ # Check if the message should be written given the log level
127
111
  #
128
- # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error
129
- #
130
- # Returns whether the message should be written.
112
+ # @param level_of_message [Symbol] the message level (`debug` | `info` | `warn` | `error`)
113
+ # @return [Boolean] whether the message should be written to the log
131
114
  def write_message?(level_of_message)
132
115
  LOG_LEVELS.fetch(level) <= LOG_LEVELS.fetch(level_of_message)
133
116
  end
134
117
 
135
- # Internal: Log a message.
136
- #
137
- # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error
138
- # topic - the String topic or full message
139
- # message - the String message (optional)
140
- # block - a block containing the message (optional)
118
+ # Log a message. If a block is provided containing the message, use that instead.
141
119
  #
142
- # Returns false if the message was not written, otherwise returns the value of calling
143
- # the appropriate writer method, e.g. writer.info.
120
+ # @param level_of_message [Symbol] the message level (`debug` | `info` | `warn` | `error`)
121
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
122
+ # @param message [String] the message detail
123
+ # @return [BasicObject] false if the message was not written, otherwise returns the value of
124
+ # calling the appropriate writer method, e.g. writer.info.
144
125
  def write(level_of_message, topic, message = nil, &)
145
126
  return false unless write_message?(level_of_message)
146
127
 
@@ -81,12 +81,12 @@ module Bridgetown
81
81
  end
82
82
 
83
83
  def self.package_manager
84
- @package_manager ||= if File.exist?("package-lock.json")
85
- "npm"
86
- elsif File.exist?("yarn.lock")
84
+ @package_manager ||= if File.exist?("yarn.lock")
87
85
  "yarn"
88
86
  elsif File.exist?("pnpm-lock.yaml")
89
87
  "pnpm"
88
+ elsif File.exist?("package.json")
89
+ "npm"
90
90
  else
91
91
  ""
92
92
  end
@@ -96,6 +96,10 @@ module Bridgetown
96
96
  package_manager == "npm" ? "install" : "add"
97
97
  end
98
98
 
99
+ def self.package_manager_uninstall_command
100
+ package_manager == "npm" ? "uninstall" : "remove"
101
+ end
102
+
99
103
  # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
100
104
 
101
105
  # Iterates through loaded gems and finds npm-add gemspec metadata.
@@ -3,14 +3,16 @@
3
3
  require "zeitwerk"
4
4
  require "roda"
5
5
  require "json"
6
+ require "bridgetown"
6
7
 
7
- Bridgetown::Current.preloaded_configuration ||= Bridgetown.configuration
8
-
8
+ require_relative "loader_hooks"
9
9
  require_relative "logger"
10
10
  require_relative "routes"
11
11
 
12
12
  module Bridgetown
13
13
  module Rack
14
+ Bridgetown.begin!(with_config: :initializers)
15
+
14
16
  class << self
15
17
  # @return [Bridgetown::Utils::LoadersManager]
16
18
  attr_accessor :loaders_manager
@@ -23,61 +25,9 @@ module Bridgetown
23
25
  self.loaders_manager =
24
26
  Bridgetown::Utils::LoadersManager.new(Bridgetown::Current.preloaded_configuration)
25
27
  Bridgetown::Current.preloaded_configuration.run_initializers! context: :server
26
- autoload_server_folder
27
- rescue Roda::RodaError => e
28
- if e.message.include?("sessions plugin :secret option")
29
- raise Bridgetown::Errors::InvalidConfigurationError,
30
- "The Roda sessions plugin can't find a valid secret. Run `bin/bridgetown secret' " \
31
- "and put the key in a ENV var you can use to configure the session in the Roda app"
32
- end
33
-
34
- raise e
35
- end
36
-
37
- # @param root [String] root of Bridgetown site, defaults to config value
38
- def self.autoload_server_folder( # rubocop:todo Metrics
39
- root: Bridgetown::Current.preloaded_configuration.root_dir
40
- )
41
- server_folder = File.join(root, "server")
42
-
43
- Bridgetown::Hooks.register_one(
44
- :loader, :post_setup, reloadable: false
45
- ) do |loader, load_path|
46
- next unless load_path == server_folder
47
-
48
- loader.eager_load
49
- loader.do_not_eager_load(File.join(server_folder, "roda_app.rb"))
50
-
51
- unless ENV["BRIDGETOWN_ENV"] == "production"
52
- Listen.to(server_folder) do |modified, added, removed|
53
- c = modified + added + removed
54
- n = c.length
55
-
56
- Bridgetown.logger.info(
57
- "Reloading…",
58
- "#{n} file#{"s" if n > 1} changed at #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}"
59
- )
60
- c.each do |path|
61
- Bridgetown.logger.info "", "- #{path["#{File.dirname(server_folder)}/".length..]}"
62
- end
63
-
64
- loader.reload
65
- loader.eager_load
66
- rescue SyntaxError => e
67
- Bridgetown::Errors.print_build_error(e)
68
- end.start
69
- end
70
- end
71
-
72
- Bridgetown::Hooks.register_one(
73
- :loader, :post_reload, reloadable: false
74
- ) do |loader, load_path|
75
- next unless load_path == server_folder
76
-
77
- loader.eager_load
78
- end
79
-
80
- loaders_manager.setup_loaders([server_folder])
28
+ LoaderHooks.autoload_server_folder(
29
+ File.join(Bridgetown::Current.preloaded_configuration.root_dir, "server")
30
+ )
81
31
  end
82
32
  end
83
33
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bridgetown-core/rack/boot"
4
+
5
+ Bridgetown::Rack.boot
6
+
7
+ unless defined?(RodaApp)
8
+ class RodaApp < Roda
9
+ plugin :bridgetown_server
10
+ route(&:bridgetown)
11
+ end
12
+ end
13
+
14
+ run RodaApp.freeze.app
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Rack
5
+ module LoaderHooks
6
+ # Sets up a Zeitwerk loader for the Roda routes in the server folder. Called by the server
7
+ # boot process when Rack starts up
8
+ #
9
+ # @param server_folder [String] typically `server` within the site root
10
+ def self.autoload_server_folder(server_folder)
11
+ reload_file_path = Bridgetown.live_reload_path
12
+
13
+ register_hooks server_folder, reload_file_path
14
+
15
+ Bridgetown::Rack.loaders_manager.setup_loaders([server_folder])
16
+ end
17
+
18
+ # Registers a `post_setup` and `post_reload` hook for the Zeitwerk loader in order to handle
19
+ # eager loading and, in development, the live reload watcher
20
+ #
21
+ # @param server_folder [String]
22
+ # @param reload_file_path [String] path to the special live reload txt file
23
+ def self.register_hooks(server_folder, reload_file_path) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
24
+ Bridgetown::Hooks.register_one(
25
+ :loader, :post_setup, reloadable: false
26
+ ) do |loader, load_path|
27
+ next unless load_path == server_folder
28
+
29
+ loader.eager_load
30
+ subclass_names = Roda.subclasses.map(&:name)
31
+ subclass_paths = Set.new
32
+
33
+ loader.all_expected_cpaths.each do |cpath, cname|
34
+ if subclass_names.include?(cname) && cpath.start_with?(server_folder)
35
+ subclass_paths << cpath
36
+ loader.do_not_eager_load cpath
37
+ end
38
+ end
39
+
40
+ unless ENV["BRIDGETOWN_ENV"] == "production"
41
+ setup_autoload_listener loader, server_folder, subclass_paths
42
+ end
43
+ end
44
+
45
+ Bridgetown::Hooks.register_one(
46
+ :loader, :post_reload, reloadable: false
47
+ ) do |loader, load_path|
48
+ next unless load_path == server_folder
49
+
50
+ loader.eager_load
51
+ Bridgetown.touch_live_reload_file(reload_file_path)
52
+ end
53
+ end
54
+
55
+ # Creates a listener to detect file changes within the server folder and notify Zeitwerk
56
+ #
57
+ # @param loader [Zeitwerk::Loader]
58
+ # @param server_loader [String]
59
+ # @param subclass_paths [Array<string>]
60
+ def self.setup_autoload_listener(loader, server_folder, subclass_paths)
61
+ Listen.to(server_folder) do |modified, added, removed|
62
+ c = modified + added + removed
63
+ n = c.length
64
+
65
+ unless n == 1 && subclass_paths.include?(c.first)
66
+ Bridgetown.logger.info(
67
+ "Reloading…",
68
+ "#{n} file#{"s" if n > 1} changed at #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}"
69
+ )
70
+ c.each do |path|
71
+ Bridgetown.logger.info "", "- #{path["#{File.dirname(server_folder)}/".length..]}"
72
+ end
73
+ end
74
+
75
+ loader.reload
76
+ Bridgetown::Hooks.trigger :loader, :post_reload, loader, server_folder
77
+ rescue SyntaxError => e
78
+ Bridgetown::Errors.print_build_error(e)
79
+ end.start
80
+ end
81
+ end
82
+ end
83
+ end
@@ -7,8 +7,6 @@ module Bridgetown
7
7
  module Rack
8
8
  class Logger < Bridgetown::LogWriter
9
9
  def self.message_with_prefix(msg)
10
- # return if msg.include?("/_bridgetown/live_reload")
11
-
12
10
  "\e[35m[Server]\e[0m #{msg}"
13
11
  end
14
12
 
@@ -101,13 +101,14 @@ module Bridgetown
101
101
  Bridgetown::Rack::Routes.sorted_subclasses&.each do |klass|
102
102
  klass.merge roda_app
103
103
  end
104
+
105
+ nil # required for proper 404 handling
104
106
  end
105
107
 
106
108
  # @param app [Roda]
107
109
  def setup_live_reload(app) # rubocop:disable Metrics
108
110
  sleep_interval = 0.5
109
- file_to_check = File.join(Bridgetown::Current.preloaded_configuration.destination,
110
- "index.html")
111
+ file_to_check = Bridgetown.live_reload_path
111
112
  errors_file = Bridgetown.build_errors_path
112
113
 
113
114
  app.request.get "_bridgetown/live_reload" do
@@ -106,11 +106,7 @@ module Bridgetown
106
106
  #
107
107
  # @param new_data [HashWithDotAccess::Hash]
108
108
  def data=(new_data)
109
- if site.config.fast_refresh && write?
110
- # TODO: investigate if this would be better:
111
- # @data.value = front_matter_defaults
112
- mark_for_fast_refresh!
113
- end
109
+ mark_for_fast_refresh! if site.config.fast_refresh && write?
114
110
 
115
111
  Signalize.batch do
116
112
  @content_signal.value += 1
@@ -221,12 +217,12 @@ module Bridgetown
221
217
 
222
218
  # @return [String]
223
219
  def absolute_url
224
- format_url destination&.absolute_url
220
+ @absolute_url ||= format_url(destination&.absolute_url)
225
221
  end
226
222
 
227
223
  # @return [String]
228
224
  def relative_url
229
- format_url destination&.relative_url
225
+ @relative_url ||= format_url(destination&.relative_url)
230
226
  end
231
227
 
232
228
  # @return [String]
@@ -365,7 +361,11 @@ module Bridgetown
365
361
  past_values = @data.peek.select do |key|
366
362
  key == "categories" || key == "tags" || site.taxonomy_types.keys.any?(key)
367
363
  end
368
- model.attributes = model.origin.read
364
+ origin_data = model.origin.read
365
+ correct_locale = origin_data["locale"] || origin_data[:locale] || data.locale
366
+ model.attributes = origin_data
367
+ model.attributes.locale = correct_locale
368
+ @relative_url = @absolute_url = nil # wipe memoizations
369
369
  read!
370
370
  tax_diff = past_values.any? { |k, v| @data.peek[k] != v }
371
371
 
@@ -120,7 +120,7 @@ module Bridgetown
120
120
  end
121
121
 
122
122
  # @param resource [Bridgetown::Resource::Base]
123
- register_placeholder :name, ->(resource) do
123
+ register_placeholder :name, ->(resource) do # rubocop:disable Style/SymbolProc
124
124
  resource.basename_without_ext
125
125
  end
126
126
 
@@ -20,7 +20,9 @@ module Bridgetown
20
20
 
21
21
  # @return [HashWithDotAccess::Hash]
22
22
  def relation_schema
23
- resource.collection.metadata.relations
23
+ @relation_schema ||= resource.collection.metadata.relations&.transform_values do |value|
24
+ value.is_a?(Array) ? value.map(&:to_s) : value.to_s
25
+ end
24
26
  end
25
27
 
26
28
  # @return [Array<String>]
@@ -131,7 +131,6 @@ module Bridgetown
131
131
  def _partial_path(partial_name, ext)
132
132
  partial_name = partial_name.split("/").tap { _1.last.prepend("_") }.join("/")
133
133
 
134
- # TODO: see if there's a workaround for this to speed up performance
135
134
  site.in_source_dir(site.config[:partials_dir], "#{partial_name}.#{ext}")
136
135
  end
137
136
  end
@@ -48,11 +48,10 @@ module Bridgetown
48
48
  @path ||= File.join(*[@base, @dir, @name].compact)
49
49
  end
50
50
 
51
- # Obtain destination path.
51
+ # Obtain destination path
52
52
  #
53
- # dest - The String path to the destination dir.
54
- #
55
- # Returns destination file path.
53
+ # @param dest [String] path to the destination dir
54
+ # @return [String]
56
55
  def destination(dest)
57
56
  dest = site.in_dest_dir(dest)
58
57
  dest_url = url
@@ -76,22 +75,21 @@ module Bridgetown
76
75
 
77
76
  alias_method :date, :modified_time
78
77
 
79
- # Returns last modification time for this file.
78
+ # @return [Integer] last modification time for this file
80
79
  def mtime
81
80
  modified_time.to_i
82
81
  end
83
82
 
84
83
  # Is source path modified?
85
84
  #
86
- # Returns true if modified since last write.
85
+ # @return [Boolean] true if modified since last write
87
86
  def modified?
88
87
  self.class.mtimes[path] != mtime
89
88
  end
90
89
 
91
90
  # Whether to write the file to the filesystem
92
91
  #
93
- # Returns true unless the defaults for the destination path from
94
- # bridgetown.config.yml contain `published: false`.
92
+ # @return [Boolean] true unless the defaults for the destination path contain `published: false`
95
93
  def write?
96
94
  publishable = defaults.fetch("published", true)
97
95
  return publishable unless @collection
@@ -99,11 +97,10 @@ module Bridgetown
99
97
  publishable && @collection.write?
100
98
  end
101
99
 
102
- # Write the static file to the destination directory (if modified).
103
- #
104
- # dest - The String path to the destination dir.
100
+ # Write the static file to the destination directory (if modified)
105
101
  #
106
- # Returns false if the file was not modified since last time (no-op).
102
+ # @param dest [String] path to the destination dir
103
+ # @return [Boolean] false if the file was not modified since last time (no-op)
107
104
  def write(dest)
108
105
  dest_path = destination(dest)
109
106
  return false if File.exist?(dest_path) && !modified?
@@ -152,12 +149,12 @@ module Bridgetown
152
149
  #
153
150
  # NOTE: `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
154
151
  #
155
- # Examples:
152
+ # @example
156
153
  # When `relative_path` is "_methods/site/my-cool-avatar...png":
157
154
  # cleaned_relative_path
158
155
  # # => "/site/my-cool-avatar"
159
156
  #
160
- # Returns the cleaned relative path of the static file.
157
+ # @return [String] cleaned relative path of the static file
161
158
  def cleaned_relative_path
162
159
  @cleaned_relative_path ||= begin
163
160
  cleaned = relative_path[0..-extname.length - 1]
@@ -169,7 +166,7 @@ module Bridgetown
169
166
 
170
167
  # Applies a similar URL-building technique as resources that takes
171
168
  # the collection's URL template into account. The default URL template can
172
- # be overriden in the collection's configuration in bridgetown.config.yml.
169
+ # be overriden in the collection's configuration
173
170
  def url
174
171
  @url ||= begin
175
172
  newly_processed = false
@@ -183,19 +180,17 @@ module Bridgetown
183
180
  end
184
181
  end
185
182
 
186
- # Returns the type of the collection if present, nil otherwise.
183
+ # @return [Symbol, nil] type of the collection if present
187
184
  def type
188
185
  @type ||= @collection&.label&.to_sym
189
186
  end
190
187
 
191
- # Returns the front matter defaults defined for the file's URL and/or type
192
- # as defined in bridgetown.config.yml.
188
+ # @return [Hash] front matter defaults defined for the file's URL and/or type
193
189
  def defaults
194
190
  @defaults ||= site.frontmatter_defaults.all url, type
195
191
  end
196
192
 
197
- # Returns a debug string on inspecting the static file.
198
- # Includes only the relative path of the object.
193
+ # @return [String] includes only the relative path of the object
199
194
  def inspect
200
195
  "#<#{self.class} @relative_path=#{relative_path.inspect}>"
201
196
  end
@@ -23,7 +23,7 @@ module Bridgetown
23
23
  class ClassMap < Liquid::Tag
24
24
  # @see https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html
25
25
  FALSE_VALUES = [
26
- nil, "nil", "NIL", false, 0, "0", :"0", "f", :f, "F", :F, "false",
26
+ nil, "nil", "NIL", 0, "0", :"0", "f", :f, "F", :F, "false",
27
27
  false, "FALSE", :FALSE,
28
28
  ].to_set.freeze
29
29
 
@@ -12,7 +12,7 @@ module Bridgetown
12
12
 
13
13
  all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER)
14
14
  unless all
15
- raise Bridgetown::Errors::InvalidPostNameError,
15
+ raise Bridgetown::Errors::FatalException,
16
16
  "'#{name}' does not contain valid date and/or title."
17
17
  end
18
18
 
@@ -31,24 +31,6 @@ module Bridgetown
31
31
  def ==(other)
32
32
  other.relative_path.to_s.match(@name_regex)
33
33
  end
34
-
35
- def deprecated_equality(other)
36
- slug == post_slug(other) &&
37
- post_date.year == other.date.year &&
38
- post_date.month == other.date.month &&
39
- post_date.day == other.date.day
40
- end
41
-
42
- private
43
-
44
- # Construct the directory-aware post slug for a Bridgetown::Post
45
- #
46
- # other - the Bridgetown::Post
47
- #
48
- # Returns the post slug with the subdirectory (relative to _posts)
49
- def post_slug(other)
50
- other.data.slug
51
- end
52
34
  end
53
35
 
54
36
  class PostUrl < Liquid::Tag
@@ -75,19 +57,7 @@ module Bridgetown
75
57
  site.collections.posts.resources.each do |document|
76
58
  return relative_url(document) if @post == document
77
59
 
78
- # New matching method did not match, fall back to old method
79
- # with deprecation warning if this matches
80
- next unless @post.deprecated_equality document
81
-
82
- Bridgetown::Deprecator.deprecation_message(
83
- "A call to " \
84
- "'{% post_url #{@post.name} %}' did not match " \
85
- "a post using the new matching method of checking name " \
86
- "(path-date-slug) equality. Please make sure that you " \
87
- "change this tag to match the post's name exactly."
88
- )
89
-
90
- return relative_url(document)
60
+ next
91
61
  end
92
62
 
93
63
  raise Bridgetown::Errors::PostURLError, <<~MSG
@@ -4,9 +4,9 @@ Bridgetown.initializer :dotenv do |config|
4
4
  Bridgetown.load_dotenv root: config.root_dir
5
5
  end
6
6
 
7
- Bridgetown.initializer :ssr do |config, setup: nil|
7
+ Bridgetown.initializer :ssr do |config, setup: nil, **options|
8
8
  config.roda do |app|
9
- app.plugin(:bridgetown_ssr, &setup)
9
+ app.plugin(:bridgetown_ssr, options, &setup)
10
10
  end
11
11
  end
12
12
 
@@ -4,13 +4,11 @@ module Bridgetown
4
4
  module Utils
5
5
  module RequireGems
6
6
  class << self
7
- #
8
7
  # Require a gem or gems. If it's not present, show a very nice error
9
8
  # message that explains everything and is much more helpful than the
10
9
  # normal LoadError.
11
10
  #
12
- # names - a string gem name or array of gem names
13
- #
11
+ # @param names [String, Array<String>] gem name or array of gem names
14
12
  def require_with_graceful_fail(names)
15
13
  Array(names).each do |name|
16
14
  Bridgetown.logger.debug "Requiring:", name.to_s