bridgetown-core 1.0.0 → 1.1.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -1
  3. data/bridgetown-core.gemspec +0 -1
  4. data/lib/bridgetown-core/collection.rb +39 -22
  5. data/lib/bridgetown-core/commands/apply.rb +3 -3
  6. data/lib/bridgetown-core/commands/build.rb +6 -6
  7. data/lib/bridgetown-core/commands/concerns/actions.rb +3 -2
  8. data/lib/bridgetown-core/commands/concerns/build_options.rb +2 -2
  9. data/lib/bridgetown-core/commands/configure.rb +1 -1
  10. data/lib/bridgetown-core/commands/console.rb +5 -5
  11. data/lib/bridgetown-core/commands/doctor.rb +7 -7
  12. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +95 -12
  13. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -6
  14. data/lib/bridgetown-core/commands/new.rb +20 -19
  15. data/lib/bridgetown-core/commands/plugins.rb +47 -9
  16. data/lib/bridgetown-core/commands/registrations.rb +2 -3
  17. data/lib/bridgetown-core/commands/serve.rb +2 -2
  18. data/lib/bridgetown-core/commands/start.rb +3 -0
  19. data/lib/bridgetown-core/commands/webpack/update.rb +3 -3
  20. data/lib/bridgetown-core/commands/webpack/webpack.defaults.js.erb +19 -14
  21. data/lib/bridgetown-core/component.rb +14 -8
  22. data/lib/bridgetown-core/concerns/localizable.rb +20 -0
  23. data/lib/bridgetown-core/concerns/prioritizable.rb +44 -0
  24. data/lib/bridgetown-core/concerns/publishable.rb +11 -1
  25. data/lib/bridgetown-core/concerns/site/configurable.rb +2 -10
  26. data/lib/bridgetown-core/concerns/site/localizable.rb +5 -1
  27. data/lib/bridgetown-core/concerns/site/ssr.rb +3 -3
  28. data/lib/bridgetown-core/concerns/site/writable.rb +28 -0
  29. data/lib/bridgetown-core/concerns/transformable.rb +2 -2
  30. data/lib/bridgetown-core/configuration.rb +4 -2
  31. data/lib/bridgetown-core/configurations/bt-postcss/postcss.config.js +5 -3
  32. data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -1
  33. data/lib/bridgetown-core/configurations/lit/esbuild-plugins.js +21 -0
  34. data/lib/bridgetown-core/configurations/lit/happy-days.lit.js +26 -0
  35. data/lib/bridgetown-core/configurations/lit/lit-components-entry.js +1 -0
  36. data/lib/bridgetown-core/configurations/lit/lit-ssr.config.js +6 -0
  37. data/lib/bridgetown-core/configurations/lit.rb +95 -0
  38. data/lib/bridgetown-core/configurations/open-props/variables.css.erb +11 -0
  39. data/lib/bridgetown-core/configurations/open-props.rb +21 -0
  40. data/lib/bridgetown-core/configurations/ruby2js/hello_world.js.rb +9 -0
  41. data/lib/bridgetown-core/configurations/ruby2js.rb +67 -0
  42. data/lib/bridgetown-core/configurations/shoelace.rb +50 -0
  43. data/lib/bridgetown-core/configurations/tailwindcss.rb +16 -2
  44. data/lib/bridgetown-core/configurations/turbo/turbo_transitions.js +1 -1
  45. data/lib/bridgetown-core/converters/erb_templates.rb +7 -2
  46. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  47. data/lib/bridgetown-core/converters/serbea_templates.rb +1 -4
  48. data/lib/bridgetown-core/drops/generated_page_drop.rb +2 -1
  49. data/lib/bridgetown-core/drops/resource_drop.rb +2 -1
  50. data/lib/bridgetown-core/errors.rb +5 -5
  51. data/lib/bridgetown-core/filters/translation_filters.rb +11 -0
  52. data/lib/bridgetown-core/filters/url_filters.rb +37 -10
  53. data/lib/bridgetown-core/filters.rb +3 -0
  54. data/lib/bridgetown-core/frontmatter_defaults.rb +14 -8
  55. data/lib/bridgetown-core/generated_page.rb +1 -0
  56. data/lib/bridgetown-core/kramdown/parser/gfm.rb +36 -0
  57. data/lib/bridgetown-core/model/base.rb +3 -4
  58. data/lib/bridgetown-core/plugin.rb +6 -37
  59. data/lib/bridgetown-core/plugin_manager.rb +3 -2
  60. data/lib/bridgetown-core/rack/boot.rb +7 -2
  61. data/lib/bridgetown-core/rack/logger.rb +14 -4
  62. data/lib/bridgetown-core/rack/roda.rb +106 -9
  63. data/lib/bridgetown-core/rack/routes.rb +67 -2
  64. data/lib/bridgetown-core/resource/base.rb +9 -6
  65. data/lib/bridgetown-core/resource/destination.rb +18 -0
  66. data/lib/bridgetown-core/resource/permalink_processor.rb +6 -4
  67. data/lib/bridgetown-core/resource/relations.rb +1 -1
  68. data/lib/bridgetown-core/ruby_template_view.rb +3 -3
  69. data/lib/bridgetown-core/static_file.rb +1 -1
  70. data/lib/bridgetown-core/tags/highlight.rb +1 -1
  71. data/lib/bridgetown-core/tags/post_url.rb +1 -1
  72. data/lib/bridgetown-core/url.rb +1 -1
  73. data/lib/bridgetown-core/utils/aux.rb +2 -1
  74. data/lib/bridgetown-core/utils/require_gems.rb +3 -6
  75. data/lib/bridgetown-core/utils.rb +24 -11
  76. data/lib/bridgetown-core/version.rb +2 -2
  77. data/lib/bridgetown-core/watcher.rb +21 -8
  78. data/lib/bridgetown-core.rb +8 -2
  79. data/lib/site_template/Gemfile.erb +4 -0
  80. data/lib/site_template/README.md +2 -2
  81. data/lib/site_template/bridgetown.config.yml +3 -0
  82. data/lib/site_template/frontend/javascript/index.js.erb +1 -0
  83. data/lib/site_template/frontend/styles/syntax-highlighting.css +77 -0
  84. data/lib/site_template/package.json.erb +18 -18
  85. data/lib/site_template/server/roda_app.rb +3 -6
  86. data/lib/site_template/src/404.html +2 -1
  87. data/lib/site_template/src/500.html +10 -0
  88. metadata +20 -19
  89. data/lib/bridgetown-core/publisher.rb +0 -29
