bridgetown-core 1.1.0 → 1.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bridgetown +1 -3
  3. data/bridgetown-core.gemspec +7 -6
  4. data/lib/bridgetown-core/collection.rb +5 -2
  5. data/lib/bridgetown-core/commands/base.rb +1 -1
  6. data/lib/bridgetown-core/commands/build.rb +18 -5
  7. data/lib/bridgetown-core/commands/clean.rb +1 -1
  8. data/lib/bridgetown-core/commands/concerns/actions.rb +2 -4
  9. data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +7 -8
  10. data/lib/bridgetown-core/commands/console.rb +20 -1
  11. data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +5 -0
  12. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +8 -7
  13. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
  14. data/lib/bridgetown-core/commands/plugins.rb +46 -32
  15. data/lib/bridgetown-core/commands/serve.rb +1 -2
  16. data/lib/bridgetown-core/commands/start.rb +0 -8
  17. data/lib/bridgetown-core/component.rb +50 -0
  18. data/lib/bridgetown-core/concerns/site/configurable.rb +22 -18
  19. data/lib/bridgetown-core/concerns/site/localizable.rb +2 -6
  20. data/lib/bridgetown-core/concerns/site/processable.rb +0 -1
  21. data/lib/bridgetown-core/concerns/site/ssr.rb +0 -1
  22. data/lib/bridgetown-core/concerns/transformable.rb +5 -2
  23. data/lib/bridgetown-core/configuration/configuration_dsl.rb +146 -0
  24. data/lib/bridgetown-core/configuration.rb +90 -15
  25. data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +3 -1
  26. data/lib/bridgetown-core/configurations/lit/esbuild-plugins.js +5 -2
  27. data/lib/bridgetown-core/configurations/minitesting.rb +1 -1
  28. data/lib/bridgetown-core/converter.rb +8 -0
  29. data/lib/bridgetown-core/converters/identity.rb +2 -0
  30. data/lib/bridgetown-core/converters/liquid_templates.rb +1 -0
  31. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  32. data/lib/bridgetown-core/converters/markdown.rb +2 -0
  33. data/lib/bridgetown-core/current.rb +19 -5
  34. data/lib/bridgetown-core/deprecator.rb +4 -37
  35. data/lib/bridgetown-core/filters.rb +1 -3
  36. data/lib/bridgetown-core/generated_page.rb +5 -0
  37. data/lib/bridgetown-core/helpers.rb +119 -8
  38. data/lib/bridgetown-core/hooks.rb +1 -0
  39. data/lib/bridgetown-core/kramdown/parser/gfm.rb +1 -1
  40. data/lib/bridgetown-core/layout.rb +1 -1
  41. data/lib/bridgetown-core/model/base.rb +11 -12
  42. data/lib/bridgetown-core/model/builder_origin.rb +1 -1
  43. data/lib/bridgetown-core/model/origin.rb +5 -1
  44. data/lib/bridgetown-core/model/plugin_origin.rb +1 -1
  45. data/lib/bridgetown-core/model/repo_origin.rb +7 -7
  46. data/lib/bridgetown-core/plugin.rb +2 -6
  47. data/lib/bridgetown-core/plugin_manager.rb +120 -41
  48. data/lib/bridgetown-core/rack/boot.rb +3 -7
  49. data/lib/bridgetown-core/rack/logger.rb +1 -0
  50. data/lib/bridgetown-core/rack/roda.rb +39 -45
  51. data/lib/bridgetown-core/rack/routes.rb +2 -6
  52. data/lib/bridgetown-core/rack/static_indexes.rb +1 -2
  53. data/lib/bridgetown-core/reader.rb +39 -50
  54. data/lib/bridgetown-core/readers/layout_reader.rb +1 -1
  55. data/lib/bridgetown-core/resource/base.rb +17 -1
  56. data/lib/bridgetown-core/ruby_template_view.rb +12 -8
  57. data/lib/bridgetown-core/site.rb +10 -3
  58. data/lib/bridgetown-core/slot.rb +41 -0
  59. data/lib/bridgetown-core/tasks/bridgetown_tasks.rake +23 -9
  60. data/lib/bridgetown-core/utils/ansi.rb +1 -1
  61. data/lib/bridgetown-core/utils/aux.rb +7 -6
  62. data/lib/bridgetown-core/utils/initializers.rb +45 -0
  63. data/lib/bridgetown-core/utils/loaders_manager.rb +2 -2
  64. data/lib/bridgetown-core/utils/require_gems.rb +11 -35
  65. data/lib/bridgetown-core/utils/ruby_front_matter.rb +2 -3
  66. data/lib/bridgetown-core/{converters/smartypants.rb → utils/smarty_pants_converter.rb} +5 -24
  67. data/lib/bridgetown-core/utils.rb +1 -0
  68. data/lib/bridgetown-core/version.rb +2 -2
  69. data/lib/bridgetown-core/watcher.rb +1 -8
  70. data/lib/bridgetown-core.rb +89 -6
  71. data/lib/roda/plugins/bridgetown_boot.rb +25 -0
  72. data/lib/roda/plugins/bridgetown_ssr.rb +23 -0
  73. data/lib/roda/plugins/initializers.rb +17 -0
  74. data/lib/site_template/.gitignore +1 -0
  75. data/lib/site_template/Gemfile.erb +1 -1
  76. data/lib/site_template/TEMPLATES/erb/_layouts/default.erb +2 -2
  77. data/lib/site_template/TEMPLATES/erb/_layouts/page.erb +1 -1
  78. data/lib/site_template/TEMPLATES/erb/_layouts/post.erb +1 -1
  79. data/lib/site_template/TEMPLATES/liquid/_layouts/default.liquid +2 -2
  80. data/lib/site_template/TEMPLATES/liquid/_layouts/page.liquid +1 -1
  81. data/lib/site_template/TEMPLATES/liquid/_layouts/post.liquid +1 -1
  82. data/lib/site_template/TEMPLATES/serbea/_layouts/default.serb +2 -2
  83. data/lib/site_template/TEMPLATES/serbea/_layouts/page.serb +1 -1
  84. data/lib/site_template/TEMPLATES/serbea/_layouts/post.serb +1 -1
  85. data/lib/site_template/config/initializers.rb +43 -0
  86. data/lib/site_template/package.json.erb +1 -1
  87. data/lib/site_template/server/roda_app.rb +2 -8
  88. metadata +17 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1a8e2712c8b2f218d0082a2d890bb53401efb354a055c323189bbefd1d9f9a6
