bridgetown-core 2.0.0.beta2 → 2.0.0.beta3

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/bridgetown-core.gemspec +1 -1
  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 +1 -1
  7. data/lib/bridgetown-core/commands/build.rb +6 -17
  8. data/lib/bridgetown-core/commands/concerns/actions.rb +4 -0
  9. data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +7 -6
  10. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +14 -13
  11. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
  12. data/lib/bridgetown-core/commands/esbuild/update.rb +17 -3
  13. data/lib/bridgetown-core/commands/esbuild.rb +1 -1
  14. data/lib/bridgetown-core/component.rb +1 -1
  15. data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
  16. data/lib/bridgetown-core/concerns/publishable.rb +2 -0
  17. data/lib/bridgetown-core/concerns/site/content.rb +4 -1
  18. data/lib/bridgetown-core/concerns/site/extensible.rb +6 -1
  19. data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +20 -13
  20. data/lib/bridgetown-core/concerns/site/localizable.rb +2 -0
  21. data/lib/bridgetown-core/concerns/site/processable.rb +2 -0
  22. data/lib/bridgetown-core/concerns/site/renderable.rb +3 -0
  23. data/lib/bridgetown-core/concerns/site/ssr.rb +0 -1
  24. data/lib/bridgetown-core/configuration.rb +8 -14
  25. data/lib/bridgetown-core/converter.rb +2 -7
  26. data/lib/bridgetown-core/converters/identity.rb +3 -11
  27. data/lib/bridgetown-core/converters/liquid_templates.rb +3 -5
  28. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  29. data/lib/bridgetown-core/converters/markdown.rb +11 -14
  30. data/lib/bridgetown-core/converters/serbea_templates.rb +3 -4
  31. data/lib/bridgetown-core/drops/drop.rb +29 -42
  32. data/lib/bridgetown-core/drops/resource_drop.rb +3 -12
  33. data/lib/bridgetown-core/errors.rb +2 -8
  34. data/lib/bridgetown-core/filters/condition_helpers.rb +6 -9
  35. data/lib/bridgetown-core/filters/date_filters.rb +22 -35
  36. data/lib/bridgetown-core/filters/grouping_filters.rb +11 -11
  37. data/lib/bridgetown-core/filters.rb +53 -72
  38. data/lib/bridgetown-core/front_matter/defaults.rb +8 -13
  39. data/lib/bridgetown-core/generated_page.rb +6 -6
  40. data/lib/bridgetown-core/generators/prototype_generator.rb +0 -2
  41. data/lib/bridgetown-core/hooks.rb +0 -1
  42. data/lib/bridgetown-core/layout.rb +3 -4
  43. data/lib/bridgetown-core/liquid_extensions.rb +3 -5
  44. data/lib/bridgetown-core/log_adapter.rb +37 -56
  45. data/lib/bridgetown-core/plugin_manager.rb +7 -3
  46. data/lib/bridgetown-core/rack/logger.rb +0 -2
  47. data/lib/bridgetown-core/resource/base.rb +8 -8
  48. data/lib/bridgetown-core/resource/permalink_processor.rb +1 -1
  49. data/lib/bridgetown-core/ruby_template_view.rb +0 -1
  50. data/lib/bridgetown-core/static_file.rb +15 -20
  51. data/lib/bridgetown-core/tags/class_map.rb +1 -1
  52. data/lib/bridgetown-core/tags/post_url.rb +2 -32
  53. data/lib/bridgetown-core/utils/require_gems.rb +1 -3
  54. data/lib/bridgetown-core/utils.rb +41 -44
  55. data/lib/bridgetown-core/watcher.rb +2 -3
  56. data/lib/bridgetown-core.rb +1 -2
  57. data/lib/roda/plugins/bridgetown_server.rb +2 -3
  58. data/lib/site_template/package.json.erb +1 -0
  59. data/lib/site_template/postcss.config.js.erb +1 -1
  60. metadata +6 -6
@@ -11,33 +11,30 @@ module Bridgetown
11
11
  include TranslationFilters
12
12
  include ConditionHelpers
13
13
 
14
- # Convert a Markdown string into HTML output.
14
+ # Convert a Markdown string into HTML output
15
15
  #
16
- # input - The Markdown String to convert.
17
- #
18
- # Returns the HTML formatted String.
16
+ # @param input [String]
17
+ # @return [String] HTML formatted text
19
18
  def markdownify(input)
20
19
  @context.registers[:site].find_converter_instance(
21
20
  Bridgetown::Converters::Markdown
22
21
  ).convert(input.to_s)
23
22
  end
24
23
 
25
- # Convert quotes into smart quotes.
26
- #
27
- # input - The String to convert.
24
+ # Convert quotes into smart quotes
28
25
  #
