bridgetown-core 2.0.0.beta3 → 2.0.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/bridgetown-core.gemspec +43 -42
  3. data/lib/bridgetown-core/collection.rb +5 -4
  4. data/lib/bridgetown-core/commands/base.rb +7 -0
  5. data/lib/bridgetown-core/commands/build.rb +29 -5
  6. data/lib/bridgetown-core/commands/console.rb +0 -1
  7. data/lib/bridgetown-core/commands/start.rb +12 -2
  8. data/lib/bridgetown-core/concerns/intuitive_expectations.rb +67 -0
  9. data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +15 -7
  10. data/lib/bridgetown-core/concerns/site/ssr.rb +1 -1
  11. data/lib/bridgetown-core/concerns/site/writable.rb +1 -0
  12. data/lib/bridgetown-core/concerns/viewable.rb +46 -0
  13. data/lib/bridgetown-core/configuration.rb +21 -9
  14. data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +5 -5
  15. data/lib/bridgetown-core/configurations/minitesting.rb +24 -64
  16. data/lib/bridgetown-core/converters/erb_templates.rb +11 -7
  17. data/lib/bridgetown-core/converters/serbea_templates.rb +7 -4
  18. data/lib/bridgetown-core/front_matter/defaults.rb +6 -6
  19. data/lib/bridgetown-core/helpers.rb +2 -2
  20. data/lib/bridgetown-core/rack/boot.rb +7 -57
  21. data/lib/bridgetown-core/rack/default_config.ru +14 -0
  22. data/lib/bridgetown-core/rack/loader_hooks.rb +83 -0
  23. data/lib/bridgetown-core/rack/routes.rb +3 -2
  24. data/lib/bridgetown-core/resource/relations.rb +3 -1
  25. data/lib/bridgetown-core/utils/initializers.rb +2 -2
  26. data/lib/bridgetown-core.rb +28 -8
  27. data/lib/roda/plugins/bridgetown_server.rb +12 -23
  28. data/lib/roda/plugins/bridgetown_ssr.rb +21 -3
  29. data/lib/roda/plugins/flashier.rb +57 -0
  30. data/lib/roda/plugins/generic_index.html +127 -0
  31. data/lib/roda/plugins/ssg.rb +3 -2
  32. data/lib/site_template/config/initializers.rb +2 -0
  33. metadata +24 -5
  34. data/lib/bridgetown-core/commands/doctor.rb +0 -147
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f521946dedcb0f22d30ef1ca8be0aa3c2f1eb967dfc629f0da7c1640ddfba1e
4
- data.tar.gz: 2f6479875ecc1f3271d20e4b1626c8bff8e305f8e5cb82fa49d6676b786b4495
3
+ metadata.gz: 813f0bb565e3342b5eb466d6f3f65575adec5ba64d0a355c29c49f74925ee695
4
+ data.tar.gz: b8141708de43e8035b04ce2085fded27ddd5f4b5657ed53143c80ccf26927b5e
5
5
  SHA512:
6
- metadata.gz: 4036965b0db3c36e648dd4e80cd2656d4aeb03619a37530e6145bf84dbcd6f46eda5ccbaa051f3c605922b72618a4ebdd2de6e2d14962f441afad0ed6bb40a8d
7
- data.tar.gz: 86b1e921da1dbaf594760f5269d47517ff54498bba74ff721f82d0963308f694a0452715a5b875da963fc29e9074a4221b84e4887aaa36dd6847491d9df0e501
6
+ metadata.gz: acad0c9039fcad0cf8654b19672b149ef660cc2adb75307a810d9379695a54398c6dbaffb206f850b2272e831b2280853f82b20e35115c0454457e21ec22c055
7
+ data.tar.gz: 51af878741c57eac002b78b3690887703d0469f851f6b980203f187d5731282feec110d91ad0abafa60fc99d3ba813d39b8174a22931d32daf4eb209511774e1
@@ -2,58 +2,59 @@
2
2
 
3
3
  require_relative "../bridgetown-foundation/lib/bridgetown/version"
4
4
 