@@ -13,6 +13,9 @@ module Bridgetown
13
13
  end
14
14
 
15
15
  desc "list", "List information about installed plugins"
16
+ option :verbose,
17
+ type: :boolean,
18
+ desc: "Print the source path of each plugin"
16
19
  def list
17
20
  site = Bridgetown::Site.new(configuration_with_overrides(options))
18
21
  site.reset
@@ -32,7 +35,7 @@ module Bridgetown
32
35
  end
33
36
  end
34
37
 
35
- Bridgetown.logger.info("Source Manifests:", "---") unless pm.class.source_manifests.empty?
38
+ Bridgetown.logger.info("Source Manifests:", "----") unless pm.class.source_manifests.empty?
36
39
 
37
40
  pm.class.source_manifests.each do |manifest|
38
41
  Bridgetown.logger.info("Origin:", (manifest.origin || "n/a").to_s.green)
@@ -40,20 +43,27 @@ module Bridgetown
40
43
  Bridgetown.logger.info("Content:", (manifest.content || "n/a").to_s.cyan)
41
44
  Bridgetown.logger.info("Layouts:", (manifest.layouts || "n/a").to_s.cyan)
42
45
 
43
- Bridgetown.logger.info("", "---")
46
+ Bridgetown.logger.info("", "----")
44
47
  end
45
48
 
46
49
  unless Bridgetown.autoload? :Builder
47
50
  builders = Bridgetown::Builder.descendants
48
51
  Bridgetown.logger.info("Builders:", builders.length.to_s.yellow.bold)
49
52
 
