bridgetown-core 1.3.3 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bridgetown +0 -6
  3. data/bin/bt +6 -0
  4. data/bridgetown-core.gemspec +10 -7
  5. data/lib/bridgetown-core/cleaner.rb +1 -1
  6. data/lib/bridgetown-core/collection.rb +30 -18
  7. data/lib/bridgetown-core/commands/build.rb +9 -22
  8. data/lib/bridgetown-core/commands/concerns/actions.rb +15 -8
  9. data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +1 -1
  10. data/lib/bridgetown-core/commands/console.rb +3 -0
  11. data/lib/bridgetown-core/commands/doctor.rb +2 -4
  12. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +5 -1
  13. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
  14. data/lib/bridgetown-core/commands/esbuild/update.rb +2 -2
  15. data/lib/bridgetown-core/commands/esbuild.rb +3 -3
  16. data/lib/bridgetown-core/commands/new.rb +32 -39
  17. data/lib/bridgetown-core/commands/start.rb +76 -60
  18. data/lib/bridgetown-core/component.rb +19 -13
  19. data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
  20. data/lib/bridgetown-core/concerns/prioritizable.rb +11 -1
  21. data/lib/bridgetown-core/concerns/site/configurable.rb +7 -18
  22. data/lib/bridgetown-core/concerns/site/content.rb +10 -9
  23. data/lib/bridgetown-core/concerns/site/extensible.rb +4 -6
  24. data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +161 -0
  25. data/lib/bridgetown-core/concerns/site/processable.rb +1 -0
  26. data/lib/bridgetown-core/concerns/site/renderable.rb +31 -7
  27. data/lib/bridgetown-core/concerns/site/ssr.rb +23 -9
  28. data/lib/bridgetown-core/concerns/site/writable.rb +1 -1
  29. data/lib/bridgetown-core/concerns/transformable.rb +3 -5
  30. data/lib/bridgetown-core/configuration/configuration_dsl.rb +23 -14
  31. data/lib/bridgetown-core/configuration.rb +67 -114
  32. data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -2
  33. data/lib/bridgetown-core/configurations/cypress/cypress_tasks +2 -2
  34. data/lib/bridgetown-core/configurations/cypress.rb +1 -1
  35. data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +3 -3
  36. data/lib/bridgetown-core/configurations/is-land.rb +1 -1
  37. data/lib/bridgetown-core/configurations/lit.rb +1 -1
  38. data/lib/bridgetown-core/configurations/open-props.rb +1 -1
  39. data/lib/bridgetown-core/configurations/purgecss.rb +1 -1
  40. data/lib/bridgetown-core/configurations/ruby2js.rb +1 -1
  41. data/lib/bridgetown-core/configurations/shoelace.rb +8 -20
  42. data/lib/bridgetown-core/configurations/stimulus.rb +17 -36
  43. data/lib/bridgetown-core/configurations/turbo.rb +1 -2
  44. data/lib/bridgetown-core/converter.rb +38 -10
  45. data/lib/bridgetown-core/converters/erb_templates.rb +9 -26
  46. data/lib/bridgetown-core/converters/identity.rb +1 -1
  47. data/lib/bridgetown-core/converters/liquid_templates.rb +2 -20
  48. data/lib/bridgetown-core/converters/ruby_templates.rb +61 -3
  49. data/lib/bridgetown-core/converters/serbea_templates.rb +12 -24
  50. data/lib/bridgetown-core/current.rb +19 -17
  51. data/lib/bridgetown-core/drops/collection_drop.rb +1 -1
  52. data/lib/bridgetown-core/drops/drop.rb +3 -3
  53. data/lib/bridgetown-core/drops/relations_drop.rb +3 -2
  54. data/lib/bridgetown-core/drops/site_drop.rb +0 -5
  55. data/lib/bridgetown-core/entry_filter.rb +4 -6
  56. data/lib/bridgetown-core/errors.rb +2 -2
  57. data/lib/bridgetown-core/filters/from_liquid.rb +6 -10
  58. data/lib/bridgetown-core/filters/localization_filters.rb +1 -1
  59. data/lib/bridgetown-core/filters/translation_filters.rb +2 -2
  60. data/lib/bridgetown-core/filters.rb +3 -3
  61. data/lib/bridgetown-core/front_matter/defaults.rb +225 -0
  62. data/lib/bridgetown-core/front_matter/importer.rb +34 -0
  63. data/lib/bridgetown-core/front_matter/loaders/base.rb +29 -0
  64. data/lib/bridgetown-core/front_matter/loaders/ruby.rb +113 -0
  65. data/lib/bridgetown-core/front_matter/loaders/yaml.rb +42 -0
  66. data/lib/bridgetown-core/front_matter/loaders.rb +44 -0
  67. data/lib/bridgetown-core/{utils/ruby_front_matter.rb → front_matter/ruby.rb} +5 -5
  68. data/lib/bridgetown-core/front_matter.rb +11 -0
  69. data/lib/bridgetown-core/generated_page.rb +71 -31
  70. data/lib/bridgetown-core/generators/prototype_generator.rb +30 -18
  71. data/lib/bridgetown-core/helpers.rb +36 -47
  72. data/lib/bridgetown-core/hooks.rb +5 -5
  73. data/lib/bridgetown-core/inflector.rb +40 -0
  74. data/lib/bridgetown-core/kramdown/parser/gfm.rb +2 -2
  75. data/lib/bridgetown-core/layout.rb +3 -3
  76. data/lib/bridgetown-core/log_adapter.rb +12 -13
  77. data/lib/bridgetown-core/log_writer.rb +4 -4
  78. data/lib/bridgetown-core/model/base.rb +17 -17
  79. data/lib/bridgetown-core/model/builder_origin.rb +5 -3
  80. data/lib/bridgetown-core/model/origin.rb +1 -3
  81. data/lib/bridgetown-core/model/repo_origin.rb +12 -14
  82. data/lib/bridgetown-core/plugin.rb +0 -1
  83. data/lib/bridgetown-core/plugin_manager.rb +27 -84
  84. data/lib/bridgetown-core/rack/boot.rb +0 -15
  85. data/lib/bridgetown-core/rack/routes.rb +30 -90
  86. data/lib/bridgetown-core/reader.rb +6 -4
  87. data/lib/bridgetown-core/readers/layout_reader.rb +2 -2
  88. data/lib/bridgetown-core/readers/plugin_content_reader.rb +2 -2
  89. data/lib/bridgetown-core/resource/base.rb +112 -29
  90. data/lib/bridgetown-core/resource/destination.rb +1 -1
  91. data/lib/bridgetown-core/resource/relations.rb +11 -8
  92. data/lib/bridgetown-core/resource/taxonomy_type.rb +3 -1
  93. data/lib/bridgetown-core/resource/transformer.rb +4 -4
  94. data/lib/bridgetown-core/ruby_template_view.rb +44 -28
  95. data/lib/bridgetown-core/signals.rb +95 -0
  96. data/lib/bridgetown-core/site.rb +22 -4
  97. data/lib/bridgetown-core/slot.rb +5 -5
  98. data/lib/bridgetown-core/static_file.rb +5 -7
  99. data/lib/bridgetown-core/tags/asset_path.rb +11 -2
  100. data/lib/bridgetown-core/tags/find.rb +3 -5
  101. data/lib/bridgetown-core/tags/highlight.rb +3 -3
  102. data/lib/bridgetown-core/tags/post_url.rb +1 -1
  103. data/lib/bridgetown-core/tasks/bridgetown_tasks.rake +2 -2
  104. data/lib/bridgetown-core/utils/aux.rb +41 -41
  105. data/lib/bridgetown-core/utils/loaders_manager.rb +2 -21
  106. data/lib/bridgetown-core/utils/ruby_exec.rb +17 -0
  107. data/lib/bridgetown-core/utils.rb +46 -110
  108. data/lib/bridgetown-core/version.rb +2 -2
  109. data/lib/bridgetown-core/watcher.rb +21 -10
  110. data/lib/bridgetown-core.rb +35 -49
  111. data/lib/roda/plugins/bridgetown_server.rb +54 -12
  112. data/lib/roda/plugins/bridgetown_ssr.rb +13 -2
  113. data/lib/roda/plugins/ssg.rb +72 -0
  114. data/lib/site_template/.gitignore +9 -3
  115. data/lib/site_template/Gemfile.erb +3 -3
  116. data/lib/site_template/README.md +3 -4
  117. data/lib/site_template/Rakefile.erb +2 -15
  118. data/lib/site_template/TEMPLATES/erb/_partials/_head.erb +2 -2
  119. data/lib/site_template/TEMPLATES/serbea/_partials/_head.serb +2 -2
  120. data/lib/site_template/config/initializers.rb +60 -22
  121. data/lib/site_template/config/puma.rb +2 -0
  122. data/lib/site_template/package.json.erb +2 -27
  123. data/lib/site_template/src/index.md.erb +3 -3
  124. data/lib/site_template/tmp/pids/.keep +0 -0
  125. metadata +106 -65
  126. data/lib/bridgetown-core/commands/webpack/enable-postcss.rb +0 -12
  127. data/lib/bridgetown-core/commands/webpack/setup.rb +0 -4
  128. data/lib/bridgetown-core/commands/webpack/update.rb +0 -24
  129. data/lib/bridgetown-core/commands/webpack/webpack.config.js +0 -31
  130. data/lib/bridgetown-core/commands/webpack/webpack.defaults.js.erb +0 -135
  131. data/lib/bridgetown-core/commands/webpack.rb +0 -82
  132. data/lib/bridgetown-core/concerns/front_matter_importer.rb +0 -52
  133. data/lib/bridgetown-core/concerns/liquid_renderable.rb +0 -30
  134. data/lib/bridgetown-core/core_ext/psych.rb +0 -15
  135. data/lib/bridgetown-core/drops/url_drop.rb +0 -152
  136. data/lib/bridgetown-core/frontmatter_defaults.rb +0 -223
  137. data/lib/bridgetown-core/rack/static_indexes.rb +0 -31
  138. data/lib/bridgetown-core/url.rb +0 -166
  139. data/lib/bridgetown-core/utils/ansi.rb +0 -57
  140. data/lib/site_template/bridgetown.config.yml +0 -33
