bridgetown-core 2.0.0.beta2 → 2.0.0.beta4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/bridgetown-core.gemspec +43 -42
- data/lib/bridgetown-core/cache.rb +3 -19
- data/lib/bridgetown-core/cleaner.rb +17 -19
- data/lib/bridgetown-core/collection.rb +6 -5
- data/lib/bridgetown-core/commands/base.rb +7 -0
- data/lib/bridgetown-core/commands/build.rb +35 -22
- data/lib/bridgetown-core/commands/concerns/actions.rb +4 -0
- data/lib/bridgetown-core/commands/console.rb +0 -1
- data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +7 -6
- data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +14 -13
- data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
- data/lib/bridgetown-core/commands/esbuild/update.rb +17 -3
- data/lib/bridgetown-core/commands/esbuild.rb +1 -1
- data/lib/bridgetown-core/commands/start.rb +12 -2
- data/lib/bridgetown-core/component.rb +1 -1
- data/lib/bridgetown-core/concerns/intuitive_expectations.rb +67 -0
- data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
- data/lib/bridgetown-core/concerns/publishable.rb +2 -0
- data/lib/bridgetown-core/concerns/site/content.rb +4 -1
- data/lib/bridgetown-core/concerns/site/extensible.rb +6 -1
- data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +33 -18
- data/lib/bridgetown-core/concerns/site/localizable.rb +2 -0
- data/lib/bridgetown-core/concerns/site/processable.rb +2 -0
- data/lib/bridgetown-core/concerns/site/renderable.rb +3 -0
- data/lib/bridgetown-core/concerns/site/ssr.rb +1 -2
- data/lib/bridgetown-core/concerns/site/writable.rb +1 -0
- data/lib/bridgetown-core/concerns/viewable.rb +46 -0
- data/lib/bridgetown-core/configuration.rb +29 -23
- data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +5 -5
- data/lib/bridgetown-core/configurations/minitesting.rb +24 -64
- data/lib/bridgetown-core/converter.rb +2 -7
- data/lib/bridgetown-core/converters/erb_templates.rb +11 -7
- data/lib/bridgetown-core/converters/identity.rb +3 -11
- data/lib/bridgetown-core/converters/liquid_templates.rb +3 -5
- data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
- data/lib/bridgetown-core/converters/markdown.rb +11 -14
- data/lib/bridgetown-core/converters/serbea_templates.rb +10 -8
- data/lib/bridgetown-core/drops/drop.rb +29 -42
- data/lib/bridgetown-core/drops/resource_drop.rb +3 -12
- data/lib/bridgetown-core/errors.rb +2 -8
- data/lib/bridgetown-core/filters/condition_helpers.rb +6 -9
- data/lib/bridgetown-core/filters/date_filters.rb +22 -35
- data/lib/bridgetown-core/filters/grouping_filters.rb +11 -11
- data/lib/bridgetown-core/filters.rb +53 -72
- data/lib/bridgetown-core/front_matter/defaults.rb +14 -19
- data/lib/bridgetown-core/generated_page.rb +6 -6
- data/lib/bridgetown-core/generators/prototype_generator.rb +0 -2
- data/lib/bridgetown-core/helpers.rb +2 -2
- data/lib/bridgetown-core/hooks.rb +0 -1
- data/lib/bridgetown-core/layout.rb +3 -4
- data/lib/bridgetown-core/liquid_extensions.rb +3 -5
- data/lib/bridgetown-core/log_adapter.rb +37 -56
- data/lib/bridgetown-core/plugin_manager.rb +7 -3
- data/lib/bridgetown-core/rack/boot.rb +7 -57
- data/lib/bridgetown-core/rack/default_config.ru +14 -0
- data/lib/bridgetown-core/rack/loader_hooks.rb +83 -0
- data/lib/bridgetown-core/rack/logger.rb +0 -2
- data/lib/bridgetown-core/rack/routes.rb +3 -2
- data/lib/bridgetown-core/resource/base.rb +8 -8
- data/lib/bridgetown-core/resource/permalink_processor.rb +1 -1
- data/lib/bridgetown-core/resource/relations.rb +3 -1
- data/lib/bridgetown-core/ruby_template_view.rb +0 -1
- data/lib/bridgetown-core/static_file.rb +15 -20
- data/lib/bridgetown-core/tags/class_map.rb +1 -1
- data/lib/bridgetown-core/tags/post_url.rb +2 -32
- data/lib/bridgetown-core/utils/initializers.rb +2 -2
- data/lib/bridgetown-core/utils/require_gems.rb +1 -3
- data/lib/bridgetown-core/utils.rb +41 -44
- data/lib/bridgetown-core/watcher.rb +2 -3
- data/lib/bridgetown-core.rb +29 -10
- data/lib/roda/plugins/bridgetown_server.rb +13 -25
- data/lib/roda/plugins/bridgetown_ssr.rb +21 -3
- data/lib/roda/plugins/flashier.rb +57 -0
- data/lib/roda/plugins/generic_index.html +127 -0
- data/lib/roda/plugins/ssg.rb +3 -2
- data/lib/site_template/config/initializers.rb +2 -0
- data/lib/site_template/package.json.erb +1 -0
- data/lib/site_template/postcss.config.js.erb +1 -1
- metadata +26 -7
- data/lib/bridgetown-core/commands/doctor.rb +0 -147
@@ -49,15 +49,12 @@ module Bridgetown
|
|
49
49
|
deep_merge_hashes!(master_hash.dup, other_hash)
|
50
50
|
end
|
51
51
|
|
52
|
-
# Merges a master hash with another hash, recursively.
|
52
|
+
# Merges a master hash with another hash, recursively. This code was lovingly stolen from
|
53
|
+
# some random gem: https://rubygems.org/gems/tartan Thanks to whoever made it.
|
53
54
|
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
# This code was lovingly stolen from some random gem:
|
58
|
-
# http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
59
|
-
#
|
60
|
-
# Thanks to whoever made it.
|
55
|
+
# @param target [Hash] the "parent" hash whose values will be overridden
|
56
|
+
# @param overwrite [Hash] the other hash whose values will be persisted after the merge
|
57
|
+
# @return [Hash]
|
61
58
|
def deep_merge_hashes!(target, overwrite)
|
62
59
|
merge_values(target, overwrite)
|
63
60
|
merge_default_proc(target, overwrite)
|
@@ -110,11 +107,9 @@ module Bridgetown
|
|
110
107
|
|
111
108
|
# Parse a date/time and throw an error if invalid
|
112
109
|
#
|
113
|
-
# input
|
114
|
-
# msg
|
115
|
-
#
|
116
|
-
# Returns the parsed date if successful, throws a FatalException
|
117
|
-
# if not
|
110
|
+
# @param input [String] the date/time to parse
|
111
|
+
# @param msg [String] the error message to show the user
|
112
|
+
# @return [Time] the parsed date if successful, throws a FatalException if not
|
118
113
|
def parse_date(input, msg = "Input could not be parsed.")
|
119
114
|
Time.parse(input).localtime
|
120
115
|
rescue ArgumentError
|
@@ -140,35 +135,30 @@ module Bridgetown
|
|
140
135
|
FrontMatter::Loaders::Ruby.header?(file)
|
141
136
|
end
|
142
137
|
|
143
|
-
# Slugify a filename or title
|
138
|
+
# Slugify a filename or title
|
144
139
|
#
|
145
|
-
#
|
146
|
-
# mode - how string is slugified
|
147
|
-
# cased - whether to replace all uppercase letters with their
|
148
|
-
# lowercase counterparts
|
140
|
+
# When mode is `none`, return the given string.
|
149
141
|
#
|
150
|
-
# When mode is
|
151
|
-
#
|
152
|
-
# When mode is "raw", return the given string,
|
142
|
+
# When mode is `raw`, return the given string,
|
153
143
|
# with every sequence of spaces characters replaced with a hyphen.
|
154
144
|
#
|
155
|
-
# When mode is
|
145
|
+
# When mode is `default`, `simple`, or `nil`, non-alphabetic characters are
|
156
146
|
# replaced with a hyphen too.
|
157
147
|
#
|
158
|
-
# When mode is
|
148
|
+
# When mode is `pretty`, some non-alphabetic characters (`._~!$&'()+,;=@`)
|
159
149
|
# are not replaced with hyphen.
|
160
150
|
#
|
161
|
-
# When mode is
|
162
|
-
# a-z (lowercase), A-Z (uppercase) and 0-9 (numbers) are not replaced with hyphen.
|
151
|
+
# When mode is `ascii`, some everything else except ASCII characters
|
152
|
+
# `a-z` (lowercase), `A-Z` (uppercase) and `0-9` (numbers) are not replaced with hyphen.
|
163
153
|
#
|
164
|
-
# When mode is
|
154
|
+
# When mode is `latin`, the input string is first preprocessed so that
|
165
155
|
# any letters with accents are replaced with the plain letter. Afterwards,
|
166
|
-
# it follows the
|
156
|
+
# it follows the `default` mode of operation.
|
167
157
|
#
|
168
|
-
# If cased is true
|
158
|
+
# If `cased` is `true`, all uppercase letters in the result string are
|
169
159
|
# replaced with their lowercase counterparts.
|
170
160
|
#
|
171
|
-
#
|
161
|
+
# @example
|
172
162
|
# slugify("The _config.yml file")
|
173
163
|
# # => "the-config-yml-file"
|
174
164
|
#
|
@@ -184,7 +174,11 @@ module Bridgetown
|
|
184
174
|
# slugify("The _config.yml file", "latin")
|
185
175
|
# # => "the-config-yml-file"
|
186
176
|
#
|
187
|
-
#
|
177
|
+
# @param string [String] filename or title to slugify
|
178
|
+
# @param mode [String] how string is slugified
|
179
|
+
# @param cased [Boolean] whether to replace all uppercase letters with their
|
180
|
+
# lowercase counterparts
|
181
|
+
# @return [String] the slugified string.
|
188
182
|
def slugify(string, mode: nil, cased: false)
|
189
183
|
mode ||= "default"
|
190
184
|
return nil if string.nil?
|
@@ -210,13 +204,13 @@ module Bridgetown
|
|
210
204
|
end
|
211
205
|
|
212
206
|
# Work the same way as Dir.glob but seperating the input into two parts
|
213
|
-
# ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act
|
207
|
+
# (`'dir' + '/' + 'pattern'`) to make sure the first part(`'dir'`) does not act
|
214
208
|
# as a pattern.
|
215
209
|
#
|
216
|
-
# For example, Dir.glob("path[/*") always returns an empty array,
|
217
|
-
# because the method fails to find the closing pattern to
|
210
|
+
# For example, `Dir.glob("path[/*")` always returns an empty array,
|
211
|
+
# because the method fails to find the closing pattern to `[` which is `]`
|
218
212
|
#
|
219
|
-
#
|
213
|
+
# @example
|
220
214
|
# safe_glob("path[", "*")
|
221
215
|
# # => ["path[/file1", "path[/file2"]
|
222
216
|
#
|
@@ -226,12 +220,13 @@ module Bridgetown
|
|
226
220
|
# safe_glob("path", ["**", "*"])
|
227
221
|
# # => ["path[/file1", "path[/folder/file2"]
|
228
222
|
#
|
229
|
-
# dir
|
230
|
-
#
|
231
|
-
# patterns
|
232
|
-
#
|
233
|
-
#
|
234
|
-
#
|
223
|
+
# @param dir [String] the dir where glob will be executed under
|
224
|
+
# (the dir will be included to each result)
|
225
|
+
# @param patterns [String, Array<String>] the patterns (or the pattern) which will be applied
|
226
|
+
# under the dir
|
227
|
+
# @param flags [Integer] the flags which will be applied to the pattern,
|
228
|
+
# a bitwise OR of the `File::FNM_XXX` constants
|
229
|
+
# @return [Array<String>] matched pathes
|
235
230
|
def safe_glob(dir, patterns, flags = 0)
|
236
231
|
return [] unless Dir.exist?(dir)
|
237
232
|
|
@@ -243,8 +238,8 @@ module Bridgetown
|
|
243
238
|
end
|
244
239
|
end
|
245
240
|
|
246
|
-
#
|
247
|
-
#
|
241
|
+
# @return [Hash] merged option hash for `File.read` of `site` (if exists)
|
242
|
+
# and a given param
|
248
243
|
def merged_file_read_opts(site, opts)
|
249
244
|
merged = (site ? site.file_read_opts : {}).merge(opts)
|
250
245
|
if merged[:encoding] && !merged[:encoding].start_with?("bom|")
|
@@ -256,8 +251,10 @@ module Bridgetown
|
|
256
251
|
merged
|
257
252
|
end
|
258
253
|
|
259
|
-
#
|
260
|
-
#
|
254
|
+
# Provides a string that's been reindented so that Markdown's four+ spaces =
|
255
|
+
# code doesn't get triggered for nested components
|
256
|
+
# @param input [String]
|
257
|
+
# @return [String]
|
261
258
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
262
259
|
def reindent_for_markdown(input)
|
263
260
|
lines = input.lines
|
@@ -159,9 +159,8 @@ module Bridgetown
|
|
159
159
|
|
160
160
|
# Paths to ignore for the watch option
|
161
161
|
#
|
162
|
-
# options
|
163
|
-
#
|
164
|
-
# Returns a list of relative paths from source that should be ignored
|
162
|
+
# @param options [Bridgetown::Configuration] options loaded from config and/or CLI
|
163
|
+
# @return [Array<String>] list of relative paths from source that should be ignored
|
165
164
|
def listen_ignore_paths(options)
|
166
165
|
source = Pathname.new(options["source"]).expand_path
|
167
166
|
paths = to_exclude(options)
|
data/lib/bridgetown-core.rb
CHANGED
@@ -35,7 +35,7 @@ require "yaml"
|
|
35
35
|
require "bridgetown-foundation"
|
36
36
|
|
37
37
|
# 3rd party
|
38
|
-
require "active_support" # TODO: remove by the end of
|
38
|
+
require "active_support" # TODO: remove by the end of 2025
|
39
39
|
require "active_support/core_ext/object/blank"
|
40
40
|
require "active_support/core_ext/string/inflections"
|
41
41
|
require "active_support/core_ext/string/output_safety"
|
@@ -54,8 +54,9 @@ I18n::Backend::Simple.include I18n::Backend::Fallbacks
|
|
54
54
|
|
55
55
|
# Monkey patches:
|
56
56
|
|
57
|
+
# @!visibility private
|
57
58
|
module HashWithDotAccess
|
58
|
-
class Hash
|
59
|
+
class Hash
|
59
60
|
def to_liquid
|
60
61
|
to_h.to_liquid
|
61
62
|
end
|
@@ -76,7 +77,6 @@ module Bridgetown
|
|
76
77
|
autoload :DefaultsReader, "bridgetown-core/readers/defaults_reader"
|
77
78
|
autoload :Deprecator, "bridgetown-core/deprecator"
|
78
79
|
autoload :EntryFilter, "bridgetown-core/entry_filter"
|
79
|
-
# TODO: we have too many errors! This is silly
|
80
80
|
autoload :Errors, "bridgetown-core/errors"
|
81
81
|
autoload :FrontMatter, "bridgetown-core/front_matter"
|
82
82
|
autoload :GeneratedPage, "bridgetown-core/generated_page"
|
@@ -100,6 +100,7 @@ module Bridgetown
|
|
100
100
|
autoload :Slot, "bridgetown-core/slot"
|
101
101
|
autoload :StaticFile, "bridgetown-core/static_file"
|
102
102
|
autoload :Transformable, "bridgetown-core/concerns/transformable"
|
103
|
+
autoload :Viewable, "bridgetown-core/concerns/viewable"
|
103
104
|
autoload :Utils, "bridgetown-core/utils"
|
104
105
|
autoload :VERSION, "bridgetown-core/version"
|
105
106
|
autoload :Watcher, "bridgetown-core/watcher"
|
@@ -132,10 +133,16 @@ module Bridgetown
|
|
132
133
|
|
133
134
|
# Set up the Bridgetown execution environment before attempting to load any
|
134
135
|
# plugins or gems prior to a site build
|
135
|
-
def begin!
|
136
|
+
def begin!(with_config: :preflight)
|
136
137
|
ENV["RACK_ENV"] ||= environment
|
137
138
|
|
138
|
-
|
139
|
+
if with_config == :preflight
|
140
|
+
Bridgetown::Current.preloaded_configuration ||= Bridgetown::Configuration::Preflight.new
|
141
|
+
elsif with_config == :initializers &&
|
142
|
+
!Bridgetown::Current.preloaded_configuration.is_a?(Bridgetown::Configuration)
|
143
|
+
Bridgetown::Current.preloaded_configuration = Bridgetown.configuration
|
144
|
+
end
|
145
|
+
|
139
146
|
Bridgetown::PluginManager.setup_bundler
|
140
147
|
end
|
141
148
|
|
@@ -366,11 +373,23 @@ module Bridgetown
|
|
366
373
|
#
|
367
374
|
# @return [String] the path to the cached errors file
|
368
375
|
def build_errors_path
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
376
|
+
site_config = Bridgetown::Current.site&.config || Bridgetown::Current.preloaded_configuration
|
377
|
+
File.join(site_config.root_dir, site_config.cache_dir, "build_errors.txt")
|
378
|
+
end
|
379
|
+
|
380
|
+
# This file gets touched each time there's a new build, which then triggers live reload
|
381
|
+
# in the browser.
|
382
|
+
#
|
383
|
+
# @see Bridgetown::Rack::Routes.setup_live_reload
|
384
|
+
# @return [String] the path to the empty file being watched
|
385
|
+
def live_reload_path
|
386
|
+
site_config = Bridgetown::Current.site&.config || Bridgetown::Current.preloaded_configuration
|
387
|
+
File.join(site_config.root_dir, site_config.cache_dir, "live_reload.txt")
|
388
|
+
end
|
389
|
+
|
390
|
+
def touch_live_reload_file(path = live_reload_path)
|
391
|
+
FileUtils.mkdir_p File.dirname(path)
|
392
|
+
FileUtils.touch path
|
374
393
|
end
|
375
394
|
end
|
376
395
|
|
@@ -13,20 +13,15 @@ class Roda
|
|
13
13
|
|
14
14
|
app.extend ClassMethods # we need to do this here because Roda hasn't done it yet
|
15
15
|
app.plugin :initializers
|
16
|
-
app.plugin :method_override
|
17
|
-
app.plugin :all_verbs
|
18
|
-
app.plugin :hooks
|
19
16
|
app.plugin :common_logger, Bridgetown::Rack::Logger.new($stdout), method: :info
|
20
17
|
app.plugin :json
|
21
18
|
app.plugin :json_parser
|
22
|
-
app.plugin :indifferent_params
|
23
|
-
app.plugin :cookies, path: "/"
|
24
19
|
app.plugin :ssg, root: Bridgetown::Current.preloaded_configuration.destination
|
25
20
|
app.plugin :not_found do
|
26
21
|
output_folder = Bridgetown::Current.preloaded_configuration.destination
|
27
22
|
File.read(File.join(output_folder, "404.html"))
|
28
23
|
rescue Errno::ENOENT
|
29
|
-
"404 Not Found"
|
24
|
+
"<h1>404 Not Found</h1>"
|
30
25
|
end
|
31
26
|
app.plugin :exception_page
|
32
27
|
app.plugin :error_handler do |e|
|
@@ -35,10 +30,10 @@ class Roda
|
|
35
30
|
)
|
36
31
|
next exception_page(e) if ENV.fetch("RACK_ENV", nil) == "development"
|
37
32
|
|
38
|
-
output_folder =
|
33
|
+
output_folder = self.class.opts[:bridgetown_preloaded_config].destination
|
39
34
|
File.read(File.join(output_folder, "500.html"))
|
40
35
|
rescue Errno::ENOENT
|
41
|
-
"500 Internal Server Error"
|
36
|
+
"<h1>500 Internal Server Error</h1>"
|
42
37
|
end
|
43
38
|
|
44
39
|
# TODO: there may be a better way to do this, see `exception_page_css` instance method
|
@@ -123,9 +118,12 @@ class Roda
|
|
123
118
|
hook_result = instance_exec(&self.class.opts[:root_hook]) if self.class.opts[:root_hook]
|
124
119
|
next hook_result if hook_result
|
125
120
|
|
126
|
-
|
127
|
-
|
128
|
-
|
121
|
+
root_file = [
|
122
|
+
File.join(self.class.opts[:ssg_root], "index.html"),
|
123
|
+
File.expand_path("generic_index.html", __dir__),
|
124
|
+
].find { File.exist?(_1) }
|
125
|
+
|
126
|
+
status, headers, body = self.class.opts[:ssg_server].serving(request, root_file)
|
129
127
|
response_headers = response.headers
|
130
128
|
response_headers.replace(headers)
|
131
129
|
|
@@ -133,7 +131,7 @@ class Roda
|
|
133
131
|
rescue StandardError => e
|
134
132
|
Bridgetown.logger.debug("Root handler error: #{e.message}")
|
135
133
|
response.status = 500
|
136
|
-
"<p>ERROR: cannot
|
134
|
+
"<p>ERROR: cannot serve the root <code>index</code> file.</p>"
|
137
135
|
end
|
138
136
|
end
|
139
137
|
|
@@ -158,21 +156,11 @@ class Roda
|
|
158
156
|
scope.initialize_bridgetown_context
|
159
157
|
scope.initialize_bridgetown_root
|
160
158
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
# There are two different code paths depending on if there's a site `base_path` configured
|
165
|
-
if Bridgetown::Current.preloaded_configuration.base_path == "/"
|
159
|
+
base_path = Bridgetown::Current.preloaded_configuration.base_path.delete_prefix("/")
|
160
|
+
on(base_path.empty? ? true : base_path) do
|
161
|
+
ssg # static file server
|
166
162
|
Bridgetown::Rack::Routes.load_all scope
|
167
|
-
return
|
168
163
|
end
|
169
|
-
|
170
|
-
# Support custom base_path configurations
|
171
|
-
on(Bridgetown::Current.preloaded_configuration.base_path.delete_prefix("/")) do
|
172
|
-
Bridgetown::Rack::Routes.load_all scope
|
173
|
-
end
|
174
|
-
|
175
|
-
nil
|
176
164
|
end
|
177
165
|
end
|
178
166
|
end
|
@@ -13,13 +13,31 @@ class Roda
|
|
13
13
|
alias_method :site, :bridgetown_site
|
14
14
|
end
|
15
15
|
|
16
|
-
def self.load_dependencies(app)
|
17
|
-
app.plugin :
|
16
|
+
def self.load_dependencies(app, opts = { sessions: false })
|
17
|
+
app.plugin :all_verbs
|
18
|
+
app.plugin :cookies, path: "/"
|
19
|
+
app.plugin :indifferent_params
|
20
|
+
app.plugin :method_override
|
21
|
+
app.plugin :route_csrf
|
18
22
|
|
19
23
|
# This lets us return callable objects directly in Roda response blocks
|
24
|
+
app.plugin :custom_block_results
|
20
25
|
app.handle_block_result(Bridgetown::RodaCallable) do |callable|
|
21
|
-
callable.(self)
|
26
|
+
request.send :block_result_body, callable.(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
return unless opts[:sessions]
|
30
|
+
|
31
|
+
secret_key = ENV.fetch("RODA_SECRET_KEY", nil)
|
32
|
+
unless secret_key
|
33
|
+
raise Bridgetown::Errors::InvalidConfigurationError,
|
34
|
+
"The Roda sessions plugin can't find a valid secret. Run " \
|
35
|
+
"`bin/bridgetown secret' and put the key in your ENV as the " \
|
36
|
+
"RODA_SECRET_KEY variable"
|
22
37
|
end
|
38
|
+
|
39
|
+
app.plugin :sessions, secret: secret_key
|
40
|
+
app.plugin :flashier
|
23
41
|
end
|
24
42
|
|
25
43
|
def self.configure(app, _opts = {}, &)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Roda
|
4
|
+
module RodaPlugins
|
5
|
+
module Flashier
|
6
|
+
module FlashHashAdditions
|
7
|
+
def info
|
8
|
+
self["info"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def info=(val)
|
12
|
+
self["info"] = val
|
13
|
+
end
|
14
|
+
|
15
|
+
def alert
|
16
|
+
self["alert"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def alert=(val)
|
20
|
+
self["alert"] = val
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module FlashHashIndifferent
|
25
|
+
def []=(key, val)
|
26
|
+
@next[key.to_s] = val
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module FlashNowHashIndifferent
|
31
|
+
def []=(key, val)
|
32
|
+
super(key.to_s, val)
|
33
|
+
end
|
34
|
+
|
35
|
+
def [](key)
|
36
|
+
super(key.to_s)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.load_dependencies(app)
|
41
|
+
require "roda/plugins/flash"
|
42
|
+
|
43
|
+
Roda::RodaPlugins::Flash::FlashHash.include FlashHashAdditions, FlashHashIndifferent
|
44
|
+
Roda::RodaPlugins::Flash::FlashHash.class_eval do
|
45
|
+
def initialize(hash = {})
|
46
|
+
super(hash || {})
|
47
|
+
now.singleton_class.include FlashHashAdditions, FlashNowHashIndifferent
|
48
|
+
@next = {}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
app.plugin :flash
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
register_plugin :flashier, Flashier
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
<title>Bridgetown has loaded</title>
|
7
|
+
<style>
|
8
|
+
html {
|
9
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
10
|
+
}
|
11
|
+
a:link, a:visited {
|
12
|
+
color: rgb(30,40,38);
|
13
|
+
}
|
14
|
+
header {
|
15
|
+
margin-block: 2rem;
|
16
|
+
}
|
17
|
+
main {
|
18
|
+
margin-block: 2rem;
|
19
|
+
margin-inline: auto;
|
20
|
+
max-inline-size: 70ch;
|
21
|
+
}
|
22
|
+
</style>
|
23
|
+
</head>
|
24
|
+
<body>
|
25
|
+
<header style="text-align: center">
|
26
|
+
<svg aria-label="Bridgetown" width="300" viewBox="0 0 1863 572" version="1.1" xmlns="http://www.w3.org/2000/svg" style="display: inline-block; fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
27
|
+
<g transform="matrix(1,0,0,1,-1520.67,-710.833)">
|
28
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
29
|
+
<g transform="matrix(1,0,0,1,374.543,268.081)">
|
30
|
+
<path d="M0,13.784C1.387,13.784 2.283,12.968 2.283,11.664C2.283,10.48 1.387,9.502 0,9.502L-3.629,9.502L-3.629,13.784L0,13.784ZM-0.775,4.404C0.611,4.404 1.591,3.466 1.591,2.12C1.591,0.856 0.611,-0.122 -0.775,-0.122L-3.629,-0.122L-3.629,4.404L-0.775,4.404ZM-9.583,-5.342L0.286,-5.342C4.363,-5.342 7.626,-2.324 7.626,1.508C7.626,3.792 6.687,5.22 4.975,6.524L4.975,6.606C7.504,8.4 8.563,10.114 8.563,12.642C8.563,16.026 5.873,19.126 1.224,19.126L-9.583,19.126L-9.583,-5.342Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
31
|
+
</g>
|
32
|
+
</g>
|
33
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
34
|
+
<g transform="matrix(1,0,0,1,404.955,276.605)">
|
35
|
+
<path d="M0,-3.264C1.345,-3.264 2.242,-4.65 2.242,-6.078C2.242,-7.504 1.182,-8.77 -0.165,-8.77L-4.813,-8.77L-4.813,-3.264L0,-3.264ZM-10.808,-13.866L-0.571,-13.866C4.688,-13.866 8.114,-10.686 8.114,-6.078C8.114,-1.796 5.954,0.61 2.323,1.508L8.931,10.602L1.427,10.602L-4.813,1.468L-4.813,10.602L-10.808,10.602L-10.808,-13.866Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
36
|
+
</g>
|
37
|
+
</g>
|
38
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
39
|
+
<g transform="matrix(1,0,0,1,0,76.979)">
|
40
|
+
<rect x="424.149" y="185.76" width="5.995" height="24.468" style="fill:rgb(30,40,38);"/>
|
41
|
+
</g>
|
42
|
+
</g>
|
43
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
44
|
+
<g transform="matrix(1,0,0,1,450.609,268.203)">
|
45
|
+
<path d="M0,13.54C3.834,13.54 6.77,10.848 6.77,6.728C6.77,2.936 4.201,-0.04 0,-0.04L-2.406,-0.04L-2.406,13.54L0,13.54ZM-8.401,-5.464L0.123,-5.464C7.341,-5.464 12.928,-0.164 12.928,6.728C12.928,13.254 7.953,19.004 0.123,19.004L-8.401,19.004L-8.401,-5.464Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
46
|
+
</g>
|
47
|
+
</g>
|
48
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
49
|
+
<g transform="matrix(1,0,0,1,485.832,288.024)">
|
50
|
+
<path d="M0,-26.101C4.527,-26.101 7.667,-24.429 10.236,-21.819L6.076,-17.985C4.404,-19.495 2.325,-20.433 0,-20.433C-4.364,-20.433 -7.177,-17.171 -7.177,-13.051C-7.177,-8.525 -3.956,-5.668 0.122,-5.668C4.404,-5.668 6.484,-8.035 6.646,-10.401L-0.326,-10.401L-0.326,-15.579L13.132,-15.579L13.132,-13.255C13.132,-6.037 8.89,0 0,0C-7.748,0 -13.254,-5.75 -13.254,-13.051C-13.254,-20.351 -7.748,-26.101 0,-26.101" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
51
|
+
</g>
|
52
|
+
</g>
|
53
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
54
|
+
<g transform="matrix(1,0,0,1,507.961,287.207)">
|
55
|
+
<path d="M0,-24.468L16.191,-24.468L16.191,-19.168L5.995,-19.168L5.995,-14.762L15.417,-14.762L15.417,-9.542L5.995,-9.542L5.995,-5.138L16.64,-5.138L16.64,0L0,0L0,-24.468Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
56
|
+
</g>
|
57
|
+
</g>
|
58
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
59
|
+
<g transform="matrix(1,0,0,1,539.963,281.907)">
|
60
|
+
<path d="M0,-13.868L-5.464,-13.868L-5.464,-19.168L11.583,-19.168L11.583,-13.868L6.036,-13.868L6.036,5.3L0,5.3L0,-13.868Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
61
|
+
</g>
|
62
|
+
</g>
|
63
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
64
|
+
<g transform="matrix(1,0,0,1,574.253,267.591)">
|
65
|
+
<path d="M0,14.765C4.322,14.765 7.095,11.5 7.095,7.383C7.095,3.263 4.322,0 0,0C-4.364,0 -7.096,3.263 -7.096,7.383C-7.096,11.5 -4.364,14.765 0,14.765M0,-5.668C7.707,-5.668 13.172,0.082 13.172,7.383C13.172,14.683 7.707,20.433 0,20.433C-7.749,20.433 -13.173,14.683 -13.173,7.383C-13.173,0.082 -7.749,-5.668 0,-5.668" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
66
|
+
</g>
|
67
|
+
</g>
|
68
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
69
|
+
<g transform="matrix(1,0,0,1,595.415,288.023)">
|
70
|
+
<path d="M0,-25.284L6.28,-25.284L11.216,-13.744L14.192,-21.41L15.683,-25.284L18.842,-25.284L20.489,-21.412L23.735,-13.784L28.221,-25.284L34.461,-25.284L24.266,0L23.449,0L17.413,-14.11L11.583,0L10.808,0L0,-25.284Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
71
|
+
</g>
|
72
|
+
</g>
|
73
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
74
|
+
<g transform="matrix(1,0,0,1,639.899,287.207)">
|
75
|
+
<path d="M0,-24.468L6.322,-24.468L15.825,-9.95L15.825,-24.468L21.779,-24.468L21.779,0L15.539,0L5.995,-14.558L5.995,0L0,0L0,-24.468Z" style="fill:rgb(30,40,38);fill-rule:nonzero;"/>
|
76
|
+
</g>
|
77
|
+
</g>
|
78
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
79
|
+
<g transform="matrix(1,0,0,1,724.324,209.37)">
|
80
|
+
<path d="M0,29.41C-72.335,-66.167 -179.131,-55.549 -222.588,25.781C-227.373,34.738 -221.818,40.631 -219.109,39.985C-214.298,38.838 -197.926,32.314 -192.966,30.318C-190.894,29.485 -189.207,25.502 -187.375,21.877C-150.071,-51.956 -100.392,-60.124 -29.16,95.577C-32.607,77.837 -25.455,57.889 -2.274,37.237C0.394,34.86 2.589,32.831 0,29.41" style="fill:rgb(58,109,98);fill-rule:nonzero;"/>
|
81
|
+
</g>
|
82
|
+
</g>
|
83
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
84
|
+
<g transform="matrix(0.249711,-0.96832,-0.96832,-0.249711,486.176,197.302)">
|
85
|
+
<path d="M-12.21,-30.272C-28.365,-22.83 -44.336,-18.635 -46.819,-29.09C-48.223,-18.969 -9.68,-0.335 -12.21,21.62C-12.329,22.654 -10.713,22.914 -10.274,21.97C-1.487,3.05 -6.95,-23.042 -12.21,-30.272" style="fill:rgb(58,109,98);fill-rule:nonzero;"/>
|
86
|
+
</g>
|
87
|
+
</g>
|
88
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
89
|
+
<g transform="matrix(1,0,0,1,810.402,309.68)">
|
90
|
+
<path d="M0,-88.196C1.54,-88.196 2.104,-85.899 0.603,-85.55C-30.253,-78.37 -43.813,-48.307 -44.559,-31.561C-44.807,-26.006 -49.573,-25.025 -55.084,-22.473C-61.232,-19.625 -90.024,-7.312 -100.946,-3.404C-106.293,-1.49 -114.206,0.003 -114.576,-8.251C-116.052,-41.137 -81.521,-88.199 0,-88.196" style="fill:rgb(58,109,98);fill-rule:nonzero;"/>
|
91
|
+
</g>
|
92
|
+
</g>
|
93
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
94
|
+
<g transform="matrix(-126.776,-126.776,-126.776,126.776,684.306,302.422)">
|
95
|
+
<path d="M0.982,0.451C0.969,0.497 0.927,0.51 0.915,0.489C0.908,0.475 0.904,0.461 0.922,0.407C1.064,-0.03 0.945,-0.409 -0,-0.064C0.038,-0.102 0.068,-0.161 0.081,-0.234C0.45,-0.351 0.717,-0.297 0.868,-0.146C1.006,-0.008 1.047,0.21 0.982,0.451Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
96
|
+
</g>
|
97
|
+
</g>
|
98
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
99
|
+
<g transform="matrix(0,-49.0052,-49.0052,0,756.207,273.884)">
|
100
|
+
<path d="M1,-0.813C0.989,-0.345 0.777,0.495 0.044,0.821C0.016,0.833 -0.014,0.798 0.007,0.775C0.271,0.479 0.447,0.027 0.429,-0.27C0.429,-0.28 0.427,-0.288 0.436,-0.292C0.61,-0.373 0.828,-0.554 0.969,-0.821C0.977,-0.837 1,-0.831 1,-0.814L1,-0.813Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
101
|
+
</g>
|
102
|
+
</g>
|
103
|
+
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
|
104
|
+
<g transform="matrix(30.5248,-8.50108,-8.50108,-30.5248,478.044,231.713)">
|
105
|
+
<path d="M0.489,-0.516C0.521,-0.344 0.815,-0.062 1.05,0.111C0.884,0.153 0.635,0.169 0.489,0.081C0.474,0.152 0.308,0.424 0.152,0.616C0.317,0.306 0.438,-0.424 0.489,-0.516Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
106
|
+
</g>
|
107
|
+
</g>
|
108
|
+
</g>
|
109
|
+
<defs>
|
110
|
+
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,0.100447)"><stop offset="0" style="stop-color:rgb(58,109,98);stop-opacity:1"/><stop offset="0.95" style="stop-color:rgb(44,73,73);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(44,73,73);stop-opacity:1"/></linearGradient>
|
111
|
+
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,-0.00347458)"><stop offset="0" style="stop-color:rgb(58,109,98);stop-opacity:1"/><stop offset="0.95" style="stop-color:rgb(44,73,73);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(44,73,73);stop-opacity:1"/></linearGradient>
|
112
|
+
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.268287,-0.963339,-0.963339,0.268287,0.634136,0.481664)"><stop offset="0" style="stop-color:rgb(58,109,98);stop-opacity:1"/><stop offset="0.95" style="stop-color:rgb(44,73,73);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(44,73,73);stop-opacity:1"/></linearGradient>
|
113
|
+
</defs>
|
114
|
+
</svg>
|
115
|
+
<h1>The server has booted successfully.</h1>
|
116
|
+
</header>
|
117
|
+
|
118
|
+
<main>
|
119
|
+
<p>However, it seems like the <code>index</code> file is missing from your source folder.</p>
|
120
|
+
|
121
|
+
<p>If you add a file like <code>index.erb</code> or <code>index.md</code> to your source folder,
|
122
|
+
you'll be able to see that instead of this generic message.</p>
|
123
|
+
|
124
|
+
<p>Still stuck? <a href="https://www.bridgetownrb.com/community">Our developer community may be able to lend you a hand</a>. Good luck!</p>
|
125
|
+
</main>
|
126
|
+
</body>
|
127
|
+
</html>
|
data/lib/roda/plugins/ssg.rb
CHANGED
@@ -5,7 +5,7 @@ require "rack/files"
|
|
5
5
|
|
6
6
|
class Roda
|
7
7
|
module RodaPlugins
|
8
|
-
# This is a
|
8
|
+
# This is a simplified and modified variant of Roda's Public core plugin. It adds additional
|
9
9
|
# functionality so that you can host an entire static site through Roda. What's necessary for
|
10
10
|
# this to work is handling "pretty" URLs, aka:
|
11
11
|
#
|
@@ -29,6 +29,7 @@ class Roda
|
|
29
29
|
path = PARSER.unescape(real_remaining_path)
|
30
30
|
return if path.include?("\0")
|
31
31
|
|
32
|
+
# @type [Rack::Files]
|
32
33
|
server = roda_class.opts[:ssg_server]
|
33
34
|
path = File.join(server.root, *segments_for_path(path))
|
34
35
|
|
@@ -40,7 +41,7 @@ class Roda
|
|
40
41
|
halt [status, response_headers, body]
|
41
42
|
end
|
42
43
|
|
43
|
-
# TODO: this could be refactored a bit
|
44
|
+
# TODO: this could be refactored a bit for clarity
|
44
45
|
def segments_for_path(path) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
45
46
|
segments = []
|
46
47
|
|
@@ -68,6 +68,8 @@ Bridgetown.configure do |config|
|
|
68
68
|
#
|
69
69
|
# init :ssr
|
70
70
|
#
|
71
|
+
# Add `sessions: true` if you need to use session data, flash, etc.
|
72
|
+
#
|
71
73
|
|
72
74
|
# Uncomment to use file-based dynamic template routing via Roda (make sure you
|
73
75
|
# uncomment the gem dependency in your `Gemfile` as well):
|