50
- builders.each do |builder|
51
- name = builder.respond_to?(:custom_name) ? builder.custom_name : builder.name
53
+ builders.sort.each do |builder|
54
+ name = plugin_name_for(builder)
52
55
  name_components = name.split("::")
53
56
  last_name = name_components.pop
54
57
  name_components.push last_name.magenta
55
58
  Bridgetown.logger.info("", name_components.join("::"))
59
+ next unless options[:verbose]
60
+
61
+ Bridgetown.logger.info(
62
+ "", "PATH: " + builder_path_for(builder)
63
+ )
64
+ Bridgetown.logger.info("")
56
65
  end
66
+ Bridgetown.logger.info("", "----")
57
67
  end
58
68
 
59
69
  Bridgetown.logger.info("Converters:", site.converters.length.to_s.yellow.bold)
@@ -64,8 +74,16 @@ module Bridgetown
64
74
  last_name = name_components.pop
65
75
  name_components.push last_name.magenta
66
76
  Bridgetown.logger.info("", name_components.join("::"))
77
+ next unless options[:verbose]
78
+
79
+ Bridgetown.logger.info(
80
+ "", "PATH: " + converter_path_for(converter)
81
+ )
82
+ Bridgetown.logger.info("")
67
83
  end
68
84
 
85
+ Bridgetown.logger.info("", "----")
86
+
69
87
  Bridgetown.logger.info("Generators:", site.generators.length.to_s.yellow.bold)
70
88
 
71
89
  site.generators.each do |generator|
@@ -74,6 +92,12 @@ module Bridgetown
74
92
  last_name = name_components.pop
75
93
  name_components.push last_name.magenta
76
94
  Bridgetown.logger.info("", name_components.join("::"))
95
+ next unless options[:verbose]
96
+
97
+ Bridgetown.logger.info(
98
+ "", "PATH: " + generator_path_for(generator)
99
+ )
100
+ Bridgetown.logger.info("")
77
101
  end
78
102
  end
79
103
 
@@ -120,6 +144,7 @@ module Bridgetown
120
144
  " return to your site root.")
121
145
  puts
122
146
 
147
+ # rubocop: disable Style/RedundantCondition
123
148
  Dir.chdir dir do
124
149
  ENV["BRIDGETOWN_SITE"] = site.root_dir
125
150
  if ENV["SHELL"]
@@ -128,6 +153,7 @@ module Bridgetown
128
153
  system("/bin/sh")
129
154
  end
130
155
  end
156
+ # rubocop: enable Style/RedundantCondition
131
157
 
132
158
  puts
133
159
  Bridgetown.logger.info("Done!", "You're back in #{Dir.pwd.green}")
@@ -194,11 +220,23 @@ module Bridgetown
194
220
  protected
195
221
 
196
222
  def plugin_name_for(plugin)
197
- if plugin.class.respond_to?(:custom_name)
198
- plugin.class.custom_name
199
- else
200
- plugin.class.name
201
- end
223
+ klass = plugin.is_a?(Class) ? plugin : plugin.class
224
+ klass.respond_to?(:custom_name) ? klass.custom_name : klass.name
225
+ end
226
+
227
+ def builder_path_for(plugin)
228
+ klass = plugin.is_a?(Class) ? plugin : plugin.class
229
+ klass.instance_method(:build).source_location[0]
230
+ end
231
+
232
+ def converter_path_for(plugin)
233
+ klass = plugin.is_a?(Class) ? plugin : plugin.class
234
+ klass.instance_method(:convert).source_location[0]
235
+ end
236
+
237
+ def generator_path_for(plugin)
238
+ klass = plugin.is_a?(Class) ? plugin : plugin.class
239
+ klass.instance_method(:generate).source_location[0]
202
240
  end
203
241
  end
204
242
  end
@@ -4,12 +4,11 @@ module Bridgetown
4
4
  module Commands
5
5
  module Registrations
6
6
  def self.registrations
7
- @registrations || []
7
+ @registrations ||= []
8
8
  end
9
9
 
10
10
  def self.register(&block)