@@ -1,20 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_model"
4
-
5
3
  module Bridgetown
6
4
  module Model
7
5
  class Base
8
- include ActiveModel::Model
9
- extend ActiveModel::Callbacks # also extends with DescendantsTracker
10
- define_model_callbacks :load, :save, :destroy
6
+ include Bridgetown::RodaCallable
11
7
 
12
8
  class << self
13
9
  def find(id, site: Bridgetown::Current.site)
14
10
  raise "A Bridgetown site must be initialized and added to Current" unless site
15
11
 
16
- origin = origin_for_id(id, site: site)
17
- klass_for_id(id, origin: origin).new(origin.read)
12
+ origin = origin_for_id(id, site:)
13
+ klass_for_id(id, origin:).new(origin.read)
18
14
  end
19
15
 
20
16
  def origin_for_id(id, site: Bridgetown::Current.site)
@@ -25,12 +21,12 @@ module Bridgetown
25
21
 
26
22
  raise "No origin could be found for #{id}" unless origin_klass
27
23
 
28
- origin_klass.new(id, site: site)
24
+ origin_klass.new(id, site:)
29
25
  end
30
26
 
31
27
  def klass_for_id(id, origin: nil)
32
28
  Bridgetown::Model::Base.descendants.find do |klass|
33
- klass.will_load_id?(id, origin: origin)
29
+ klass.will_load_id?(id, origin:)
34
30
  end || Bridgetown::Model::Base