4
- data.tar.gz: 99d3049dabe2ba5e3e812240268fb754c842b1bbcf0acbe46345fbc1ada7194f
3
+ metadata.gz: 151aa943c75bc92219b009a1024ba80346428dd86b2a55aa606d14e1fbe67fca
4
+ data.tar.gz: 922024f32b5785568c424894875694b5b0d2b3c417397ea2199227fdeccdfc46
5
5
  SHA512:
6
- metadata.gz: d820196117aad565c3dd7150c535ccd98b08b1d4cdad4b439855ea4a2666ce58f67abe67a0b68dc40959fd3e9d7eac299bf9261a43f4ef119294549bd7a95595
7
- data.tar.gz: 40a94f0d056e35ea8f1f34d2e0f5684ed0990ee2a2804aac4d91766d2d8ead3528dbdbbf555f14035878a1287a58cf60a70e9ffc7a60a41bcf6c1cfcf9b2bf31
6
+ metadata.gz: 794136c89b55a6c4bca1a0c9c00b1e26570782d9c4d8ee24e5f0543f318ecbdfb645a257b635d8cf4e42cb2bed644c7507ddfc21a8820ff730c4da34fb1d9a3d
7
+ data.tar.gz: 4fa68e3690b005053452c75a55f044dca2310f83364c94eef1c22e3adc5b13e010ced5cbeb4008de5211079cc4ed2244079fcb341aadc3989bbe67c3f486221a
data/bin/bridgetown CHANGED
@@ -13,8 +13,6 @@ require "active_support/core_ext/string/indent"
13
13
 
14
14
  require "bridgetown"
15
15
 
16
- Bridgetown::PluginManager.require_from_bundler
17
-
18
16
  # Support NO_COLOR: https://no-color.org
19
17
  # TODO: need to change behavior of Colorator gem
20
18
  ENV["THOR_SHELL"] = "Basic" if ENV["NO_COLOR"]
@@ -31,7 +29,7 @@ elsif env_flag = ARGV.find { |arg| arg.start_with?("--environment=") } # rubocop
31
29
  ENV["BRIDGETOWN_ENV"] = env_flag.split("=").last
32
30
  end
33
31
 
34
- ENV["RACK_ENV"] = ENV["BRIDGETOWN_ENV"]
32
+ Bridgetown.begin!
35
33
 
36
34
  require "bridgetown-core/commands/base"
37
35
  begin
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
9
9
  s.author = "Bridgetown Team"
10
10
  s.email = "maintainers@bridgetownrb.com"
11
11
  s.homepage = "https://www.bridgetownrb.com"
12
- s.summary = "A Webpack-aware, Ruby-based static site generator for the modern Jamstack era"
13
- s.description = "Bridgetown is a Webpack-aware, Ruby-powered static site generator for the modern Jamstack era"
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"
14
14
 