11
- @registrations ||= []
12
- @registrations.push(block)
11
+ registrations << block
13
12
  end
14
13
  end
15
14
  end
@@ -178,8 +178,8 @@ module Bridgetown
178
178
 
179
179
  Process.detach(pid)
180
180
  Bridgetown.logger.info "Server detached with pid '#{pid}'.", \
181
- "Run `pkill -f bridgetown' or `kill -9 #{pid}'" \
182
- " to stop the server."
181
+ "Run `pkill -f bridgetown' or `kill -9 #{pid}' " \
182
+ "to stop the server."
183
183
  else
184
184
  t = Thread.new { server.start }
185
185
  trap("INT") { server.shutdown }
@@ -70,6 +70,9 @@ module Bridgetown
70
70
  end
71
71
 
72
72
  cli = Puma::CLI.new puma_args
73
+ cli.launcher.events.on_stopped do
74
+ Bridgetown::Hooks.trigger :site, :server_shutdown
75
+ end
73
76
  cli.run
74
77
  end
75
78
 
@@ -7,11 +7,11 @@ say "🎉 Webpack configuration updated successfully!"
7
7
 
8
8
  return if Bridgetown.environment.test?
9
9
 
10
- required_packages = %w(esbuild esbuild-loader webpack@5.39.1 webpack-cli@4.7.2 webpack-manifest-plugin@3.1.1)
11
- redundant_packages = %w(@babel/core @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators @babel/plugin-transform-runtime @babel/preset-env babel-loader)
10
+ required_packages = %w(esbuild esbuild-loader css-loader@6.7.1 webpack@5.72.0 webpack-cli@4.9.2 webpack-manifest-plugin@5.0.0)
11
+ redundant_packages = %w(@babel/core @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators @babel/plugin-transform-runtime @babel/preset-env babel-loader file-loader)
12
12
 
13
13
  say "Installing required packages"
14
- run "yarn add -D #{required_packages.join(" ")}"
14
+ run "yarn add -D --tilde #{required_packages.join(" ")}"
15
15
 
16
16
  packages_to_remove = package_json["devDependencies"].slice(*redundant_packages).keys
17
17
  unless packages_to_remove.empty?