35
31
  end
36
32
 
@@ -44,7 +40,7 @@ module Bridgetown
44
40
  site = builder.site
45
41
  data = Bridgetown::Model::BuilderOrigin.new(
46
42
  Bridgetown::Model::BuilderOrigin.id_for_builder_path(builder, path),
47
- site: site
43
+ site:
48
44
  ).read do
49
45
  data[:_collection_] = site.collections[collection_name]
50
46
  data
@@ -54,9 +50,7 @@ module Bridgetown
54
50
  end
55
51
 
56
52
  def initialize(attributes = {})
57
- run_callbacks :load do
58
- super
59
- end
53
+ self.attributes = attributes
60
54
  end
61
55
 
62
56
  def id
@@ -82,9 +76,7 @@ module Bridgetown
82
76
  raise "`#{origin.class}' doesn't allow writing of model objects"
83
77
  end
84
78
 
85
- run_callbacks :save do
86
- origin.write(self)
87
- end
79
+ origin.write(self)
88
80
  end
89
81
 
90
82
  # @return [Bridgetown::Resource::Base]
@@ -102,6 +94,11 @@ module Bridgetown
102
94
  to_resource.read!.transform!
103
95
  end
104
96
 
97
+ # Converts this model to a resource and returns the full output
98
+ #
99
+ # @return [String]
100
+ def call(*) = render_as_resource.output
101
+
105
102
  # override if need be
106
103
  # @return [Bridgetown::Site]
107
104
  def site
@@ -130,6 +127,10 @@ module Bridgetown
130
127
  @attributes ||= HashWithDotAccess::Hash.new
131
128
  end
132
129
 
130
+ def attributes=(new_attributes)
131
+ attributes.update new_attributes
132
+ end
133
+
133
134
  # Strip out keys like _origin_, _collection_, etc.
134
135
  # @return [HashWithDotAccess::Hash]
135
136
  def data_attributes
@@ -146,7 +147,6 @@ module Bridgetown
146
147
  key = method_name.to_s
147
148
  if key.end_with?("=")
148
149
  key.chop!
149
- # attribute_will_change!(key)
150
150
  attributes[key] = args.first
151
151
  return attributes[key]
152
152
  end
@@ -34,9 +34,11 @@ module Bridgetown
34
34
  @data
35
35
  end
36
36
 
37
- def exists?
38
- false
39
- end
37
+ def front_matter_line_count = @data[:_front_matter_line_count_]
38
+
39
+ def original_path = @data[:_original_path_] || relative_path
40
+
41
+ def exists? = false
40
42
 
41
43
  def read_data_from_builder
42
44
  builder = Kernel.const_get(url.host.gsub(".", "::"))