15
15
  s.files = `git ls-files -z`.split("\x0").reject do |f|
16
16
  f.match(%r!^(benchmark|features|script|test)/!)
@@ -20,10 +20,11 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.metadata = {
23
- "source_code_uri" => "https://github.com/bridgetownrb/bridgetown",
24
- "bug_tracker_uri" => "https://github.com/bridgetownrb/bridgetown/issues",
25
- "changelog_uri" => "https://github.com/bridgetownrb/bridgetown/releases",
26
- "homepage_uri" => s.homepage,
23
+ "source_code_uri" => "https://github.com/bridgetownrb/bridgetown",
24
+ "bug_tracker_uri" => "https://github.com/bridgetownrb/bridgetown/issues",
25
+ "changelog_uri" => "https://github.com/bridgetownrb/bridgetown/releases",
26
+ "homepage_uri" => s.homepage,
27
+ "rubygems_mfa_required" => "true",
27
28
  }
28
29
 
29
30
  s.rdoc_options = ["--charset=UTF-8"]
@@ -270,10 +270,13 @@ module Bridgetown
270
270
 
271
271
  # Read in resource from repo path
272
272
  # @param full_path [String]
273
+ # @param manifest [Bridgetown::Configuration::SourceManifest]
273
274
  def read_resource(full_path, manifest: nil)
274
275
  model_relative_path = relative_model_path_for(full_path, manifest: manifest)
275
- model = Bridgetown::Model::Base.find(model_id_from_relative_path(model_relative_path,
276
- manifest: manifest))
276
+ model = Bridgetown::Model::Base.find(
277
+ model_id_from_relative_path(model_relative_path, manifest: manifest),
278
+ site: site
279
+ )
277
280
 
278
281
  if model_is_multi_locale?(model, model_relative_path)
279
282
  site.config.available_locales.each do |locale|
@@ -87,7 +87,7 @@ module Bridgetown
87
87
  klass.start(["-h"])
88
88
  else
89
89
  puts "Bridgetown v#{Bridgetown::VERSION.magenta} \"#{Bridgetown::CODE_NAME.yellow}\"" \
90
- " is a Webpack-aware, Ruby-powered static site generator for the modern Jamstack era"
90
+ " is a next-generation, progressive site generator & fullstack framework, powered by Ruby"
91
91
  puts ""
92
92
  puts "Usage:"
93
93
  puts " bridgetown <command> [options]"
@@ -32,16 +32,29 @@ module Bridgetown
32
32
  Bridgetown.logger.adjust_verbosity(options)
33
33
 
34
34
  unless caller_locations.find do |loc|
35
- loc.to_s.include?("bridgetown-core/commands/start.rb")
36
- end
35
+ loc.to_s.include?("bridgetown-core/commands/start.rb")
36
+ end
37
37
  self.class.print_startup_message
38
38
  end
39
39
 
40
- config_options = (
41
- Bridgetown::Current.preloaded_configuration || configuration_with_overrides(options)
42
- ).merge(options)
40
+ # @type [Bridgetown::Configuration]
41
+ config_options = configuration_with_overrides(
42
+ options, Bridgetown::Current.preloaded_configuration
43
+ )
44
+
45
+ config_options.run_initializers! context: :static
43
46
 
44
47
  config_options["serving"] = false unless config_options["serving"]
48
+
49
+ if !Bridgetown.env.production? &&
50
+ !config_options[:skip_frontend] && config_options["using_puma"]
51
+ require "rake"
52
+ Rake.with_application do |rake|
53
+ rake.load_rakefile
54
+ rake["frontend:watcher"].invoke(true)
55
+ end
56
+ end
57
+
45
58
  @site = Bridgetown::Site.new(config_options)
46
59
 
47
60
  if config_options.fetch("skip_initial_build", false)
@@ -17,7 +17,7 @@ module Bridgetown
17
17
  summary "Clean the site (removes site output and metadata file) without building"
18
18
 
19
19
  def clean
20
- config = configuration_with_overrides(options)
20
+ config = configuration_with_overrides(options, Bridgetown::Current.preloaded_configuration)
21
21
  destination = config["destination"]
22
22
  metadata_file = File.join(config["root_dir"], ".bridgetown-metadata")
23
23
  cache_dir = File.join(config["root_dir"], config["cache_dir"])
@@ -64,10 +64,8 @@ module Bridgetown
64
64
  say_status :add_yarn, gemname
65
65
 
66
66
  Bundler.reset!