29
- # Returns the smart-quotified String.
26
+ # @param input [String]
27
+ # @return [String] smart-quotified text
30
28
  def smartify(input)
31
29
  Utils::SmartyPantsConverter.new(@context.registers[:site].config).convert(input.to_s)
32
30
  end
33
31
 
34
- # Slugify a filename or title.
35
- #
36
- # input - The filename or title to slugify.
37
- # mode - how string is slugified
32
+ # Slugify a filename or title
38
33
  #
39
- # Returns the given filename or title as a lowercase URL String.
40
- # See Utils.slugify for more detail.
34
+ # @param input [String] the filename or title to slugify
35
+ # @param mode [String] how string is slugified
36
+ # @see Utils.slugify
37
+ # @return [String] lowercase URL
41
38
  def slugify(input, mode = nil)
42
39
  mode = @context.registers[:site].config.slugify_mode if mode.nil?
43
40
  Utils.slugify(input, mode:)
@@ -45,10 +42,9 @@ module Bridgetown
45
42
 
46
43
  # Titleize a slug or identifier string.
47
44
  #
48
- # input - The string to titleize.
49
- #
50
- # Returns a transformed string with spaces and capitalized words.
51
- # See Utils.titleize_slug for more detail.
45
+ # @param input [String]
46
+ # @see Utils.titleize_slug for more detail
47
+ # @return [String] transformed string with spaces and capitalized words
52
48
  def titleize(input)
53
49
  Utils.titleize_slug(input)
54
50
  end
@@ -56,13 +52,12 @@ module Bridgetown
56
52
  # XML escape a string for use. Replaces any special characters with
57
53
  # appropriate HTML entity replacements.
58
54
  #
59
- # Examples
60
- #
55
+ # @example
61
56
  # xml_escape('foo "bar" <baz>')
62
57
  # # => "foo &quot;bar&quot; &lt;baz&gt;"
63
58
  #
64
- # @param input [String] The String to escape.
65
- # @return [String] the escaped String.
59
+ # @param input [String]
60
+ # @return [String]
66
61
  def xml_escape(input)
67
62
  Utils.xml_escape(input)
68
63
  end
@@ -70,28 +65,24 @@ module Bridgetown
70
65
  # CGI escape a string for use in a URL. Replaces any special characters
71
66
  # with appropriate %XX replacements.
72
67
  #
73
- # input - The String to escape.
74
- #
75
- # Examples
76
- #
68
+ # @example
77
69
  # cgi_escape('foo,bar;baz?')
78
70
  # # => "foo%2Cbar%3Bbaz%3F"
79
71
  #
80
- # Returns the escaped String.
72
+ # @param input [String]
73
+ # @return [String]
81
74
  def cgi_escape(input)
82
75
  CGI.escape(input.to_s)
83
76
  end
84
77
 
85
78
  # URI escape a string.
86
79
  #
87
- # input - The String to escape.
88
- #
89
- # Examples
90
- #
80
+ # @example
91
81
  # uri_escape('foo, bar \\baz?')
92
82
  # # => "foo,%20bar%20%5Cbaz?"
93
83
  #
94
- # Returns the escaped String.
84
+ # @param input [String]
85
+ # @return [String]
95
86
  def uri_escape(input)
96
87
  Addressable::URI.normalize_component(input)
97
88
  end
@@ -113,23 +104,22 @@ module Bridgetown
113
104
 
114
105
  # Replace any whitespace in the input string with a single space
115
106
  #
116
- # input - The String on which to operate.
117
- #
118
- # Returns the formatted String
107
+ # @param input [String]
108
+ # @return [String]
119
109
  def normalize_whitespace(input)
120
110
  input.to_s.gsub(%r!\s+!, " ").strip
121
111
  end
122
112
 
123
113
  # Count the number of words in the input string.
124
114
  #
125
- # input - The String on which to operate.
126
- #
127
- # Returns the Integer word count.
115
+ # @param input [String]
116
+ # @return [Integer] word count
128
117
  def number_of_words(input)
129
118
  input.split.length
130
119
  end
131
120
 
132
- # Calculates the average reading time of the supplied content.
121
+ # Calculates the average reading time of the supplied content
122
+ #
133
123
  # @param input [String] the String of content to analyze.
134
124
  # @return [Float] the number of minutes required to read the content.
135
125
  def reading_time(input, round_to = 0)
@@ -138,17 +128,15 @@ module Bridgetown
138
128
  end
139
129
 
140
130
  # Join an array of things into a string by separating with commas and the
141
- # word "and" for the last one.
142
- #
143
- # array - The Array of Strings to join.
144
- # connector - Word used to connect the last 2 items in the array
145
- #
146
- # Examples
131
+ # word "and" for the last one
147
132
  #
133
+ # @example
148
134
  # array_to_sentence_string(["apples", "oranges", "grapes"])