@@ -4,8 +4,6 @@ module Bridgetown
4
4
  module Model
5
5
  # Abstract Superclass
6
6
  class Origin
7
- extend ActiveSupport::DescendantsTracker
8
-
9
7
  EAGER_LOAD_DESCENDANTS = %i(BuilderOrigin RepoOrigin PluginOrigin).freeze
10
8
 
11
9
  # @return [String]
@@ -30,7 +28,7 @@ module Bridgetown
30
28
 
31
29
  return klass.collection_name.to_s == collection_name if klass.respond_to?(:collection_name)
32
30
 
33
- klass.name == ActiveSupport::Inflector.classify(collection_name)
31
+ klass.name == site.config.inflector.classify(collection_name)
34
32
  end
35
33
 
36
34
  def read
@@ -3,13 +3,8 @@
3
3
  module Bridgetown
4
4
  module Model
5
5
  class RepoOrigin < Origin
6
- include Bridgetown::FrontMatterImporter
7
- include Bridgetown::Utils::RubyFrontMatterDSL
8
-
9
- YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
10
- RUBY_FRONT_MATTER_HEADER = %r!\A[~`#-]{3,}(?:ruby|<%|{%)\s*\n!.freeze
11
- RUBY_FRONT_MATTER_REGEXP =
12
- %r!#{RUBY_FRONT_MATTER_HEADER.source}(.*?\n?)^((?:%>|%})?[~`#-]{3,}\s*$\n?)!m.freeze
6
+ using Bridgetown::Refinements
7
+ include Bridgetown::FrontMatter::Importer
13
8
 
14
9
  # @return [String]
15
10
  attr_accessor :content
@@ -35,7 +30,7 @@ module Bridgetown
35
30
  def new_with_collection_path(collection, relative_path, site: Bridgetown::Current.site)
36
31
  collection = collection.label if collection.is_a?(Bridgetown::Collection)
37
32
 
38
- new("repo://#{collection}.collection/#{relative_path}", site: site)
33
+ new("repo://#{collection}.collection/#{relative_path}", site:)
39
34
  end
40
35
  end
41
36
 
@@ -88,11 +83,9 @@ module Bridgetown
88
83
  def collection
89
84
  return @collection if @collection
90
85
 
91
- collection_name = if url.host.ends_with?(".collection")
92
- url.host.chomp(".collection")
93
- else
86
+ collection_name = url.host.ends_with?(".collection") ?
87
+ url.host.chomp(".collection") :
94
88
  "pages"
95
- end
96
89
  @collection = site.collections[collection_name]
97
90
  end
98
91
 
@@ -107,7 +100,7 @@ module Bridgetown
107
100
  private
108
101
 
109
102
  def in_data_collection?
110
- original_path.extname.downcase.in?(self.class.data_file_extensions) &&
103
+ original_path.extname.downcase.within?(self.class.data_file_extensions) &&
111
104
  collection.data?
112
105
  end
113
106
 
@@ -129,7 +122,12 @@ module Bridgetown
129
122
  encoding: site.config["encoding"]).map(&:to_hash),
130
123
  }
131
124
  when ".rb"
132
- process_ruby_data(File.read(original_path), original_path, 1)
125
+ Bridgetown::Utils::RubyExec.process_ruby_data(
126
+ self,
127
+ File.read(original_path),
128
+ original_path,
129
+ 1
130
+ )
133
131
  when ".json"
134
132
  json_data = JSON.parse(File.read(original_path))
135
133
  json_data.is_a?(Array) ? { rows: json_data } : json_data
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Bridgetown
4
4
  class Plugin
5
- extend ActiveSupport::DescendantsTracker
6
5
  include Bridgetown::Prioritizable
7
6
 