67
- available_gems = Bundler.setup Bridgetown::PluginManager::PLUGINS_GROUP
68
- Bridgetown::PluginManager.install_yarn_dependencies(
69
- available_gems.requested_specs, gemname
70
- )
67
+ Bridgetown::PluginManager.load_determined_bundler_environment
68
+ Bridgetown::PluginManager.install_yarn_dependencies(name: gemname)
71
69
  rescue SystemExit
72
70
  say_status :add_yarn, "Package not added due to yarn error", :red
73
71
  end
@@ -12,15 +12,14 @@ module Bridgetown
12
12
 
13
13
  # Create a full Bridgetown configuration with the options passed in as overrides
14
14
  #
15
- # options - the configuration overrides
16
- #
17
- # Returns a full Bridgetown configuration
18
- def configuration_with_overrides(options)
19
- return options if options.is_a?(Bridgetown::Configuration)
15
+ # @param options [Hash] the configuration overrides
16
+ # @param preloaded [Bridgetown::Configuration, Bridgetown::Configuration::Preflight]
17
+ # a preloaded config or preflight
18
+ # @return [Bridgetown::Configuration] a full Bridgetown configuration
19
+ def configuration_with_overrides(options, preloaded = nil)
20
+ return preloaded.merge!(options) if preloaded.is_a?(Bridgetown::Configuration)
20
21
 
21
- Bridgetown.configuration(options).tap do |new_config|
22
- Bridgetown::Current.preloaded_configuration = new_config
23
- end
22
+ Bridgetown.configuration(options)
24
23
  end
25
24
  end
26
25
  end
@@ -58,17 +58,36 @@ module Bridgetown
58
58
  class_option :blank,
59
59
  type: :boolean,
60
60
  desc: "Skip reading content and running generators before opening console"
61
+ class_option :"server-config",
62
+ aliases: "-s",
63
+ type: :boolean,
64
+ desc: "Load server configurations"
65
+ class_option :verbose,
66
+ aliases: "-V",
67
+ type: :boolean,
68
+ desc: "Print verbose output."
61
69
 
62
70
  def console
63
71
  require "irb"
64
72
  require "irb/ext/save-history"
65
73
  require "amazing_print" unless options[:"bypass-ap"]
66
74
 
75
+ Bridgetown.logger.adjust_verbosity(options)
76
+
67
77
  Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION.magenta} " \
68
78
  "(codename \"#{Bridgetown::CODE_NAME.yellow}\") " \
69
79
  "console…"
70
80
  Bridgetown.logger.info "Environment:", Bridgetown.environment.cyan
71
- site = Bridgetown::Site.new(configuration_with_overrides(options))
81
+
82
+ config_options = configuration_with_overrides(options)
83
+ if options[:"server-config"]
84
+ require "puma"
85
+ require "bridgetown-core/rack/boot"
86
+ Bridgetown::Rack.boot
87
+ else
88
+ config_options.run_initializers! context: :console
89
+ end
90
+ site = Bridgetown::Site.new(config_options)
72
91
 
73
92
  ConsoleMethods.site_reset(site) unless options[:blank]
74
93
 
@@ -26,6 +26,11 @@ const outputFolder = "output"
26
26
  // ```
27
27
  // const esbuildOptions = { publicPath: "/my_subfolder/_bridgetown/static" }
28
28
  // ```
29
+
30
+ /**
31
+ * @typedef { import("esbuild").BuildOptions } BuildOptions
32
+ * @type {BuildOptions}
33
+ */
29
34
  const esbuildOptions = {}
30
35
 
31
36
  build(outputFolder, esbuildOptions)
@@ -84,7 +84,7 @@ const importGlobPlugin = () => ({
84
84
  })
85
85
 
86
86
  // Plugin for PostCSS