149
135
  # # => "apples, oranges, and grapes"
150
136
  #
151
- # Returns the formatted String.
137
+ # @param array [Array<String>]
138
+ # @param connector [String] word used to connect the last 2 items in the array
139
+ # @return [String]
152
140
  def array_to_sentence_string(array, connector = "and")
153
141
  case array.length
154
142
  when 0
@@ -162,24 +150,20 @@ module Bridgetown
162
150
  end
163
151
  end
164
152
 
165
- # Convert the input into json string
166
- #
167
- # input - The Array or Hash to be converted
153
+ # Convert the input into JSON string
168
154
  #
169
- # Returns the converted json string
155
+ # @param input [Array, Hash, String, Integer]
156
+ # @return [String] JSON string
170
157
  def jsonify(input)
171
158
  as_liquid(input).to_json
172
159
  end
173
160
 
174
- # Filter an array of objects
161
+ # Filter an array of objects or a hash (will use values)
175
162
  #
176
- # input - the object array.
177
- # property - the property within each object to filter by.
178
- # value - the desired value.
179
- # Cannot be an instance of Array nor Hash since calling #to_s on them returns
180
- # their `#inspect` string object.
181
- #
182
- # Returns the filtered array of objects
163
+ # @param input [Array, Hash]
164
+ # @param property [String] the property within each object to filter by
165
+ # @param value [String] value for the search
166
+ # @return [Array] filtered array of objects
183
167
  def where(input, property, value) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
184
168
  return input if !property || value.is_a?(Array) || value.is_a?(Hash)
185
169
  return input unless input.respond_to?(:select)
@@ -201,15 +185,14 @@ module Bridgetown
201
185
 
202
186
  # Filters an array of objects against an expression
203
187
  #
204
- # input - the object array
205
- # variable - the variable to assign each item to in the expression
206
- # expression - a Liquid comparison expression passed in as a string
207
- #
208
- # Returns the filtered array of objects
188
+ # @param input [Array, Hash]
189
+ # @param variable [String] the variable to assign each item to in the expression
190
+ # @param expression [String] a Liquid comparison expression passed in as a string
191
+ # @return [Array] filtered array of objects
209
192
  def where_exp(input, variable, expression)
210
193
  return input unless input.respond_to?(:select)
211
194
 
212
- input = input.values if input.is_a?(Hash) # FIXME
195
+ input = input.values if input.is_a?(Hash)
213
196
 
214
197
  condition = parse_condition(expression)
215
198
  @context.stack do
@@ -222,9 +205,8 @@ module Bridgetown
222
205
 
223
206
  # Convert the input into integer
224
207
  #
225
- # input - the object string
226
- #
227
- # Returns the integer value
208
+ # @param input [String, Boolean] if boolean, 1 for true and 0 for false
209
+ # @return [Integer]
228
210
  def to_integer(input)
229
211
  return 1 if input == true
230
212
  return 0 if input == false
@@ -234,11 +216,10 @@ module Bridgetown
234
216
 
235
217
  # Sort an array of objects
236
218
  #
237
- # input - the object array
238
- # property - property within each object to filter by
239
- # nils ('first' | 'last') - nils appear before or after non-nil values
240
- #
241
- # Returns the filtered array of objects
219
+ # @param input [Array]
220
+ # @param property [String] the property within each object to filter by
221
+ # @param nils [String] `first` | `last` (nils appear before or after non-nil values)
222
+ # @return [Array] sorted array of objects
242
223
  def sort(input, property = nil, nils = "first")
243
224
  raise ArgumentError, "Cannot sort a null object." if input.nil?
244
225
 
@@ -33,7 +33,6 @@ module Bridgetown
33
33
  #
34
34
  # @param path [String] the relative path of the resource
35
35
  # @param collection_name [Symbol] :posts, :pages, etc.
36
- #
37
36
  # @return [Hash] all default values (an empty hash if there are none)
38
37
  def all(path, collection_name)
39
38
  if @defaults_cache.key?([path, collection_name])
@@ -70,11 +69,10 @@ module Bridgetown
70
69
 
71
70
  # Checks if a given default setting scope matches the given path and collection
72
71
  #
73
- # scope - the hash indicating the scope, as defined in bridgetown.config.yml
74
- # path - the path to check for
75
- # collection - the collection (:posts or :pages) to check for
76
- #
77
- # Returns true if the scope applies to the given collection and path
72
+ # @param scope [Hash] the scope as defined in site configuration
73
+ # @param path [String] the path to check for
74
+ # @param collection [Symbol] the collection (:posts, :pages, etc.) to check for
75
+ # @return [Boolean] true if the scope applies to the given collection and path
78
76
  def applies?(scope, path, collection)
79
77
  applies_collection?(scope, collection) && applies_path?(scope, path)