8
7
  self.priorities = {
@@ -2,44 +2,12 @@
2
2
 
3
3
  module Bridgetown
4
4
  class PluginManager
5
- LEGACY_PLUGINS_GROUP = :bridgetown_plugins
6
- YARN_DEPENDENCY_REGEXP = %r!(.+)@([^@]*)$!.freeze
5
+ NPM_DEPENDENCY_REGEXP = %r!(.+)@([^@]*)$!
7
6
 
8
7
  attr_reader :site, :loaders_manager
9
8
 
10
9
  @registered_plugins = Set.new
11
10
 
12
- # @param source_manifest [Bridgetown::Configuration::SourceManifest]
13
- def self.add_source_manifest(source_manifest)
14
- unless source_manifest.is_a?(Bridgetown::Configuration::SourceManifest)
15
- raise "You must add a SourceManifest instance"
16
- end
17
-
18
- unless Bridgetown::Current.preloaded_configuration
19
- raise "A preloaded configuration must be present before adding source manifests"
20
- end
21
-
22
- Bridgetown::Deprecator.deprecation_message(
23
- "The #{source_manifest.origin} plugin should switch from using `add_source_manifest' to " \
24
- "the `source_manifest` initializer method"
25
- )
26
-
27
- Bridgetown::Current.preloaded_configuration.source_manifests << source_manifest
28
- end
29
-
30
- def self.new_source_manifest(*_args, **kwargs)
31
- unless Bridgetown::Current.preloaded_configuration
32
- raise "A preloaded configuration must be present before adding source manifests"
33
- end
34
-
35
- Bridgetown::Deprecator.deprecation_message(
36
- "The #{kwargs[:origin]} plugin should switch from using `new_source_manifest' to the " \
37
- "`source_manifest` initializer method"
38
- )
39
-
40
- add_source_manifest(Bridgetown::Configuration::SourceManifest.new(**kwargs))
41
- end
42
-
43
11
  def self.add_registered_plugin(gem_or_plugin_file)
44
12
  @registered_plugins << gem_or_plugin_file
45
13
  end
@@ -50,23 +18,15 @@ module Bridgetown
50
18
  def bundler_specs
51
19
  @bundler_specs ||= Bundler.load.requested_specs
52
20
  end
53
-
54
- def source_manifests
55
- Bridgetown::Deprecator.deprecation_message(
56
- "Use the configuration's `source_manifests` method instead of the plugin manager"
57
- )
58
-
59
- Bridgetown::Current.preloaded_configuration.source_manifests
60
- end
61
21
  end
62
22
 
63
- def self.setup_bundler(skip_yarn: false)
23
+ def self.setup_bundler
64
24
  if !ENV["BRIDGETOWN_NO_BUNDLER_REQUIRE"] &&
65
25
  (Bundler::SharedHelpers.in_bundle? || Bridgetown.env.test?)
66
26
  require "bundler"
67
27
 
68
28
  require_relative "utils/initializers"
69
- load_determined_bundler_environment(skip_yarn: skip_yarn)
29
+ load_determined_bundler_environment
70
30
 
71
31
  ENV["BRIDGETOWN_NO_BUNDLER_REQUIRE"] = "true"
72
32
  true
@@ -78,7 +38,7 @@ module Bridgetown
78
38
  alias_method :require_from_bundler, :setup_bundler
79
39
  end
80
40
 
81
- def self.load_determined_bundler_environment(skip_yarn: false)
41
+ def self.load_determined_bundler_environment
82
42
  boot_file = File.join("config", "boot.rb")
83
43
 
84
44
  if File.file?(boot_file)
@@ -89,15 +49,12 @@ module Bridgetown
89
49
  # Note: the default Bundler config will set up all gem groups,
90
50
  # see: https://bundler.io/guides/groups.html
91
51
  Bundler.setup(:default, Bridgetown.env)
92
- else
93
- # Only setup and require :bridgetown_plugins
94
- legacy_yarn_and_register(legacy_require, skip_yarn: skip_yarn)
95
52
  end
96
53
  end
97
54
 
98
55
  def self.require_gem(name)
99
56
  Bridgetown::Utils::RequireGems.require_with_graceful_fail(name)
100
- plugins = Bridgetown::PluginManager.install_yarn_dependencies(name: name)
57
+ plugins = Bridgetown::PluginManager.install_npm_dependencies(name:)
101
58
 
102
59
  plugin_to_register = if plugins.length == 1
103
60
  plugins.first
@@ -112,28 +69,11 @@ module Bridgetown
112
69
  "Registered #{plugin_to_register.name}")
113
70
  end
114
71
 
115
- def self.legacy_require
116
- Bundler.require(LEGACY_PLUGINS_GROUP).select do |dep|
117
- (dep.groups & [LEGACY_PLUGINS_GROUP]).any? && dep.should_include?
118
- end
119
- end
120
-
121
- def self.legacy_yarn_and_register(required_gems, skip_yarn: false)
122
- install_yarn_dependencies(required_gems) unless skip_yarn
123
-
124
- required_gems.each do |installed_gem|
125
- add_registered_plugin installed_gem
126
- end
127
-
128
- Bridgetown.logger.debug("PluginManager:",
129
- "Required #{required_gems.map(&:name).join(", ")}")
130
- end
131
-
132
72
  def self.package_manager
133
- @package_manager ||= if File.exist?("yarn.lock")
134
- "yarn"
135
- elsif File.exist?("package-lock.json")
73
+ @package_manager ||= if File.exist?("package-lock.json")
136
74
  "npm"
75
+ elsif File.exist?("yarn.lock")
76
+ "yarn"
137
77
  elsif File.exist?("pnpm-lock.yaml")
138
78
  "pnpm"
139
79
  else
@@ -147,11 +87,11 @@ module Bridgetown
147
87
 
148
88
  # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
149
89
 