5
- Gem::Specification.new do |s|
6
- s.name = "bridgetown-core"
7
- s.version = Bridgetown::VERSION
8
- s.license = "MIT"
9
- s.author = "Bridgetown Team"
10
- s.email = "maintainers@bridgetownrb.com"
11
- s.homepage = "https://www.bridgetownrb.com"
12
- s.summary = "A next-generation, progressive site generator & fullstack framework, powered by Ruby"
13
- s.description = "Bridgetown is a next-generation, progressive site generator & fullstack framework, powered by Ruby"
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "bridgetown-core"
7
+ spec.version = Bridgetown::VERSION
8
+ spec.license = "MIT"
9
+ spec.author = "Bridgetown Team"
10
+ spec.email = "maintainers@bridgetownrb.com"
11
+ spec.homepage = "https://www.bridgetownrb.com"
12
+ spec.summary = "A next-generation, progressive site generator & fullstack framework, powered by Ruby"
13
+ spec.description = "Bridgetown is a next-generation, progressive site generator & fullstack framework, powered by Ruby"
14
14
 
15
- s.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
16
  f.match(%r!^(benchmark|features|script|test)/!)
17
17
  end
18
- s.executables = ["bridgetown", "bt"] # `bt` is a shortcut to `bridgetown` command
19
- s.bindir = "bin"
20
- s.require_paths = ["lib"]
18
+ spec.executables = ["bridgetown", "bt"] # `bt` is a shortcut to `bridgetown` command
19
+ spec.bindir = "bin"
20
+ spec.require_paths = ["lib"]
21
21
 