87
- const postCssPlugin = (options, configuration) => ({
87
+ const importPostCssPlugin = (options, configuration) => ({
88
88
  name: "postcss",
89
89
  async setup(build) {
90
90
  // Process .css files with PostCSS
@@ -98,7 +98,7 @@ const postCssPlugin = (options, configuration) => ({
98
98
  load: async filename => {
99
99
  let contents = await readCache(filename, "utf-8")
100
100
  const filedir = path.dirname(filename)
101
- // We'll want to track any imports later when in watch mode:
101
+ // We'll want to track any imports later when in watch mode:
102
102
  additionalFilePaths.push(filename)
103
103
 
104
104
  // We need to transform `url(...)` in imported CSS so the filepaths are properly
@@ -231,9 +231,10 @@ const bridgetownPreset = (outputFolder) => ({
231
231
  // We have an entrypoint!
232
232
  manifest[stripPrefix(value.entryPoint)] = outputPath
233
233
  entrypoints.push([outputPath, fileSize(key)])
234
- } else if (key.match(/index(\.js)?\.[^-.]*\.css/) && inputs.find(item => item.match(/\.(s?css|sass)$/))) {
234
+ } else if (key.match(/index(\.js)?\.[^-.]*\.css/) && inputs.find(item => item.match(/frontend.*\.(s?css|sass)$/))) {
235
235
  // Special treatment for index.css
236
- manifest[stripPrefix(inputs.find(item => item.match(/\.(s?css|sass)$/)))] = outputPath
236
+ const input = inputs.find(item => item.match(/frontend.*\.(s?css|sass)$/))
237
+ manifest[stripPrefix(input)] = outputPath
237
238
  entrypoints.push([outputPath, fileSize(key)])
238
239
  } else if (inputs.length > 0) {
239
240
  // Naive implementation, we'll just grab the first input and hope it's accurate
@@ -257,12 +258,12 @@ const bridgetownPreset = (outputFolder) => ({
257
258
 
258
259
  // Load the PostCSS config from postcss.config.js or whatever else is a supported location/format
259
260
  const postcssrc = require("postcss-load-config")
260
- const postCssConfig = postcssrc.sync()
261
261
 
262
- module.exports = (outputFolder, esbuildOptions) => {
262
+ module.exports = async (outputFolder, esbuildOptions) => {
263
263
  esbuildOptions.plugins = esbuildOptions.plugins || []
264
264
  // Add the PostCSS & glob plugins to the top of the plugin stack
265
- esbuildOptions.plugins.unshift(postCssPlugin(postCssConfig, esbuildOptions.postCssPluginConfig || {}))
265
+ const postCssConfig = await postcssrc()
266
+ esbuildOptions.plugins.unshift(importPostCssPlugin(postCssConfig, esbuildOptions.postCssPluginConfig || {}))
266
267
  if (esbuildOptions.postCssPluginConfig) delete esbuildOptions.postCssPluginConfig
267
268
  esbuildOptions.plugins.unshift(importGlobPlugin())
268
269
  // Add the Sass plugin
@@ -11,7 +11,7 @@ default_postcss_config = File.expand_path("../../../site_template/postcss.config
11
11
  template default_postcss_config, "postcss.config.js"
12
12
 
13
13
  unless Bridgetown.environment.test?
14
- required_packages = %w(esbuild glob postcss postcss-flexbugs-fixes postcss-preset-env postcss-import postcss-load-config@3.1.4)
14
+ required_packages = %w(esbuild glob postcss postcss-flexbugs-fixes postcss-preset-env postcss-import postcss-load-config@4.0.1)
15
15
  redundant_packages = %w(esbuild-loader webpack webpack-cli webpack-manifest-plugin webpack-merge css-loader file-loader mini-css-extract-plugin postcss-loader)
16
16
 
17
17
  say "Installing required packages"
@@ -17,27 +17,48 @@ module Bridgetown
17
17
  type: :boolean,
18
18
  desc: "Print the source path of each plugin"
19
19
  def list
20
- site = Bridgetown::Site.new(configuration_with_overrides(options))
20
+ config_options = configuration_with_overrides(options)
21
+ config_options.run_initializers! context: :static
22
+ site = Bridgetown::Site.new(config_options)
21
23
  site.reset
22
24
  Bridgetown::Hooks.trigger :site, :pre_read, site
23
25
 
26
+ plugins_list = config_options.initializers.values.sort_by(&:name)
27
+
24
28
  pm = site.plugin_manager
25
29
 
26
- plugins_list = pm.class.registered_plugins.reject do |plugin|
30
+ plugins_list += pm.class.registered_plugins.reject do |plugin|
27
31
  plugin.to_s.end_with? "site_builder.rb"
28
32
  end
29
33
 
30
34
  Bridgetown.logger.info("Registered Plugins:", plugins_list.length.to_s.yellow.bold)
31
35
 
32
36
  plugins_list.each do |plugin|
33
- unless plugin.to_s.end_with? "site_builder.rb"
34
- Bridgetown.logger.info("", plugin.to_s.sub(site.in_root_dir("/"), ""))
37
+ plugin_desc = plugin.to_s
38
+ next if plugin_desc.ends_with?("site_builder.rb") || plugin_desc == "init (Initializer)"
39
+
40
+ if plugin.is_a?(Bridgetown::Configuration::Initializer)
41
+ Bridgetown.logger.info("", plugin_desc)
42
+ Bridgetown.logger.debug(
43
+ "", "PATH: " + plugin.block.source_location[0]
44
+ )
45
+ elsif plugin.is_a?(Bundler::StubSpecification) || plugin.is_a?(Gem::Specification)
46
+ Bridgetown.logger.info("", "#{plugin.name} (Rubygem)")
47
+ Bridgetown.logger.debug(
48
+ "", "PATH: " + plugin.full_gem_path
49
+ )
50
+ else
51
+ Bridgetown.logger.info("", plugin_desc.sub(site.in_root_dir("/"), ""))
35
52
  end
53
+
54
+ Bridgetown.logger.debug("")
36
55
  end
37
56
 
38
- Bridgetown.logger.info("Source Manifests:", "----") unless pm.class.source_manifests.empty?
57
+ unless site.config.source_manifests.empty?
58
+ Bridgetown.logger.info("Source Manifests:", "----")
59
+ end
39
60
 
40
- pm.class.source_manifests.each do |manifest|
61
+ site.config.source_manifests.each do |manifest|
41
62
  Bridgetown.logger.info("Origin:", (manifest.origin || "n/a").to_s.green)
42
63
  Bridgetown.logger.info("Components:", (manifest.components || "n/a").to_s.cyan)
43
64
  Bridgetown.logger.info("Content:", (manifest.content || "n/a").to_s.cyan)
@@ -56,12 +77,10 @@ module Bridgetown
56
77
  last_name = name_components.pop
57
78
  name_components.push last_name.magenta
58
79
  Bridgetown.logger.info("", name_components.join("::"))
59
- next unless options[:verbose]
60
-
61
- Bridgetown.logger.info(
80
+ Bridgetown.logger.debug(
62
81
  "", "PATH: " + builder_path_for(builder)
63
82
  )
64
- Bridgetown.logger.info("")
83
+ Bridgetown.logger.debug("")
65
84
  end
66
85
  Bridgetown.logger.info("", "----")
67
86
  end
@@ -74,12 +93,10 @@ module Bridgetown
74
93
  last_name = name_components.pop
75
94
  name_components.push last_name.magenta
76
95
  Bridgetown.logger.info("", name_components.join("::"))
77
- next unless options[:verbose]
78
-
79
- Bridgetown.logger.info(
96
+ Bridgetown.logger.debug(
80
97
  "", "PATH: " + converter_path_for(converter)
81
98
  )
82
- Bridgetown.logger.info("")
99
+ Bridgetown.logger.debug("")
83
100
  end
84
101
 
85
102
  Bridgetown.logger.info("", "----")
@@ -92,12 +109,10 @@ module Bridgetown
92
109
  last_name = name_components.pop
93
110
  name_components.push last_name.magenta
94
111
  Bridgetown.logger.info("", name_components.join("::"))
95
- next unless options[:verbose]
96
-
97
- Bridgetown.logger.info(
112
+ Bridgetown.logger.debug(
98
113
  "", "PATH: " + generator_path_for(generator)
99
114
  )
100
- Bridgetown.logger.info("")
115
+ Bridgetown.logger.debug("")
101
116
  end
102
117
  end
103
118
 
@@ -122,9 +137,8 @@ module Bridgetown
122
137
  # Now all the plugin's layouts will be in the site repo directly.
123
138
  #
124
139
  def cd(arg)
125
- site = Bridgetown::Site.new(configuration_with_overrides(options))
126
-
127
- pm = site.plugin_manager
140
+ config_options = configuration_with_overrides(options)
141
+ config_options.run_initializers! context: :static
128
142
 
129
143
  directive = arg.split("/")
130
144
  unless directive[1]
@@ -132,7 +146,7 @@ module Bridgetown
132
146
  return
133
147
  end
134
148
 
135
- manifest = pm.class.source_manifests.find do |source_manifest|
149
+ manifest = config_options.source_manifests.find do |source_manifest|
136
150
  source_manifest.origin.to_s == directive[0]
137
151
  end
138
152
 
@@ -146,7 +160,7 @@ module Bridgetown
146
160
 
147
161
  # rubocop: disable Style/RedundantCondition
148
162
  Dir.chdir dir do
149
- ENV["BRIDGETOWN_SITE"] = site.root_dir
163
+ ENV["BRIDGETOWN_SITE"] = config_options.root_dir
150
164
  if ENV["SHELL"]
151
165
  system(ENV["SHELL"])
152
166
  else
@@ -163,14 +177,12 @@ module Bridgetown
163
177
  end
164
178
  end
165
179
 
166
- desc "new NAME", "Create a new plugin NAME (please-use-dashes) by" \
167
- " cloning the sample plugin repo"
168
- def new(plugin_name)
169
- folder_name = plugin_name.underscore
170
- name = folder_name.dasherize
180
+ desc "new NAME", "Create a new plugin NAME by cloning the sample plugin repo"
181
+ def new(name)
182
+ folder_name = name.underscore
171
183
  module_name = folder_name.camelize
172
184
 
173
- run "git clone https://github.com/bridgetownrb/bridgetown-sample-plugin #{name}"
185
+ run "git clone -b v1.2-initializer https://github.com/bridgetownrb/bridgetown-sample-plugin #{name}"
174
186
  new_gemspec = "#{name}.gemspec"
175
187
 
176
188
  inside name do # rubocop:todo Metrics/BlockLength
@@ -186,11 +198,11 @@ module Bridgetown
186
198
  gsub_file "package.json", "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
187
199
  gsub_file "package.json", "bridgetown-sample-plugin", name
188
200
 
189
- FileUtils.mv "lib/sample-plugin.rb", "lib/#{name}.rb"
190
- gsub_file "lib/#{name}.rb", "sample-plugin", name
201
+ FileUtils.mv "lib/sample_plugin.rb", "lib/#{folder_name}.rb"
202
+ gsub_file "lib/#{name}.rb", "sample_plugin", folder_name
191
203
  gsub_file "lib/#{name}.rb", "SamplePlugin", module_name
192
204
 
193
- FileUtils.mv "lib/sample-plugin", "lib/#{name}"
205
+ FileUtils.mv "lib/sample_plugin", "lib/#{folder_name}"
194
206
  gsub_file "lib/#{name}/builder.rb", "SamplePlugin", module_name
195
207
  gsub_file "lib/#{name}/version.rb", "SamplePlugin", module_name
196
208
 
@@ -206,6 +218,8 @@ module Bridgetown
206
218
  gsub_file "content/#{folder_name}/example_page.md", "sample_plugin", folder_name
207
219
  gsub_file "components/#{folder_name}/layout_help.liquid", "sample_plugin", folder_name
208
220
 
221
+ gsub_file "components/#{folder_name}/plugin_component.rb", "SamplePlugin", module_name
222
+
209
223
  gsub_file "frontend/javascript/index.js", "bridgetown-sample-plugin", name
210
224
  gsub_file "frontend/javascript/index.js", "SamplePlugin", module_name
211
225
  end
@@ -62,8 +62,7 @@ module Bridgetown
62
62
  options["serving"] = true
63
63
  options["watch"] = true unless no_watch
64
64
 
65
- config = Bridgetown::Current.preloaded_configuration ||
66
- configuration_with_overrides(options)
65
+ config = configuration_with_overrides(options, Bridgetown::Current.preloaded_configuration)
67
66
  if Bridgetown.environment == "development"
68
67
  default_url(config).tap do |url|
69
68
  options["url"] = url
@@ -77,14 +77,6 @@ module Bridgetown
77
77
  end
78
78
 
79
79
  begin
80
- unless Bridgetown.env.production? || options[:skip_frontend]
81
- require "rake"
82
- Rake.with_application do |rake|
83
- rake.load_rakefile
84
- rake["frontend:watcher"].invoke(true)
85
- end
86
- end
87
-
88
80
  Signal.trap("TERM") do
89
81
  Process.kill "SIGINT", puma_pid
90
82
  sleep 0.5 # let it breathe
@@ -104,6 +104,56 @@ module Bridgetown
104
104
  @_content ||= (view_context.capture(self, &@_content_block) if @_content_block)
105
105
  end
106
106
 
107
+ # @return [Array<Bridgetown::Slot>]
108
+ def slots
109
+ @slots ||= []
110
+ end
111
+
112
+ # Define a new component slot
113
+ #
114
+ # @param name [String, Symbol] name of the slot
115
+ # @param input [String] content if not supplying a block
116
+ # @param replace [Boolean] set to true to replace any previously defined slot with same name
117
+ # @return [void]
118
+ def slot(name, input = nil, replace: false, &block)
119
+ content = block.nil? ? input.to_s : view_context.capture(&block)
120
+
121
+ name = name.to_s
122
+ slots.reject! { _1.name == name } if replace
123
+
124
+ slots << Slot.new(name: name, content: content, context: self, transform: false)
125
+
126
+ nil
127
+ end
128
+
129
+ # Render out a component slot
130
+ #
131
+ # @param name [String, Symbol] name of the slot
132
+ # @param input [String] default content if slot isn't defined and no block provided
133
+ # @return [String]
134
+ def slotted(name, default_input = nil, &default_block)
135
+ content # ensure content block is processed
136
+
137
+ name = name.to_s
138
+ filtered_slots = slots.select do |slot|
139
+ slot.name == name
140
+ end
141
+
142
+ return filtered_slots.map(&:content).join.html_safe if filtered_slots.length.positive?
143
+
144
+ default_block.nil? ? default_input.to_s : capture(&default_block)
145
+ end
146
+
147
+ # Check if a component slot has been defined
148
+ #
149
+ # @return [Boolean]
150
+ def slotted?(name)
151
+ name = name.to_s
152
+ slots.any? do |slot|
153
+ slot.name == name
154
+ end
155
+ end
156
+
107
157
  # Provide a render helper for evaluation within the component context.
108
158
  #
109
159
  # @param item [Object] a component supporting `render_in` or a partial name
@@ -2,34 +2,37 @@
2
2
 
3
3
  class Bridgetown::Site
4
4
  module Configurable
5
- # Set the site's configuration. This handles side-effects caused by
6
- # changing values in the configuration.
5
+ # Set the site's configuration object
7
6
  #
8
7
  # @param config [Configuration]
9
- # An instance of {Configuration},
10
- # containing the new configuration.
11
- #
12
- # @return [Configuration]
13
- # The processed instance of {Configuration}
14
8
  def config=(config)
15
- @config = config.clone
16
-
17
- # Source and destination may not be changed after the site has been created.
18
- @root_dir = File.expand_path(config["root_dir"]).freeze
19
- @source = File.expand_path(config["source"]).freeze
20
- @dest = File.expand_path(config["destination"]).freeze
9
+ @config = config
21
10
 
22
11
  configure_cache
23
12
  configure_component_paths
24
13
  configure_file_read_opts
25
14
 
26
15
  self.permalink_style = (config["permalink"] || "pretty").to_sym
16
+ end
17
+
18
+ def root_dir
19
+ config["root_dir"]
20
+ end
21
+
22
+ def source
23
+ config["source"]
24
+ end
27
25
 
28
- @config
26
+ def destination
27
+ config["destination"]
29
28
  end
29
+ alias_method :dest, :destination
30
30
 
31
31
  def uses_resource?
32
- config[:content_engine] == "resource"
32
+ Bridgetown::Deprecator.deprecation_message(
33
+ "The Site#uses_resource? method will be removed in the next version"
34
+ )
35
+ true
33
36
  end
34
37
 
35
38
  # Returns a base path from which the site is served (aka `/cool-site`) or
@@ -98,11 +101,12 @@ class Bridgetown::Site
98
101
  # {Bridgetown.sanitized_path} method.
99
102
  #
100
103
  # @return [Array<String>] Return an array of updated paths if multiple paths given.
101
- def in_dest_dir(*paths)
102
- paths.reduce(dest) do |base, path|
104
+ def in_destination_dir(*paths)
105
+ paths.reduce(destination) do |base, path|
103
106
  Bridgetown.sanitized_path(base, path)
104
107
  end
105
108
  end
109
+ alias_method :in_dest_dir, :in_destination_dir
106
110
 
107
111
  # Prefix a path or paths with the {#cache_dir} directory.
108
112
  #
@@ -155,7 +159,7 @@ class Bridgetown::Site
155
159
 
156
160
  def configure_component_paths # rubocop:todo Metrics/AbcSize
157
161
  # Loop through plugins paths first
158
- plugin_components_load_paths = Bridgetown::PluginManager.source_manifests
162
+ plugin_components_load_paths = config.source_manifests
159
163
  .filter_map(&:components)
160
164
 
161
165
  local_components_load_paths = config["components_dir"].then do |dir|
@@ -7,14 +7,10 @@ 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")}/*.{json,rb,yml}"].each do |locale_path|
11
- I18n.load_path << locale_path
12
- end
10
+ I18n.load_path += Dir["#{in_source_dir("_locales")}/**/*.{json,rb,yml}"]
13
11
  I18n.available_locales = config[:available_locales]
14
12
  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
13
+ I18n.fallbacks = [locale, :en].uniq
18
14
  locale
19
15
  end
20
16
  end
@@ -11,7 +11,6 @@ class Bridgetown::Site
11
11
  # @see #cleanup
12
12
  # @see #write
13
13
  def process
14
- Bridgetown::Current.site = self
15
14
  reset
16
15
  read
17
16
  generate # Extensible
@@ -14,7 +14,6 @@ class Bridgetown::Site
14
14
  "Check your Rack app for threading issues"
15
15
  end
16
16
 
17
- Bridgetown::PluginManager.require_from_bundler
18
17
  site = new(Bridgetown::Current.preloaded_configuration, loaders_manager: loaders_manager)
19
18
  site.enable_ssr
20
19
  site.ssr_setup(&block)