@@ -41,7 +41,9 @@ const cssRules = {
41
41
  {
42
42
  loader: "css-loader",
43
43
  options: {
44
- url: url => !url.startsWith('/'),
44
+ url: {
45
+ filter: url => !url.startsWith('/')
46
+ },
45
47
  importLoaders: 1
46
48
  }
47
49
  }
@@ -49,7 +51,14 @@ const cssRules = {
49
51
  mode: '<%= self.config.uses_postcss? ? "postcss" : "sass" %>',
50
52
 
51
53
  postcss: () => {
52
- cssRules.use.push("postcss-loader")
54
+ cssRules.use.push({
55
+ loader: "postcss-loader",
56
+ options: {
57
+ postcssOptions: {
58
+ config: "postcss.config.js"
59
+ }
60
+ }
61
+ })
53
62
  return { test: cssRules.test, use: cssRules.use }
54
63
  },
55
64
 
@@ -72,22 +81,18 @@ const cssRules = {
72
81
 
73
82
  const fontsRule = {
74
83
  test: /\.woff2?$|\.ttf$|\.eot$/,
75
- loader: "file-loader",
76
- options: {
77
- name: "[name]-[contenthash].[ext]",
78
- outputPath: "../fonts",
79
- publicPath: "../fonts",
80
- },
84
+ type: "asset/resource",
85
+ generator: {
86
+ filename: "../fonts/[name]-[hash][ext][query]"
87
+ }
81
88
  }
82
89
 
83
90
  const imagesRule = {
84
91
  test: /\.png?$|\.gif$|\.jpg$|\.svg$/,
85
- loader: "file-loader",
86
- options: {
87
- name: "[path][name]-[contenthash].[ext]",
88
- outputPath: "../",
89
- publicPath: "../",
90
- },
92
+ type: "asset/resource",
93
+ generator: {
94
+ filename: "../[path][name]-[hash][ext][query]"
95
+ }
91
96
  }
92
97
 
93
98
  // Default configuration object
@@ -4,7 +4,7 @@ module Bridgetown
4
4
  class Component
5
5
  extend Forwardable
6
6
 
7
- def_delegators :@view_context, :helpers, :liquid_render, :partial
7
+ def_delegators :@view_context, :liquid_render, :partial
8
8
 
9
9
  # @return [Bridgetown::Site]
10
10
  attr_reader :site # will be nil unless you explicitly set a `@site` ivar
@@ -32,14 +32,12 @@ module Bridgetown
32
32
  def renderer_for_ext(ext, &block)
33
33
  @_tmpl ||= case ext.to_s
34
34
  when "erb"
35
- include ERBCapture
36
35
  Tilt::ErubiTemplate.new(component_template_path,
37
36
  outvar: "@_erbout",
38
37
  bufval: "Bridgetown::OutputBuffer.new",
39
38
  engine_class: Bridgetown::ERBEngine,
40
39
  &block)
41
- when "serb" # requires serbea
42
- include Serbea::Helpers
40
+ when "serb"
43
41
  Tilt::SerbeaTemplate.new(component_template_path, &block)
44
42
  when "slim" # requires bridgetown-slim
45
43
  Slim::Template.new(component_template_path, &block)
@@ -138,7 +136,7 @@ module Bridgetown
138
136
  end
139
137
  rescue StandardError => e
140
138
  Bridgetown.logger.error "Component error:",
141
- "#{self.class} encountered an error while "\
139
+ "#{self.class} encountered an error while " \
142
140
  "rendering `#{self.class.path_for_errors}'"
143
141
  raise e
144
142
  end
@@ -166,12 +164,20 @@ module Bridgetown
166
164
  def _renderer
167
165
  @_renderer ||= begin
168
166
  ext = File.extname(self.class.component_template_path).delete_prefix(".")
169
- self.class.renderer_for_ext(ext) { self.class.component_template_content }
167
+ self.class.renderer_for_ext(ext) { self.class.component_template_content }.tap do |rn|
168
+ self.class.include(rn.is_a?(Tilt::SerbeaTemplate) ? Serbea::Helpers : ERBCapture)
169
+ end
170
170
  end
171
171
  end
172
172
 
173
+ def helpers
174
+ @helpers ||= Bridgetown::RubyTemplateView::Helpers.new(
175
+ self, view_context&.site || Bridgetown::Current.site
176
+ )
177
+ end
178
+
173
179
  def method_missing(method, *args, **kwargs, &block)
174
- if view_context && helpers.respond_to?(method.to_sym)
180
+ if helpers.respond_to?(method.to_sym)
175
181
  helpers.send method.to_sym, *args, **kwargs, &block
176
182
  else
177
183
  super
@@ -179,7 +185,7 @@ module Bridgetown
179
185
  end
180
186
 
181
187
  def respond_to_missing?(method, include_private = false)
182
- (view_context && helpers.respond_to?(method.to_sym, include_private)) || super
188
+ helpers.respond_to?(method.to_sym, include_private) || super
183
189
  end
184
190
  end
185
191
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Localizable
5
+ def all_locales
6
+ result_set = case self
7
+ when Bridgetown::Resource::Base
8
+ collection.resources
9
+ when Bridgetown::GeneratedPage
10
+ site.generated_pages
11
+ else
12
+ []
13
+ end
14
+
15
+ result_set.select { |item| item.data.slug == data.slug }.sort_by do |item|
16
+ site.config.available_locales.index item.data.locale
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Prioritizable
5
+ module ClassMethods
6
+ # @!method priorities
7
+ # @return [Hash<Symbol, Object>]
8
+
9
+ # Get or set the priority of this class. When called without an
10
+ # argument it returns the priority. When an argument is given, it will
11
+ # set the priority.
12
+ #
13
+ # @param priority [Symbol] new priority (optional)
14
+ # Valid options are: `:lowest`, `:low`, `:normal`, `:high`, `:highest`
15
+ # @return [Symbol]
16
+ def priority(priority = nil)
17
+ @priority ||= nil
18
+ @priority = priority if priority && priorities.key?(priority)
19
+ @priority || :normal
20
+ end
21
+
22
+ # Spaceship is priority [higher -> lower]
23
+ #
24
+ # @param other [Class] The class to be compared.
25
+ # @return [Integer] -1, 0, 1.
26
+ def <=>(other)
27
+ priorities[other.priority] <=> priorities[priority]
28
+ end
29
+ end
30
+
31
+ def self.included(klass)
32
+ klass.extend ClassMethods
33
+ klass.class_attribute :priorities, instance_accessor: false
34
+ end
35
+
36
+ # Spaceship is priority [higher -> lower]
37
+ #
38
+ # @param other [object] The object to be compared.
39
+ # @return [Integer] -1, 0, 1.
40
+ def <=>(other)
41
+ self.class <=> other.class
42
+ end
43
+ end
44
+ end
@@ -2,9 +2,19 @@
2
2
 
3
3
  module Bridgetown
4
4
  module Publishable
5
- # Whether the file is published or not, as indicated in YAML front-matter
5
+ # Whether the resource is published or not, as indicated in YAML front-matter
6
6
  def published?
7
7
  !(data.key?("published") && data["published"] == false)
8
8
  end
9
+
10
+ def publishable?
11
+ return true if collection.data?
12
+ return false unless published? || @site.config.unpublished
13
+
14
+ future_allowed = collection.metadata.future || @site.config.future
15
+ this_time = date.is_a?(Date) ? date.to_time.to_i : date.to_i
16
+
17
+ future_allowed || this_time <= @site.time.to_i
18
+ end
9
19
  end
10
20
  end
@@ -38,7 +38,7 @@ class Bridgetown::Site
38
38
  # @param strip_slash_only [Boolean] set to true if you wish "/" to be returned as ""
39
39
  # @return [String]
40
40
  def base_path(strip_slash_only: false)
41
- (config[:base_path] || config[:baseurl]).yield_self do |path|
41
+ (config[:base_path] || config[:baseurl]).then do |path|
42
42
  strip_slash_only ? path.to_s.sub(%r{^/$}, "") : path
43
43
  end
44
44
  end
@@ -61,14 +61,6 @@ class Bridgetown::Site
61
61
  @frontmatter_defaults ||= Bridgetown::FrontmatterDefaults.new(self)
62
62
  end
63
63
 
64
- # Returns the current instance of {Publisher} or creates a new instance of
65
- # {Publisher} if one doesn't exist.
66
- #
67
- # @return [Publisher] Returns an instance of {Publisher}
68
- def publisher
69
- @publisher ||= Bridgetown::Publisher.new(self)
70
- end
71
-
72
64
  # Prefix a path or paths with the {#root_dir} directory.
73
65
  #
74
66
  # @see Bridgetown.sanitized_path
@@ -166,7 +158,7 @@ class Bridgetown::Site
166
158
  plugin_components_load_paths = Bridgetown::PluginManager.source_manifests
167
159
  .filter_map(&:components)
168
160
 
169
- local_components_load_paths = config["components_dir"].yield_self do |dir|
161
+ local_components_load_paths = config["components_dir"].then do |dir|
170
162
  dir.is_a?(Array) ? dir : [dir]
171
163
  end
172
164
  local_components_load_paths.map! do |dir|
@@ -7,11 +7,15 @@ class Bridgetown::Site
7
7
  def locale
8
8
  @locale ||= begin
9
9
  locale = ENV.fetch("BRIDGETOWN_LOCALE", config[:default_locale]).to_sym
10
- Dir["#{in_source_dir("_locales")}/*.yml"].each do |locale_path|
10
+ Dir["#{in_source_dir("_locales")}/*.{json,rb,yml}"].each do |locale_path|
11
11
  I18n.load_path << locale_path
12
12
  end
13
13
  I18n.available_locales = config[:available_locales]
14
14
  I18n.default_locale = locale
15
+ I18n.fallbacks = (config[:available_locales] + [:en]).uniq.to_h do |available_locale|
16
+ [available_locale, [available_locale, locale, :en].uniq]
17
+ end
18
+ locale
15
19
  end
16
20
  end
17
21
 
@@ -32,7 +32,7 @@ class Bridgetown::Site
32
32
  @ssr_enabled = true
33
33
  end
34
34
 
35
- def ssr_setup
35
+ def ssr_setup(&block)
36
36
  config.serving = true
37
37
  Bridgetown::Hooks.trigger :site, :pre_read, self
38
38
  defaults_reader.tap do |d|
@@ -46,10 +46,10 @@ class Bridgetown::Site
46
46
  end
47
47
  Bridgetown::Hooks.trigger :site, :post_read, self
48
48
 
49
- yield self if block_given? # provide additional setup hook
49
+ block&.call(self) # provide additional setup hook
50
50
  return if Bridgetown.env.production?
51
51
 
52
- Bridgetown::Watcher.watch(self, config)
52
+ Bridgetown::Watcher.watch(self, config, &block)
53
53
  end
54
54
 
55
55
  def disable_ssr
@@ -14,6 +14,8 @@ class Bridgetown::Site
14
14
  # @return [void]
15
15
  def write
16
16
  each_site_file { |item| item.write(dest) }
17
+ write_redirecting_index if config.prefix_default_locale
18
+
17
19
  Bridgetown::Hooks.trigger :site, :post_write, self
18
20
  end
19
21
 
@@ -40,5 +42,31 @@ class Bridgetown::Site
40
42
  }
41
43
  end
42
44
  end
45
+
46
+ def write_redirecting_index
47
+ resource = resources.find do |item|
48
+ item.data.slug == "index" && item.data.locale == config.default_locale
49
+ end
50
+
51
+ unless resource
52
+ Bridgetown.logger.warn(
53
+ "Index file not found in the source folder, cannot generate top-level redirect file"
54
+ )
55
+ return
56
+ end
57
+
58
+ index_html = <<~HTML
59
+ <!DOCTYPE html>
60
+ <html>
61
+ <head>
62
+ <title>Redirecting…</title>
63
+ <meta http-equiv="refresh" content="0; url=#{resource.relative_url}" />
64
+ </head>
65
+ <body></body>
66
+ </html>
67
+ HTML
68
+
69
+ File.write(in_dest_dir("index.html"), index_html, mode: "wb")
70
+ end
43
71
  end
44
72
  end
@@ -23,7 +23,7 @@ module Bridgetown
23
23
  output.html_safe
24
24
  rescue StandardError => e
25
25
  Bridgetown.logger.error "Conversion error:",
26
- "#{converter.class} encountered an error while "\
26
+ "#{converter.class} encountered an error while " \
27
27
  "converting `#{document.relative_path}'"
28
28
  raise e
29
29
  end
@@ -53,7 +53,7 @@ module Bridgetown
53
53
  layout_output
54
54
  rescue StandardError => e
55
55
  Bridgetown.logger.error "Conversion error:",
56
- "#{converter.class} encountered an error while "\
56
+ "#{converter.class} encountered an error while " \
57
57
  "converting `#{document.relative_path}'"
58
58
  raise e
59
59
  end
@@ -59,6 +59,7 @@ module Bridgetown
59
59
  # Output Configuration
60
60
  "available_locales" => [:en],
61
61
  "default_locale" => :en,
62
+ "prefix_default_locale" => false,
62
63
  "permalink" => nil, # default is set according to content engine
63
64
  "timezone" => nil, # use the local timezone
64
65
 
@@ -83,6 +84,7 @@ module Bridgetown
83
84
  "footnote_nr" => 1,
84
85
  "show_warnings" => false,
85
86
  "include_extraction_tags" => false,
87
+ "mark_highlighting" => true,
86
88
  },
87
89
  }.each_with_object(Configuration.new) { |(k, v), hsh| hsh[k] = v.freeze }.freeze