150
- # Iterates through loaded gems and finds yard-add gemspec metadata.
151
- # If that exact package hasn't been installed, execute yarn add
90
+ # Iterates through loaded gems and finds npm-add gemspec metadata.
91
+ # If that exact package hasn't been installed, execute npm i
152
92
  #
153
93
  # @return [Bundler::SpecSet]
154
- def self.install_yarn_dependencies(required_gems = bundler_specs, name: nil)
94
+ def self.install_npm_dependencies(required_gems = bundler_specs, name: nil)
155
95
  return required_gems unless File.exist?("package.json")
156
96
 
157
97
  package_json = JSON.parse(File.read("package.json"))
@@ -166,34 +106,37 @@ module Bridgetown
166
106
 
167
107
  # all right, time to install the package
168
108
  gems_to_search.each do |loaded_gem|
169
- yarn_dependency = find_yarn_dependency(loaded_gem)
170
- next unless add_yarn_dependency?(yarn_dependency, package_json)
109
+ npm_dependency = find_npm_dependency(loaded_gem)
110
+ next unless add_npm_dependency?(npm_dependency, package_json)
171
111
 
172
112
  next if package_manager.empty?
173
113
 
174
- cmd = "#{package_manager} #{package_manager_install_command} #{yarn_dependency.join("@")}"
114
+ cmd = "#{package_manager} #{package_manager_install_command} #{npm_dependency.join("@")}"
175
115
  system cmd
176
116
  end
177
117
 
178
118
  gems_to_search
179
119
  end
180
120
 
181
- # rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
121
+ def self.find_npm_dependency(loaded_gem)
122
+ npm_metadata = loaded_gem.to_spec&.metadata&.dig("npm-add") ||
123
+ loaded_gem.to_spec&.metadata&.dig("yarn-add")
124
+ npm_dependency = npm_metadata&.match(NPM_DEPENDENCY_REGEXP)
125
+ return nil if npm_dependency&.length != 3 || npm_dependency[2] == ""
182
126
 
183
- def self.find_yarn_dependency(loaded_gem)
184
- yarn_dependency = loaded_gem.to_spec&.metadata&.dig("yarn-add")&.match(YARN_DEPENDENCY_REGEXP)
185
- return nil if yarn_dependency&.length != 3 || yarn_dependency[2] == ""
186
-
187
- yarn_dependency[1..2]
127
+ npm_dependency[1..2]
188
128
  end
189
129
 
190
- def self.add_yarn_dependency?(yarn_dependency, package_json)
191
- return false if yarn_dependency.nil?
130
+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
131
+
132
+ def self.add_npm_dependency?(npm_dependency, package_json)
133
+ return false if npm_dependency.nil?
192
134
 
193
135
  # check matching version number is see if it's already installed
194
136
  if package_json["dependencies"]
195
- current_version = package_json["dependencies"][yarn_dependency.first]
196
- package_requires_updating?(current_version, yarn_dependency.last)
137
+ current_version = package_json["dependencies"][npm_dependency.first]
138
+ current_version = current_version.delete_prefix("^") if current_version
139
+ package_requires_updating?(current_version, npm_dependency.last)
197
140
  else
198
141
  true
199
142
  end
@@ -3,27 +3,14 @@
3
3
  require "zeitwerk"
4
4
  require "roda"
5
5
  require "json"
6
- require "roda/plugins/public"
7
6
 
8
7
  Bridgetown::Current.preloaded_configuration ||= Bridgetown.configuration
9
8
 
10
9
  require_relative "logger"
11
10
  require_relative "routes"
12
- require_relative "static_indexes"
13
11
 
14
12
  module Bridgetown
15
13
  module Rack
16
- class Roda < ::Roda
17
- def self.inherited(klass)
18
- Bridgetown::Deprecator.deprecation_message(
19
- "The `Bridgetown::Rack::Roda' class will be removed in favor of using the " \
20
- "`bridgetown_server' plugin in a future version"
21
- )
22
- super
23
- klass.plugin :bridgetown_server
24
- end
25
- end
26
-
27
14
  class << self
28
15
  # @return [Bridgetown::Utils::LoadersManager]
29
16
  attr_accessor :loaders_manager
@@ -76,7 +63,6 @@ module Bridgetown
76
63
 
77
64
  loader.reload
78
65
  loader.eager_load
79
- Bridgetown::Rack::Routes.reload_subclasses
80
66
  rescue SyntaxError => e
81
67
  Bridgetown::Errors.print_build_error(e)
82
68
  end.start
@@ -89,7 +75,6 @@ module Bridgetown
89
75
  next unless load_path == server_folder
90
76
 
91
77
  loader.eager_load
92
- Bridgetown::Rack::Routes.reload_subclasses
93
78
  end
94
79
 
95
80
  loaders_manager.setup_loaders([server_folder])
@@ -2,12 +2,6 @@
2
2
 
3
3
  module Bridgetown
4
4
  module Rack