80
78
  end
@@ -129,7 +127,6 @@ module Bridgetown
129
127
  #
130
128
  # @param scope [Hash] the defaults set being asked about
131
129
  # @param collection [Symbol] the collection of the resource being processed
132
- #
133
130
  # @return [Boolean] whether either of the above conditions are satisfied
134
131
  def applies_collection?(scope, collection)
135
132
  !scope.key?("collection") || scope["collection"].eql?(collection.to_s)
@@ -137,8 +134,7 @@ module Bridgetown
137
134
 
138
135
  # Checks if a given set of default values is valid
139
136
  #
140
- # @param set [Hash] the default value hash as defined in bridgetown.config.yml
141
- #
137
+ # @param set [Hash] the default value hash as defined in site configuration
142
138
  # @return [Boolean] if the set is valid and can be used
143
139
  def valid?(set)
144
140
  set.is_a?(Hash) && set["values"].is_a?(Hash)
@@ -146,10 +142,9 @@ module Bridgetown
146
142
 
147
143
  # Determines if a new scope has precedence over an old one
148
144
  #
149
- # old_scope - the old scope hash, or nil if there's none
150
- # new_scope - the new scope hash
151
- #
152
- # Returns true if the new scope has precedence over the older
145
+ # @param old_scope [Hash] old scope hash, or nil if there's none
146
+ # @param new_scope [Hash] new scope hash
147
+ # @return [Boolean] true if the new scope has precedence over the older
153
148
  # rubocop: disable Naming/PredicateName
154
149
  def has_precedence?(old_scope, new_scope)
155
150
  return true if old_scope.nil?
@@ -25,13 +25,13 @@ module Bridgetown
25
25
  .htm
26
26
  ).freeze
27
27
 
28
- # Initialize a new GeneratedPage.
28
+ # Initialize a new GeneratedPage
29
29
  #
30
- # site - The Site object.
31
- # base - The String path to the source.
32
- # dir - The String path between the source and the file.
33
- # name - The String filename of the file.
34
- # from_plugin - true if the Page file is located in a Gem-based plugin folder
30
+ # @param site [Bridgetown::Site]
31
+ # @param base [String] path to the source
32
+ # @param dir [String] path between the source and the file
33
+ # @param name [String] filename of the file.
34
+ # @param from_plugin [Boolean] true if the Page file is located in a Gem-based plugin folder
35
35
  # rubocop:disable Metrics/ParameterLists
36
36
  def initialize(site, base, dir, name, from_plugin: false)
37
37
  @site = site
@@ -76,7 +76,6 @@ module Bridgetown
76
76
  # Check incoming prototype configuration and normalize options.
77
77
  #
78
78
  # @param prototype_page [Bridgetown::GeneratedPage, Bridgetown::Resource::Base]
79
- #
80
79
  # @return [String, nil]
81
80
  def validate_search_term(prototype_page)
82
81
  # @type [String]
@@ -108,7 +107,6 @@ module Bridgetown
108
107
  # Provide a list of all relevent indexed values for the given term.
109
108
  #
110
109
  # @param search_term [String]
111
- #
112
110
  # @return [Array<String>]
113
111
  def terms_matching_pages(search_term)
114
112
  pages_list = site.collections[@configured_collection].resources
@@ -25,7 +25,6 @@ module Bridgetown
25
25
 
26
26
  @registry = {}
27
27
 
28
- NotAvailable = Class.new(RuntimeError)
29
28
  Uncallable = Class.new(RuntimeError)
30
29
 
31
30
  def self.priority_value(priority)
@@ -95,11 +95,10 @@ module Bridgetown
95
95
  content || ""
96
96
  end
97
97
 
98
- # Accessor for data properties by Liquid.
98
+ # Accessor for data properties by Liquid
99
99
  #
100
- # property - The String name of the property to retrieve.
101
- #
102
- # Returns the String value or nil if the property isn't included.
100
+ # @param property [String] name of the property to retrieve
101
+ # @return [String, nil] value or nil if the property isn't included
103
102
  def [](property)
104
103
  data[property]
105
104
  end
@@ -4,11 +4,9 @@ module Bridgetown
4
4
  module LiquidExtensions
5
5
  # Lookup a Liquid variable in the given context.
6
6
  #
7
- # context - the Liquid context in question.
8
- # variable - the variable name, as a string.
9
- #
10
- # Returns the value of the variable in the context
11
- # or the variable name if not found.
7
+ # @param context [Liquid::Context]
8
+ # @param variable [String] the variable name
9
+ # @return [Object] value of the variable in the context or the variable name if not found
12
10
  def lookup_variable(context, variable)
13
11
  lookup = context
14
12
 
@@ -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.
@@ -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
 
@@ -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
 
@@ -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