88
90
 
@@ -206,8 +208,8 @@ module Bridgetown
206
208
  config = Utils.deep_merge_hashes(self, new_config)
207
209
  end
208
210
  rescue ArgumentError => e
209
- Bridgetown.logger.warn "WARNING:", "Error reading configuration. Using defaults" \
210
- " (and options)."
211
+ Bridgetown.logger.warn "WARNING:", "Error reading configuration. Using defaults " \
212
+ "(and options)."
211
213
  warn e
212
214
  end
213
215
 
@@ -1,8 +1,10 @@
1
1
  module.exports = {
2
2
  plugins: {
3
- 'postcss-easy-import': {},
4
3
  'postcss-mixins': {},
5
- 'postcss-color-function': {},
4
+ 'postcss-color-mod-function': {
5
+ // Uncomment the following to import CSS variables for use in `color-mod`:
6
+ // importFrom: "frontend/styles/variables.css"
7
+ },
6
8
  'postcss-flexbugs-fixes': {},
7
9
  'postcss-preset-env': {
8
10
  autoprefixer: {
@@ -14,7 +16,7 @@ module.exports = {
14
16
  'custom-media-queries': true
15
17
  },
16
18
  },
17
- 'cssnano' : {
19
+ 'cssnano': {
18
20
  preset: 'default'
19
21
  }
20
22
  }
@@ -14,7 +14,7 @@ end
14
14
  confirm = ask "This configuration will ovewrite your existing #{"postcss.config.js".bold.white}. Would you like to continue? [Yn]"
15
15
  return unless confirm.casecmp?("Y")
16
16
 
17
- plugins = %w(postcss-easy-import postcss-mixins postcss-color-function cssnano)
17
+ plugins = %w(postcss-mixins postcss-color-mod-function cssnano)
18
18
 
19
19
  say "Adding the following PostCSS plugins: #{plugins.join(' | ')}", :green
20
20
  run "yarn add -D #{plugins.join(' ')}"
@@ -0,0 +1,21 @@
1
+ // You can add "full-stack" esbuild plugins here that you wish to share between
2
+ // the frontend bundles and Lit SSR. Just import your plugins and add them and
3
+ // any additional configuration to the `plugins` array below.
4
+
5
+ // This plugin will let you import `.lit.css` files as sidecar stylesheets.
6
+ // Read https://edge.bridgetownrb.com/docs/components/lit#sidecar-css-files for documentation.
7
+ const { litCssPlugin } = require("esbuild-plugin-lit-css")
8
+ const postCssConfig = require("postcss-load-config").sync()
9
+ const postCssProcessor = require("postcss")([...postCssConfig.plugins])
10
+
11
+ module.exports = {
12
+ plugins: [
13
+ litCssPlugin({
14
+ filter: /\.lit\.css$/,
15
+ transform: async (css, { filePath }) => {
16
+ const results = await postCssProcessor.process(css, { ...postCssConfig.options, from: filePath })
17
+ return results.css
18
+ }
19
+ }),
20
+ ]
21
+ }
@@ -0,0 +1,26 @@
1
+ import { LitElement, html, css } from "lit"
2
+
3
+ export class HappyDaysElement extends LitElement {
4
+ static styles = css`
5
+ :host {
6
+ display: block;
7
+ border: 2px dashed gray;
8
+ padding: 20px;
9
+ max-width: 300px;
10
+ }
11
+ `
12
+
13
+ static properties = {
14
+ hello: { type: String }
15
+ }
16
+
17
+ render() {
18
+ return html`
19
+ <p>Hello ${this.hello}! ${Date.now()}</p>
20
+ `;
21
+ }
22
+ }
23
+
24
+ // Try adding `<%= lit :happy_days, hello: "there" %>` somewhere in an ERB template
25
+ // on your site to see this example Lit component in action!
26
+ customElements.define("happy-days", HappyDaysElement)
@@ -0,0 +1 @@
1
+ import components from "bridgetownComponents/**/*.{lit.js,lit.js.rb}"
@@ -0,0 +1,6 @@
1
+ const build = require("bridgetown-lit-renderer/build")
2
+ const { plugins } = require("./esbuild-plugins.js")
3
+
4
+ const esbuildOptions = { plugins }
5
+
6
+ build(esbuildOptions)