5
- @interrupted = false
6
-
7
- class << self
8
- attr_accessor :interrupted
9
- end
10
-
11
5
  class Routes
12
6
  include Bridgetown::Prioritizable
13
7
 
@@ -34,7 +28,7 @@ module Bridgetown
34
28
  end
35
29
  puts
36
30
  puts "Routes:"
37
- puts "======="
31
+ puts "=======\n"
38
32
  if routes.blank?
39
33
  puts "No routes found. Have you commented all of your routes?"
40
34
  puts "Documentation: https://github.com/jeremyevans/roda-route_list#basic-usage-"
@@ -51,9 +45,6 @@ module Bridgetown
51
45
  end
52
46
  # rubocop:enable Bridgetown/NoPutsAllowed, Metrics/MethodLength
53
47
 
54
- # @return [Hash<String, Class(Routes)>]
55
- attr_accessor :tracked_subclasses
56
-
57
48
  # @return [Proc]
58
49
  attr_accessor :router_block
59
50
 
@@ -65,30 +56,9 @@ module Bridgetown
65
56
  "#{priorities[priority]}#{self}" <=> "#{priorities[other.priority]}#{other}"
66
57
  end
67
58
 
68
- # @param base [Class(Routes)]
69
- def inherited(base)
70
- Bridgetown::Rack::Routes.track_subclass base
71
- super
72
- end
73
-
74
- # @param klass [Class(Routes)]
75
- def track_subclass(klass)
76
- Bridgetown::Rack::Routes.tracked_subclasses ||= {}
77
- Bridgetown::Rack::Routes.tracked_subclasses[klass.name] = klass
78
- end
79
-
80
59
  # @return [Array<Class(Routes)>]
81
60
  def sorted_subclasses
82
- Bridgetown::Rack::Routes.tracked_subclasses&.values&.sort
83
- end
84
-
85
- # @return [void]
86
- def reload_subclasses
87
- Bridgetown::Rack::Routes.tracked_subclasses&.each_key do |klassname|
88
- Kernel.const_get(klassname)
89
- rescue NameError
90
- Bridgetown::Rack::Routes.tracked_subclasses.delete klassname
91
- end
61
+ Bridgetown::Rack::Routes.descendants.sort
92
62
  end
93
63
 
94
64
  # Add a router block via the current Routes class
@@ -118,36 +88,11 @@ module Bridgetown
118
88
  new(roda_app).handle_routes
119
89
  end
120
90
 
121
- # Start the Roda app request cycle. There are two different code paths
122
- # depending on if there's a site `base_path` configured
91
+ # Set up live reload if allowed, then run through all the Routes blocks.
123
92
  #
124
93
  # @param roda_app [Roda]
125
94
  # @return [void]
126
- def start!(roda_app)
127
- if Bridgetown::Current.preloaded_configuration.base_path == "/"
128
- load_all_routes roda_app
129
- return
130
- end
131
-
132
- # Support custom base_path configurations
133
- roda_app.request.on(
134
- Bridgetown::Current.preloaded_configuration.base_path.delete_prefix("/")
135
- ) do
136
- load_all_routes roda_app
137
- end
138
-
139
- nil
140
- end
141
-
142
- # Run the Roda public plugin first, set up live reload if allowed, then
143
- # run through all the Routes blocks. If the file-based router plugin
144
- # is available, kick off that request process next.
145
- #
146
- # @param roda_app [Roda]
147
- # @return [void]
148
- def load_all_routes(roda_app)
149
- roda_app.request.public
150
-
95
+ def load_all(roda_app)
151
96
  if Bridgetown.env.development? &&
152
97
  !Bridgetown::Current.preloaded_configuration.skip_live_reload
153
98
  setup_live_reload roda_app
@@ -160,33 +105,40 @@ module Bridgetown
160
105
 
161
106
  # @param app [Roda]
162
107
  def setup_live_reload(app) # rubocop:disable Metrics
163
- sleep_interval = 0.2
108
+ sleep_interval = 0.5
164
109
  file_to_check = File.join(Bridgetown::Current.preloaded_configuration.destination,
165
110
  "index.html")
166
111
  errors_file = Bridgetown.build_errors_path
167
112
 
168
113
  app.request.get "_bridgetown/live_reload" do
169
- app.response["Content-Type"] = "text/event-stream"
170
-
171
114
  @_mod = File.exist?(file_to_check) ? File.stat(file_to_check).mtime.to_i : 0