22
- s.metadata = {
22
+ spec.metadata = {
23
23
  "source_code_uri" => "https://github.com/bridgetownrb/bridgetown",
24
24
  "bug_tracker_uri" => "https://github.com/bridgetownrb/bridgetown/issues",
25
25
  "changelog_uri" => "https://github.com/bridgetownrb/bridgetown/releases",
26
- "homepage_uri" => s.homepage,
26
+ "homepage_uri" => spec.homepage,
27
27
  "rubygems_mfa_required" => "true",
28
28
  }
29
29
 
30
- s.rdoc_options = ["--charset=UTF-8"]
30
+ spec.rdoc_options = ["--charset=UTF-8"]
31
31
 
32
- s.required_ruby_version = ">= 3.1.0"
32
+ spec.required_ruby_version = ">= 3.1.0"
33
33
 
34
- s.add_runtime_dependency("activesupport", [">= 6.0", "< 8.0"])
35
- s.add_runtime_dependency("addressable", "~> 2.4")
36
- s.add_runtime_dependency("amazing_print", "~> 1.2")
37
- s.add_runtime_dependency("bridgetown-foundation", Bridgetown::VERSION)
38
- s.add_runtime_dependency("csv", "~> 3.2")
39
- s.add_runtime_dependency("dry-inflector", ">= 1.0")
40
- s.add_runtime_dependency("erubi", "~> 1.9")
41
- s.add_runtime_dependency("faraday", "~> 2.0")
42
- s.add_runtime_dependency("faraday-follow_redirects", "~> 0.3")
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", "< 5.5"])
47
- s.add_runtime_dependency("listen", "~> 3.0")
48
- s.add_runtime_dependency("rack", ">= 3.0")
49
- s.add_runtime_dependency("rackup", "~> 2.0")
50
- s.add_runtime_dependency("rake", ">= 13.0")
51
- s.add_runtime_dependency("roda", "~> 3.46")
52
- s.add_runtime_dependency("rouge", [">= 3.0", "< 5.0"])
53
- s.add_runtime_dependency("serbea", "~> 2.1")
54
- s.add_runtime_dependency("signalize", "~> 1.3")
55
- s.add_runtime_dependency("streamlined", ">= 0.6.0")
56
- s.add_runtime_dependency("thor", "~> 1.1")
57
- s.add_runtime_dependency("tilt", "~> 2.0")
58
- s.add_runtime_dependency("zeitwerk", "~> 2.5")
34
+ spec.add_dependency("activesupport", [">= 6.0", "< 8.0"])
35
+ spec.add_dependency("addressable", "~> 2.4")
36
+ spec.add_dependency("amazing_print", "~> 1.2")
37
+ spec.add_dependency("bridgetown-foundation", Bridgetown::VERSION)
38
+ spec.add_dependency("csv", "~> 3.2")
39
+ spec.add_dependency("dry-inflector", ">= 1.0")
40
+ spec.add_dependency("erubi", "~> 1.9")
41
+ spec.add_dependency("faraday", "~> 2.0")
42
+ spec.add_dependency("faraday-follow_redirects", "~> 0.3")
43
+ spec.add_dependency("i18n", "~> 1.0")
44
+ spec.add_dependency("irb", ">= 1.14")
45
+ spec.add_dependency("kramdown", "~> 2.1")
46
+ spec.add_dependency("kramdown-parser-gfm", "~> 1.0")
47
+ spec.add_dependency("liquid", [">= 5.0", "< 5.5"])
48
+ spec.add_dependency("listen", "~> 3.0")
49
+ spec.add_dependency("rack", ">= 3.0")
50
+ spec.add_dependency("rackup", "~> 2.0")
51
+ spec.add_dependency("rake", ">= 13.0")
52
+ spec.add_dependency("roda", "~> 3.46")
53
+ spec.add_dependency("rouge", [">= 3.0", "< 5.0"])
54
+ spec.add_dependency("serbea", "~> 2.1")
55
+ spec.add_dependency("signalize", "~> 1.3")
56
+ spec.add_dependency("streamlined", ">= 0.6.0")
57
+ spec.add_dependency("thor", "~> 1.1")
58
+ spec.add_dependency("tilt", "~> 2.0")
59
+ spec.add_dependency("zeitwerk", "~> 2.5")
59
60
  end
@@ -55,13 +55,13 @@ module Bridgetown
55
55
  # Iterate over Resources by delegating to `resources.each` (supports Enumerable)
56
56
  def each(...) = resources.each(...)
57
57
 
58
- # Delgates to `resources.last`
58
+ # Delegates to `resources.last`
59
59
  def last(...) = resources.last(...)
60
60
 
61
- # Delgates to `resources.deconstruct`
61
+ # Delegates to `resources.deconstruct`
62
62
  def deconstruct = resources.deconstruct
63
63
 
64
- # Delgates to `resources[]`
64
+ # Delegates to `resources[]`
65
65
  def [](...) = resources.[](...)
66
66
 
67
67
  # Fetch the static files in this collection.
@@ -184,7 +184,8 @@ module Bridgetown
184
184
  #
185
185
  # @return [String]
186
186
  def inspect
187
- "#<#{self.class} @label=#{label} resources=#{resources}>"
187
+ "#<#{self.class} #{label}: #{resources.count} metadata=#{metadata.inspect} " \
188
+ "static_files: #{static_files.count}>"
188
189
  end
189
190
 
190
191
  # Produce a sanitized label name
@@ -66,6 +66,13 @@ module Bridgetown
66
66
  puts "Unknown task: #{cmd.split("[")[0]}\n\nHere's a list of tasks you can run:"
67
67
  display_rake_tasks(rake)
68
68
  end
69
+ rescue RuntimeError => e
70
+ # re-raise error unless it's an error through Minitest
71
+ raise e unless e.message.include?("ruby -Ilib:test")
72
+
73
+ Bridgetown.logger.error "test aborted!"
74
+ Bridgetown.logger.error e.message
75
+ exit(false)
69
76
  end
70
77
  end
71
78
  end
@@ -50,11 +50,7 @@ module Bridgetown
50
50
  if Bridgetown::Utils.frontend_bundler_type(config_options[:root_dir]) == :esbuild
51
51
  Bridgetown::Utils.update_esbuild_autogenerated_config config_options
52
52
  end
53
- require "rake"
54
- Rake.with_application do |rake|
55
- rake.load_rakefile
56
- rake["frontend:watcher"].invoke(true)
57
- end
53
+ invoke_frontend_watcher_from_rake
58
54
  end
59
55
 
60
56
  @site = Bridgetown::Site.new(config_options)
@@ -95,6 +91,19 @@ module Bridgetown
95
91
  #
96
92
  # @param options [Bridgetown::Configuration] options loaded from config and/or CLI
97
93
  def watch_site(config_options)
94
+ if config_options["url"]&.include?("://localhost")
95
+ require "socket"
96
+ external_ip = Socket.ip_address_list.find do |ai|
97
+ ai.ipv4? && !ai.ipv4_loopback?
98
+ end&.ip_address
99
+ scheme = config_options.bind&.split("://")&.first == "ssl" ? "https" : "http"
100
+ port = ENV.fetch("BRIDGETOWN_PORT", config_options.port)
101
+ Bridgetown.logger.info ""
102
+ Bridgetown.logger.info "Now serving at:", "#{scheme}://localhost:#{port}".magenta
103
+ Bridgetown.logger.info "", "#{scheme}://#{external_ip}:#{port}".magenta if external_ip
104
+ Bridgetown.logger.info ""
105
+ end
106
+
98
107
  Bridgetown::Watcher.watch(@site, config_options)
99
108
  end
100
109
 
@@ -112,6 +121,21 @@ module Bridgetown
112
121
  plugins_dir = File.expand_path(config_options["plugins_dir"])
113
122
  Bridgetown.logger.info "Custom Plugins:", plugins_dir if Dir.exist?(plugins_dir)
114
123
  end
124
+
125
+ def invoke_frontend_watcher_from_rake
126
+ require "rake"
127
+ Rake.with_application do |rake|
128
+ begin
129
+ rake.raw_load_rakefile
130
+ rescue StandardError => e
131
+ unless e.message.include?("No Rakefile found")
132
+ Bridgetown.logger.error "Error Running Rake:", "#{e.message} (#{e.class})"
133
+ e.backtrace[0..1].each { |backtrace_line| Bridgetown.logger.info backtrace_line }
134
+ end
135
+ end
136
+ rake["frontend:watcher"].invoke(true) if rake.tasks.any? { _1.name == "frontend:watcher" }
137
+ end
138
+ end
115
139
  end
116
140
  end
117
141
  end
@@ -80,7 +80,6 @@ module Bridgetown
80
80
 
81
81
  config_options = configuration_with_overrides(options)
82
82
  if options[:"server-config"]
83
- require "puma"
84
83
  require "bridgetown-core/rack/boot"
85
84
  Bridgetown::Rack.boot
86
85
  else
@@ -77,12 +77,14 @@ module Bridgetown
77
77
  bt_bound_url = "http://#{bt_options.bind}:#{port}"
78
78
 
79
79
  # Set a local site URL in the config if one is not available
80
- bt_options.url = bt_bound_url if Bridgetown.env.development? && !options["url"]
80
+ if Bridgetown.env.development? && !options["url"]
81
+ bt_options.url = bt_bound_url.sub("0.0.0.0", "localhost")
82
+ end
81
83
 
82
84
  Bridgetown::Server.new({
83
85
  Host: bt_options.bind,
84
86
  Port: port,
85
- config: "config.ru",
87
+ config: rack_config_file,
86
88
  }).tap do |server|
87
89
  if server.serveable?
88
90
  pid_tracker.create_pid_dir
@@ -115,6 +117,14 @@ module Bridgetown
115
117
  end
116
118
  end
117
119
  end
120
+
121
+ protected
122
+
123
+ def rack_config_file
124
+ File.exist?("config.ru") ?
125
+ "config.ru" :
126
+ File.expand_path("../rack/default_config.ru", __dir__)
127
+ end
118
128
  end
119
129
  end
120
130
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ # This is for including into Minitest::Expectation
5
+ module IntuitiveExpectations
6
+ def true?(msg = nil)
7
+ must_be(:itself, Minitest::Assertions::UNDEFINED, msg)
8
+ self
9
+ end
10
+
11
+ def false?(msg = nil)
12
+ wont_be(:itself, Minitest::Assertions::UNDEFINED, msg)
13
+ self
14
+ end
15
+
16
+ def ==(other)
17
+ must_equal(other)
18
+ self
19
+ end
20
+
21
+ def !=(other)
22
+ must_not_equal(other)
23
+ self
24
+ end
25
+
26
+ def nil?(msg = nil)
27
+ must_be_nil(msg)
28
+ self
29
+ end
30
+
31
+ def not_nil?(msg = nil)
32
+ wont_be_nil(msg)
33
+ self
34
+ end
35
+
36
+ def empty?(msg = nil)
37
+ must_be_empty(msg)
38
+ self
39
+ end
40
+
41
+ def filled?(msg = nil)
42
+ wont_be_empty(msg)
43
+ self
44
+ end
45
+
46
+ def include?(other, msg = nil)
47
+ must_include(other, msg)
48
+ self
49
+ end
50
+ alias_method :<<, :include?
51
+
52
+ def exclude?(other, msg = nil)
53
+ wont_include(other, msg)
54
+ self
55
+ end
56
+
57
+ def =~(other)
58
+ must_match(other)
59
+ self
60
+ end
61
+
62
+ def is_a?(klass, msg = nil)
63
+ must_be_instance_of(klass, msg)
64
+ self
65
+ end
66
+ end
67
+ end
@@ -10,6 +10,7 @@ class Bridgetown::Site
10
10
  @fast_refresh_ordering = 0
11
11
  full_abort = false
12
12
  found_gen_pages = false
13
+ found_route_file = false
13
14
  paths.each do |path| # rubocop:todo Metrics
14
15
  found_res = resources.select do |resource|
15
16
  resource.id.start_with?("repo://") && in_source_dir(resource.relative_path) == path
@@ -28,7 +29,13 @@ class Bridgetown::Site
28
29
  self, layout.instance_variable_get(:@base), layout.name
29
30
  )
30
31
  end
31
- next unless found_res.any? || pages.any?
32
+
33
+ if config.key?(:routes) # carve out fast refresh track for the routes plugin
34
+ found_route_file = config.routes.source_paths.any? do |routes_dir|
35
+ path.start_with?(in_source_dir(routes_dir))
36
+ end
37
+ end
38
+ next unless found_res.any? || pages.any? || found_route_file
32
39
 
33
40
  if pages.any?
34
41
  found_gen_pages = true
@@ -48,7 +55,7 @@ class Bridgetown::Site
48
55
  end
49
56
 
50
57
  marked_resources = resources.select(&:fast_refresh_order).sort_by(&:fast_refresh_order)
51
- if full_abort || (marked_resources.empty? && !found_gen_pages)
58
+ if full_abort || (marked_resources.empty? && !found_gen_pages && !found_route_file)
52
59
  # Darn, a full reload is needed (unless we're on a super-fast track)
53
60
  if reload_if_needed
54
61
  Bridgetown::Hooks.trigger :site, :pre_reload, self, paths
@@ -62,13 +69,14 @@ class Bridgetown::Site
62
69
 
63
70
  Bridgetown::Hooks.trigger :site, :fast_refresh, self
64
71
 
65
- liquid_renderer.reset
66
- transform_resources_for_fast_refresh(marked_resources, found_gen_pages)
67
- transform_generated_pages_for_fast_refresh
68
-
69
- FileUtils.touch(in_destination_dir("index.html"))
72
+ unless found_route_file
73
+ liquid_renderer.reset
74
+ transform_resources_for_fast_refresh(marked_resources, found_gen_pages)
75
+ transform_generated_pages_for_fast_refresh
76
+ end
70
77
 
71
78
  Bridgetown::Hooks.trigger :site, :post_write, self
79
+ Bridgetown.touch_live_reload_file
72
80
  end
73
81
 
74
82
  private
@@ -28,7 +28,7 @@ class Bridgetown::Site
28
28
 
29
29
  def enable_ssr
30
30
  Bridgetown.logger.info "SSR:", "enabled."
31
- config.fast_refresh = false # SSR mode and Fast Refresh mode are mututally exclusive
31
+ config.fast_refresh = false # SSR mode and Fast Refresh mode are mutually exclusive
32
32
  @ssr_enabled = true
33
33
  end
34
34
 
@@ -17,6 +17,7 @@ class Bridgetown::Site
17
17
  write_redirecting_index if config.prefix_default_locale
18
18
 
19
19
  Bridgetown::Hooks.trigger :site, :post_write, self
20
+ Bridgetown.touch_live_reload_file unless config.disable_disk_cache
20
21
  end
21
22
 
22
23
  # Yields all content objects while looping through {#generated_pages},
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ # This mixin for Bridgetown components allows you to provide front matter and render
5
+ # the component template via the layouts transformation pipeline, which can be called
6
+ # from any Roda route
7
+ module Viewable
8
+ include Bridgetown::RodaCallable
9
+ include Bridgetown::Transformable
10
+
11
+ def site
12
+ @site ||= Bridgetown::Current.site
13
+ end
14
+
15
+ def data
16
+ @data ||= HashWithDotAccess::Hash.new
17
+ end
18
+
19
+ def front_matter(&block)
20
+ Bridgetown::FrontMatter::RubyFrontMatter.new(data:).tap { _1.instance_exec(&block) }
21
+ end
22
+
23
+ def relative_path = self.class.source_location.delete_prefix("#{site.root_dir}/")
24
+
25
+ # Render the component template in the layout specified in your front matter
26
+ #
27
+ # @param app [Roda]
28
+ def render_in_layout(app)
29
+ render_in(app) => rendered_output
30
+
31
+ site.validated_layouts_for(self, data.layout).each do |layout|
32
+ transform_with_layout(layout, rendered_output, self) => rendered_output
33
+ end
34
+
35
+ rendered_output
36
+ end
37
+
38
+ # Pass a block of front matter and render the component template in layouts
39
+ #
40
+ # @param app [Roda]
41
+ def render_with(app, &)
42
+ front_matter(&)
43
+ render_in_layout(app)
44
+ end
45
+ end
46
+ end
@@ -122,14 +122,17 @@ module Bridgetown
122
122
  .setup_load_paths!
123
123
  .setup_locales
124
124
  .add_default_collections
125
- .add_default_excludes
125
+ .add_destination_paths
126
126
  .check_include_exclude
127
127
  end
128
128
  end
129
129
 
130
130
  def run_initializers!(context:) # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity
131
131
  initializers_file = File.join(root_dir, "config", "initializers.rb")
132
- return unless File.file?(initializers_file)
132
+ unless File.file?(initializers_file)
133
+ setup_load_paths! appending: true
134
+ return
135
+ end
133
136
 
134
137
  load initializers_file
135
138
 
@@ -148,11 +151,15 @@ module Bridgetown
148
151
  dsl._run_builtins!
149
152
  self.url = cached_url if cached_url # restore local development URL if need be
150
153
 
151
- setup_load_paths! appending: true
154
+ setup_post_init!
152
155
 
153
156
  self
154
157
  end
155
158
 
159
+ def setup_post_init!
160
+ add_destination_paths.setup_load_paths! appending: true
161
+ end
162
+
156
163
  # @return [Set<SourceManifest>]
157
164
  def source_manifests
158
165
  @source_manifests ||= Set.new
@@ -283,13 +290,13 @@ module Bridgetown
283
290
  end
284
291
 
285
292
  def setup_load_paths!(appending: false) # rubocop:todo Metrics
286
- unless appending
287
- self[:root_dir] = File.expand_path(self[:root_dir])
288
- self[:source] = File.expand_path(self[:source], self[:root_dir])
289
- self[:destination] = File.expand_path(self[:destination], self[:root_dir])
293
+ self[:root_dir] = File.expand_path(self[:root_dir])
294
+ self[:source] = File.expand_path(self[:source], self[:root_dir])
295
+ self[:destination] = File.expand_path(self[:destination], self[:root_dir])
290
296
 
297
+ unless appending
291
298
  autoload_paths.unshift({
292
- path: self[:plugins_dir],
299
+ path: File.expand_path(self[:plugins_dir], self[:root_dir]),
293
300
  eager: true,
294
301
  })
295
302
  autoload_paths.unshift({
@@ -357,13 +364,18 @@ module Bridgetown
357
364
  vendor/bundle/ vendor/cache/ vendor/gems/ vendor/ruby/
358
365
  ).freeze
359
366
 
360
- def add_default_excludes
367
+ def add_destination_paths
368
+ self["keep_files"] << "_bridgetown" unless
369
+ self["keep_files"].nil?.! && self["keep_files"].include?("_bridgetown")
370
+
361
371
  return self if self["exclude"].nil?
362
372
 
363
373
  self["exclude"].concat(DEFAULT_EXCLUDES).uniq!
364
374
  self
365
375
  end
366
376
 
377
+ alias_method :add_default_excludes, :add_destination_paths
378
+
367
379
  def should_execute_inline_ruby?
368
380
  ENV["BRIDGETOWN_RUBY_IN_FRONT_MATTER"] != "false" &&
369
381
  self["ruby_in_front_matter"]
@@ -9,7 +9,7 @@ jobs:
9
9
  build:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v2
12
+ - uses: actions/checkout@v4
13
13
 
14
14
  - name: Setup Ruby
15
15
  uses: ruby/setup-ruby@v1
@@ -17,9 +17,9 @@ jobs:
17
17
  bundler-cache: true
18
18
 
19
19
  - name: Setup Node
20
- uses: actions/setup-node@v2
20
+ uses: actions/setup-node@v4
21
21
  with:
22
- node-version: "20"
22
+ node-version: "22"
23
23
  cache: "npm"
24
24
  - run: npm install
25
25
 
@@ -29,7 +29,7 @@ jobs:
29
29
  run: bin/bridgetown deploy
30
30
 
31
31
  - name: Upload build artifact
32
- uses: actions/upload-pages-artifact@v1
32
+ uses: actions/upload-pages-artifact@v3
33
33
  with:
34
34
  path: ./output
35
35
 
@@ -48,4 +48,4 @@ jobs:
48
48
  steps:
49
49
  - name: Deploy to GitHub Pages
50
50
  id: deployment
51
- uses: actions/deploy-pages@v1
51
+ uses: actions/deploy-pages@v4