172
- app.stream async: true do |out|
173
- # 5 second intervals so Puma's threads aren't all exausted
174
- (5 / sleep_interval).to_i.times do
175
- break if Bridgetown::Rack.interrupted
176
-
177
- new_mod = File.exist?(file_to_check) ? File.stat(file_to_check).mtime.to_i : 0
178
- if @_mod < new_mod
179
- out << "data: reloaded!\n\n"
115
+ event_stream = proc do |stream|
116
+ Thread.new do
117
+ loop do
118
+ new_mod = File.exist?(file_to_check) ? File.stat(file_to_check).mtime.to_i : 0
119
+
120
+ if @_mod < new_mod
121
+ stream.write "data: reloaded!\n\n"
122
+ break
123
+ elsif File.exist?(errors_file)
124
+ stream.write "event: builderror\ndata: #{File.read(errors_file).to_json}\n\n"
125
+ else
126
+ stream.write "data: #{new_mod}\n\n"
127
+ end
128
+
129
+ sleep sleep_interval
130
+ rescue Errno::EPIPE # User refreshed the page
180
131
  break
181
- elsif File.exist?(errors_file)
182
- out << "event: builderror\ndata: #{File.read(errors_file).to_json}\n\n"
183
- else
184
- out << "data: #{new_mod}\n\n"
185
132
  end
186
-
187
- sleep sleep_interval
133
+ ensure
134
+ stream.close
188
135
  end
189
136
  end
137
+
138
+ app.request.halt [200, {
139
+ "Content-Type" => "text/event-stream",
140
+ "cache-control" => "no-cache",
141
+ }, event_stream,]
190
142
  end
191
143
  end
192
144
  end
@@ -205,9 +157,9 @@ module Bridgetown
205
157
  end
206
158
 
207
159
  # Any missing methods are passed along to the underlying Roda app if possible
208
- def method_missing(method_name, *args, **kwargs, &block)
160
+ def method_missing(method_name, ...)
209
161
  if @_roda_app.respond_to?(method_name.to_sym)
210
- @_roda_app.send method_name.to_sym, *args, **kwargs, &block
162
+ @_roda_app.send(method_name.to_sym, ...)
211
163
  else
212
164
  super
213
165
  end
@@ -219,15 +171,3 @@ module Bridgetown
219
171
  end
220
172
  end
221
173
  end
222
-
223
- if defined?(Puma) && Bridgetown.env.development? &&
224
- !Bridgetown::Current.preloaded_configuration.skip_live_reload
225
- Puma::Launcher.class_eval do
226
- alias_method :_old_stop, :stop
227
- def stop
228
- Bridgetown::Rack.interrupted = true
229
-
230
- _old_stop
231
- end
232
- end
233
- end
@@ -38,7 +38,7 @@ module Bridgetown
38
38
  site.collections.each_value do |collection|
39
39
  next if collection.data?
40
40
 
41
- collection.read
41
+ collection.read unless site.ssr? && collection.metadata.skip_for_ssr
42
42
  end
43
43
  end
44
44
 
@@ -69,7 +69,7 @@ module Bridgetown
69
69
  file_path = @site.in_source_dir(base, entry)
70
70
  if File.directory?(file_path)
71
71
  entries_dirs << entry
72
- elsif Utils.has_yaml_header?(file_path) || Utils.has_rbfm_header?(file_path)
72
+ elsif FrontMatter::Loaders.front_matter?(file_path)
73
73
  entries_pages << entry
74
74
  else
75
75
  entries_static_files << entry
@@ -78,7 +78,7 @@ module Bridgetown
78
78
 
79
79
  retrieve_dirs(dir, entries_dirs)
80
80
  retrieve_pages(dir, entries_pages)
81
- retrieve_static_files(dir, entries_static_files)
81
+ retrieve_static_files(dir, entries_static_files) unless site.ssr?
82
82
  end
83
83
 
84
84
  # Recursively traverse directories with the read_directories function.
@@ -101,6 +101,8 @@ module Bridgetown
101
101
  # @param entries_pages [Array<String>] page paths in the directory
102
102
  # @return [void]
103
103
  def retrieve_pages(dir, entries_pages)
104
+ return if site.ssr? && site.collections.pages.metadata.skip_for_ssr
105
+
104
106
  entries_pages.each do |page_path|
105
107
  site.collections.pages.read_resource(site.in_source_dir(dir, page_path))
106
108
  end
@@ -129,7 +131,7 @@ module Bridgetown
129
131
  #
130
132
  # Returns the Array of filtered entries.
131
133
  def filter_entries(entries, base_directory = nil)
132
- EntryFilter.new(site, base_directory: base_directory).filter(entries)
134
+ EntryFilter.new(site, base_directory:).filter(entries)
133
135
  end
134
136
 
135
137
  # Read the entries from a particular directory for processing
@@ -47,10 +47,10 @@ module Bridgetown
47
47
  Layout.label_for_file(file)
48
48
  end
49
49
 
50
- def within(directory, &block)
50
+ def within(directory, &)
51
51
  return unless File.exist?(directory)
52
52
 
53
- Dir.chdir(directory, &block)
53
+ Dir.chdir(directory, &)
54
54
  end
55
55
  end
56
56
  end