bridgetown-core 1.0.0 → 1.1.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -1
- data/lib/bridgetown-core/collection.rb +37 -20
- data/lib/bridgetown-core/commands/concerns/actions.rb +3 -2
- data/lib/bridgetown-core/commands/configure.rb +1 -1
- data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +95 -12
- data/lib/bridgetown-core/commands/new.rb +10 -9
- data/lib/bridgetown-core/commands/plugins.rb +2 -0
- data/lib/bridgetown-core/commands/start.rb +3 -0
- data/lib/bridgetown-core/commands/webpack/update.rb +2 -2
- data/lib/bridgetown-core/commands/webpack/webpack.defaults.js.erb +11 -2
- data/lib/bridgetown-core/component.rb +13 -7
- data/lib/bridgetown-core/concerns/localizable.rb +20 -0
- data/lib/bridgetown-core/concerns/prioritizable.rb +44 -0
- data/lib/bridgetown-core/concerns/publishable.rb +11 -1
- data/lib/bridgetown-core/concerns/site/configurable.rb +2 -10
- data/lib/bridgetown-core/concerns/site/localizable.rb +5 -1
- data/lib/bridgetown-core/concerns/site/ssr.rb +3 -3
- data/lib/bridgetown-core/concerns/site/writable.rb +28 -0
- data/lib/bridgetown-core/configuration.rb +2 -0
- data/lib/bridgetown-core/configurations/bt-postcss/postcss.config.js +5 -3
- data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -1
- data/lib/bridgetown-core/configurations/lit/esbuild-plugins.js +21 -0
- data/lib/bridgetown-core/configurations/lit/happy-days.lit.js +26 -0
- data/lib/bridgetown-core/configurations/lit/lit-components-entry.js +1 -0
- data/lib/bridgetown-core/configurations/lit/lit-ssr.config.js +6 -0
- data/lib/bridgetown-core/configurations/lit.rb +95 -0
- data/lib/bridgetown-core/configurations/open-props/variables.css.erb +11 -0
- data/lib/bridgetown-core/configurations/open-props.rb +21 -0
- data/lib/bridgetown-core/configurations/ruby2js/hello_world.js.rb +9 -0
- data/lib/bridgetown-core/configurations/ruby2js.rb +67 -0
- data/lib/bridgetown-core/configurations/shoelace.rb +50 -0
- data/lib/bridgetown-core/configurations/tailwindcss.rb +16 -2
- data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
- data/lib/bridgetown-core/drops/generated_page_drop.rb +2 -1
- data/lib/bridgetown-core/drops/resource_drop.rb +2 -1
- data/lib/bridgetown-core/errors.rb +5 -5
- data/lib/bridgetown-core/filters/translation_filters.rb +11 -0
- data/lib/bridgetown-core/filters/url_filters.rb +37 -10
- data/lib/bridgetown-core/filters.rb +3 -0
- data/lib/bridgetown-core/frontmatter_defaults.rb +14 -8
- data/lib/bridgetown-core/generated_page.rb +1 -0
- data/lib/bridgetown-core/kramdown/parser/gfm.rb +36 -0
- data/lib/bridgetown-core/model/base.rb +1 -2
- data/lib/bridgetown-core/plugin.rb +6 -37
- data/lib/bridgetown-core/plugin_manager.rb +3 -2
- data/lib/bridgetown-core/rack/boot.rb +5 -0
- data/lib/bridgetown-core/rack/logger.rb +14 -4
- data/lib/bridgetown-core/rack/roda.rb +102 -8
- data/lib/bridgetown-core/rack/routes.rb +67 -2
- data/lib/bridgetown-core/resource/base.rb +4 -6
- data/lib/bridgetown-core/resource/destination.rb +18 -0
- data/lib/bridgetown-core/resource/permalink_processor.rb +6 -4
- data/lib/bridgetown-core/resource/relations.rb +1 -1
- data/lib/bridgetown-core/utils/aux.rb +2 -1
- data/lib/bridgetown-core/utils/require_gems.rb +3 -6
- data/lib/bridgetown-core/utils.rb +24 -11
- data/lib/bridgetown-core/version.rb +2 -2
- data/lib/bridgetown-core/watcher.rb +19 -6
- data/lib/bridgetown-core.rb +8 -2
- data/lib/site_template/README.md +2 -2
- data/lib/site_template/bridgetown.config.yml +3 -0
- data/lib/site_template/frontend/javascript/index.js.erb +1 -0
- data/lib/site_template/frontend/styles/syntax-highlighting.css +77 -0
- data/lib/site_template/package.json.erb +18 -17
- data/lib/site_template/server/roda_app.rb +3 -6
- data/lib/site_template/src/404.html +2 -1
- data/lib/site_template/src/500.html +10 -0
- metadata +20 -5
- data/lib/bridgetown-core/publisher.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95b4ce1888886fbccd72391216d1298ce7d20e6bfb506ceedab3208881b4d25c
|
4
|
+
data.tar.gz: 712ddfbba10913becc4fb800a499ce602d9e2848f395b87cf8c205d97000ab2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1efd58dbca74ae1f3903bd91e225c28abb74131a5b1bc1885b7cac696d5f97a6a1ee7b973fed4d9ad2a90fec9ccc610f4ab19c4cb60666bfeafc0f4cda28f715
|
7
|
+
data.tar.gz: 545fe04a5338166bf02927395c131d65a822b524b551865bc558dd1e4ffa4c1438ace43bad4fe09a29e980c77d458bcc9876a249bbf4598d45764f471693521b
|
data/.rubocop.yml
CHANGED
@@ -11,12 +11,17 @@ AllCops:
|
|
11
11
|
- vendor/**/*
|
12
12
|
- tmp/**/*
|
13
13
|
- test/source/**/*
|
14
|
-
- test/resources/src
|
14
|
+
- test/resources/src/**/*.rb
|
15
|
+
- lib/bridgetown-core/commands/base.rb
|
16
|
+
- lib/bridgetown-core/commands/plugins.rb
|
17
|
+
- lib/bridgetown-core/configurations/ruby2js/**/*
|
18
|
+
- lib/bridgetown-core/rack/roda.rb
|
15
19
|
- lib/site_template/TEMPLATES/**/*
|
16
20
|
- lib/site_template/Rakefile
|
17
21
|
- lib/site_template/config.ru
|
18
22
|
- lib/site_template/config/**/*
|
19
23
|
- lib/site_template/plugins/site_builder.rb
|
24
|
+
- lib/site_template/server/roda_app.rb
|
20
25
|
|
21
26
|
Lint/ConstantDefinitionInBlock:
|
22
27
|
Exclude:
|
@@ -20,11 +20,11 @@ module Bridgetown
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def builtin?
|
23
|
-
label.in?
|
23
|
+
@is_builtin ||= label.in?(%w(posts pages data).freeze)
|
24
24
|
end
|
25
25
|
|
26
26
|
def data?
|
27
|
-
label == "data"
|
27
|
+
@is_data ||= label == "data"
|
28
28
|
end
|
29
29
|
|
30
30
|
# Fetch the Resources in this collection.
|
@@ -215,7 +215,7 @@ module Bridgetown
|
|
215
215
|
# Used by Resource's permalink processor
|
216
216
|
# @return [String]
|
217
217
|
def default_permalink
|
218
|
-
metadata.fetch("permalink", "/:collection/:path/")
|
218
|
+
metadata.fetch("permalink", "/:locale/:collection/:path/")
|
219
219
|
end
|
220
220
|
|
221
221
|
# Extract options for this collection from the site configuration.
|
@@ -270,32 +270,29 @@ module Bridgetown
|
|
270
270
|
|
271
271
|
# Read in resource from repo path
|
272
272
|
# @param full_path [String]
|
273
|
-
def read_resource(full_path, manifest: nil)
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
manifest ? Pathname(manifest.content) : Pathname(site.source)
|
280
|
-
).to_s
|
281
|
-
).gsub("#", "%23")
|
282
|
-
model = Bridgetown::Model::Base.find(id)
|
283
|
-
|
284
|
-
if model.attributes.key?(:locale) && model.locale.to_sym == :multi
|
273
|
+
def read_resource(full_path, manifest: nil)
|
274
|
+
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))
|
277
|
+
|
278
|
+
if model_is_multi_locale?(model, model_relative_path)
|
285
279
|
site.config.available_locales.each do |locale|
|
286
280
|
model.locale = locale
|
287
|
-
|
281
|
+
add_resource_from_model model
|
288
282
|
end
|
289
283
|
return
|
290
284
|
end
|
291
285
|
|
292
|
-
|
286
|
+
add_resource_from_model model
|
293
287
|
end
|
294
288
|
|
295
|
-
|
296
|
-
|
297
|
-
|
289
|
+
# @param model [Bridgetown::Model::Base]
|
290
|
+
def add_resource_from_model(model)
|
291
|
+
model.to_resource.read!.tap do |resource|
|
292
|
+
resources << resource if resource.publishable?
|
293
|
+
end
|
298
294
|
end
|
295
|
+
alias_method :add_model_resource, :add_resource_from_model
|
299
296
|
|
300
297
|
def sort_resources!
|
301
298
|
if metadata["sort_by"].is_a?(String)
|
@@ -365,5 +362,25 @@ module Bridgetown
|
|
365
362
|
self
|
366
363
|
)
|
367
364
|
end
|
365
|
+
|
366
|
+
def relative_model_path_for(full_path, manifest: nil)
|
367
|
+
Pathname(full_path).relative_path_from(
|
368
|
+
manifest ? Pathname(manifest.content) : Pathname(site.source)
|
369
|
+
).to_s
|
370
|
+
end
|
371
|
+
|
372
|
+
def model_id_from_relative_path(model_relative_path, manifest: nil)
|
373
|
+
scheme = manifest ? "plugin" : "repo"
|
374
|
+
id = +"#{scheme}://#{label}.collection/"
|
375
|
+
id += "#{manifest.origin}/" if manifest
|
376
|
+
id += Addressable::URI.escape(model_relative_path).gsub("#", "%23")
|
377
|
+
id
|
378
|
+
end
|
379
|
+
|
380
|
+
def model_is_multi_locale?(model, model_relative_path)
|
381
|
+
(model.attributes.key?(:locale) && model.locale.to_sym == :multi) ||
|
382
|
+
File.extname(File.basename(model_relative_path, ".*")) == ".multi" ||
|
383
|
+
site.frontmatter_defaults.all(model_relative_path, label.to_sym)["locale"].to_s == "multi"
|
384
|
+
end
|
368
385
|
end
|
369
386
|
end
|
@@ -54,7 +54,8 @@ module Bridgetown
|
|
54
54
|
|
55
55
|
def add_bridgetown_plugin(gemname, version: nil)
|
56
56
|
version = " -v \"#{version}\"" if version
|
57
|
-
run "bundle add #{gemname}#{version} -g bridgetown_plugins"
|
57
|
+
run "bundle add #{gemname}#{version} -g bridgetown_plugins",
|
58
|
+
env: { "BUNDLE_GEMFILE" => File.join(destination_root, "Gemfile") }
|
58
59
|
rescue SystemExit
|
59
60
|
say_status :run, "Gem not added due to bundler error", :red
|
60
61
|
end
|
@@ -79,7 +80,7 @@ module Bridgetown
|
|
79
80
|
|
80
81
|
def determine_remote_filename(arg)
|
81
82
|
if arg.end_with?(".rb")
|
82
|
-
arg.split("/").
|
83
|
+
arg.split("/").then do |segments|
|
83
84
|
arg.sub!(%r!/#{segments.last}$!, "")
|
84
85
|
segments.last
|
85
86
|
end
|
@@ -11,11 +11,33 @@
|
|
11
11
|
const path = require("path")
|
12
12
|
const fsLib = require("fs")
|
13
13
|
const fs = fsLib.promises
|
14
|
+
const { pathToFileURL, fileURLToPath } = require("url")
|
14
15
|
const glob = require("glob")
|
15
16
|
const postcss = require("postcss")
|
16
17
|
const postCssImport = require("postcss-import")
|
17
18
|
const readCache = require("read-cache")
|
18
19
|
|
20
|
+
// Detect if an NPM package is available
|
21
|
+
const moduleAvailable = name => {
|
22
|
+
try {
|
23
|
+
require.resolve(name)
|
24
|
+
return true
|
25
|
+
} catch (e) { }
|
26
|
+
return false
|
27
|
+
}
|
28
|
+
|
29
|
+
// Generate a Source Map URL (used by the Sass plugin)
|
30
|
+
const generateSourceMappingURL = sourceMap => {
|
31
|
+
const data = Buffer.from(JSON.stringify(sourceMap), "utf-8").toString("base64")
|
32
|
+
return `/*# sourceMappingURL=data:application/json;charset=utf-8;base64,${data} */`
|
33
|
+
}
|
34
|
+
|
35
|
+
// Import Sass if available
|
36
|
+
let sass
|
37
|
+
if (moduleAvailable("sass")) {
|
38
|
+
sass = require("sass")
|
39
|
+
}
|
40
|
+
|
19
41
|
// Glob plugin derived from:
|
20
42
|
// https://github.com/thomaschaaf/esbuild-plugin-import-glob
|
21
43
|
// https://github.com/xiaohui-zhangxh/jsbundling-rails/commit/b15025dcc20f664b2b0eb238915991afdbc7cb58
|
@@ -61,24 +83,23 @@ const importGlobPlugin = () => ({
|
|
61
83
|
},
|
62
84
|
})
|
63
85
|
|
64
|
-
|
86
|
+
// Plugin for PostCSS
|
87
|
+
const postCssPlugin = (options, configuration) => ({
|
65
88
|
name: "postcss",
|
66
89
|
async setup(build) {
|
67
90
|
// Process .css files with PostCSS
|
68
|
-
build.onLoad({ filter: /\.
|
91
|
+
build.onLoad({ filter: (configuration.filter || /\.css$/) }, async (args) => {
|
69
92
|
const additionalFilePaths = []
|
70
93
|
const css = await fs.readFile(args.path, "utf8")
|
71
94
|
|
72
95
|
// Configure import plugin so PostCSS can properly resolve `@import`ed CSS files
|
73
96
|
const importPlugin = postCssImport({
|
74
|
-
filter: itemPath =>
|
75
|
-
// We'll want to track any imports later when in watch mode
|
76
|
-
additionalFilePaths.push(path.resolve(path.dirname(args.path), itemPath))
|
77
|
-
return true
|
78
|
-
},
|
97
|
+
filter: itemPath => !itemPath.startsWith("/"), // ensure it doesn't try to import source-relative paths
|
79
98
|
load: async filename => {
|
80
99
|
let contents = await readCache(filename, "utf-8")
|
81
100
|
const filedir = path.dirname(filename)
|
101
|
+
// We'll want to track any imports later when in watch mode:
|
102
|
+
additionalFilePaths.push(filename)
|
82
103
|
|
83
104
|
// We need to transform `url(...)` in imported CSS so the filepaths are properly
|
84
105
|
// relative to the entrypoint. Seems icky to have to hack this! C'est la vie...
|
@@ -106,6 +127,65 @@ const postCssPlugin = (options) => ({
|
|
106
127
|
},
|
107
128
|
})
|
108
129
|
|
130
|
+
// Plugin for Sass
|
131
|
+
const sassPlugin = (options) => ({
|
132
|
+
name: "sass",
|
133
|
+
async setup(build) {
|
134
|
+
// Process .scss and .sass files with Sass
|
135
|
+
build.onLoad({ filter: /\.(sass|scss)$/ }, async (args) => {
|
136
|
+
if (!sass) {
|
137
|
+
console.error("error: Sass is not installed. Try running `yarn add sass` and then building again.")
|
138
|
+
return
|
139
|
+
}
|
140
|
+
|
141
|
+
const modulesFolder = pathToFileURL("node_modules/")
|
142
|
+
|
143
|
+
const localOptions = {
|
144
|
+
importers: [{
|
145
|
+
// An importer that redirects relative URLs starting with "~" to
|
146
|
+
// `node_modules`.
|
147
|
+
findFileUrl(url) {
|
148
|
+
if (!url.startsWith('~')) return null
|
149
|
+
return new URL(url.substring(1), modulesFolder)
|
150
|
+
}
|
151
|
+
}],
|
152
|
+
sourceMap: true,
|
153
|
+
...options
|
154
|
+
}
|
155
|
+
const result = sass.compile(args.path, localOptions)
|
156
|
+
|
157
|
+
const watchPaths = result.loadedUrls
|
158
|
+
.filter((x) => x.protocol === "file:" && !x.pathname.startsWith(modulesFolder.pathname))
|
159
|
+
.map((x) => x.pathname)
|
160
|
+
|
161
|
+
let cssOutput = result.css.toString()
|
162
|
+
|
163
|
+
if (result.sourceMap) {
|
164
|
+
const basedir = process.cwd()
|
165
|
+
const sourceMap = result.sourceMap
|
166
|
+
|
167
|
+
const promises = sourceMap.sources.map(async source => {
|
168
|
+
const sourceFile = await fs.readFile(fileURLToPath(source), "utf8")
|
169
|
+
return sourceFile
|
170
|
+
})
|
171
|
+
sourceMap.sourcesContent = await Promise.all(promises)
|
172
|
+
|
173
|
+
sourceMap.sources = sourceMap.sources.map(source => {
|
174
|
+
return path.relative(basedir, fileURLToPath(source))
|
175
|
+
})
|
176
|
+
|
177
|
+
cssOutput += '\n' + generateSourceMappingURL(sourceMap)
|
178
|
+
}
|
179
|
+
|
180
|
+
return {
|
181
|
+
contents: cssOutput,
|
182
|
+
loader: "css",
|
183
|
+
watchFiles: [args.path, ...watchPaths],
|
184
|
+
}
|
185
|
+
})
|
186
|
+
},
|
187
|
+
})
|
188
|
+
|
109
189
|
// Set up defaults and generate frontend bundling manifest file
|
110
190
|
const bridgetownPreset = (outputFolder) => ({
|
111
191
|
name: "bridgetownPreset",
|
@@ -151,9 +231,9 @@ const bridgetownPreset = (outputFolder) => ({
|
|
151
231
|
// We have an entrypoint!
|
152
232
|
manifest[stripPrefix(value.entryPoint)] = outputPath
|
153
233
|
entrypoints.push([outputPath, fileSize(key)])
|
154
|
-
} else if (key.match(/index(\.js)?\.[^-.]*\.css/) && inputs.find(item => item.
|
234
|
+
} else if (key.match(/index(\.js)?\.[^-.]*\.css/) && inputs.find(item => item.match(/\.(s?css|sass)$/))) {
|
155
235
|
// Special treatment for index.css
|
156
|
-
manifest[stripPrefix(inputs.find(item => item.
|
236
|
+
manifest[stripPrefix(inputs.find(item => item.match(/\.(s?css|sass)$/)))] = outputPath
|
157
237
|
entrypoints.push([outputPath, fileSize(key)])
|
158
238
|
} else if (inputs.length > 0) {
|
159
239
|
// Naive implementation, we'll just grab the first input and hope it's accurate
|
@@ -182,9 +262,12 @@ const postCssConfig = postcssrc.sync()
|
|
182
262
|
module.exports = (outputFolder, esbuildOptions) => {
|
183
263
|
esbuildOptions.plugins = esbuildOptions.plugins || []
|
184
264
|
// Add the PostCSS & glob plugins to the top of the plugin stack
|
185
|
-
esbuildOptions.plugins.unshift(postCssPlugin(postCssConfig))
|
265
|
+
esbuildOptions.plugins.unshift(postCssPlugin(postCssConfig, esbuildOptions.postCssPluginConfig || {}))
|
266
|
+
if (esbuildOptions.postCssPluginConfig) delete esbuildOptions.postCssPluginConfig
|
186
267
|
esbuildOptions.plugins.unshift(importGlobPlugin())
|
187
|
-
// Add the
|
268
|
+
// Add the Sass plugin
|
269
|
+
esbuildOptions.plugins.push(sassPlugin(esbuildOptions.sassOptions || {}))
|
270
|
+
// Add the Bridgetown preset
|
188
271
|
esbuildOptions.plugins.push(bridgetownPreset(outputFolder))
|
189
272
|
|
190
273
|
// esbuild, take it away!
|
@@ -200,7 +283,7 @@ module.exports = (outputFolder, esbuildOptions) => {
|
|
200
283
|
".ttf": "file",
|
201
284
|
".eot": "file",
|
202
285
|
},
|
203
|
-
resolveExtensions: [".tsx",".ts",".jsx",".js",".css",".json",".js.rb"],
|
286
|
+
resolveExtensions: [".tsx", ".ts", ".jsx", ".js", ".css", ".scss", ".sass", ".json", ".js.rb"],
|
204
287
|
nodePaths: ["frontend/javascript", "frontend/styles"],
|
205
288
|
watch: process.argv.includes("--watch"),
|
206
289
|
minify: process.argv.includes("--minify"),
|
@@ -43,7 +43,7 @@ module Bridgetown
|
|
43
43
|
desc: "Skip 'yarn install'"
|
44
44
|
class_option :"use-sass",
|
45
45
|
type: :boolean,
|
46
|
-
desc: "
|
46
|
+
desc: "Set up a Sass configuration for your stylesheet"
|
47
47
|
|
48
48
|
DOCSURL = "https://bridgetownrb.com/docs"
|
49
49
|
|
@@ -62,11 +62,6 @@ module Bridgetown
|
|
62
62
|
def new_site
|
63
63
|
raise ArgumentError, "You must specify a path." if args.empty?
|
64
64
|
|
65
|
-
if frontend_bundling_option != "webpack" && options["use-sass"]
|
66
|
-
raise ArgumentError,
|
67
|
-
"To install Sass, you must choose Webpack (-e webpack) as your frontend bundler"
|
68
|
-
end
|
69
|
-
|
70
65
|
new_site_path = File.expand_path(args.join(" "), Dir.pwd)
|
71
66
|
@site_name = new_site_path.split(File::SEPARATOR).last
|
72
67
|
|
@@ -98,7 +93,11 @@ module Bridgetown
|
|
98
93
|
end
|
99
94
|
|
100
95
|
def postcss_option
|
101
|
-
!
|
96
|
+
!options["use-sass"]
|
97
|
+
end
|
98
|
+
|
99
|
+
def disable_postcss?
|
100
|
+
options["use-sass"] && options["frontend-bundling"] == "webpack"
|
102
101
|
end
|
103
102
|
|
104
103
|
def create_site(new_site_path)
|
@@ -116,6 +115,7 @@ module Bridgetown
|
|
116
115
|
template("frontend/javascript/index.js.erb", "frontend/javascript/index.js")
|
117
116
|
template("src/index.md.erb", "src/index.md")
|
118
117
|
template("src/posts.md.erb", "src/posts.md")
|
118
|
+
copy_file("frontend/styles/syntax-highlighting.css")
|
119
119
|
|
120
120
|
case options["templates"]
|
121
121
|
when "erb"
|
@@ -126,11 +126,11 @@ module Bridgetown
|
|
126
126
|
setup_liquid_templates
|
127
127
|
end
|
128
128
|
|
129
|
+
postcss_option ? configure_postcss : configure_sass
|
130
|
+
|
129
131
|
if frontend_bundling_option == "esbuild"
|
130
|
-
configure_postcss
|
131
132
|
invoke(Esbuild, ["setup"], {})
|
132
133
|
else
|
133
|
-
postcss_option ? configure_postcss : configure_sass
|
134
134
|
invoke(Webpack, ["setup"], {})
|
135
135
|
end
|
136
136
|
end
|
@@ -165,6 +165,7 @@ module Bridgetown
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def configure_sass
|
168
|
+
template("postcss.config.js.erb", "postcss.config.js") unless disable_postcss?
|
168
169
|
copy_file("frontend/styles/index.css", "frontend/styles/index.scss")
|
169
170
|
end
|
170
171
|
|
@@ -120,6 +120,7 @@ module Bridgetown
|
|
120
120
|
" return to your site root.")
|
121
121
|
puts
|
122
122
|
|
123
|
+
# rubocop: disable Style/RedundantCondition
|
123
124
|
Dir.chdir dir do
|
124
125
|
ENV["BRIDGETOWN_SITE"] = site.root_dir
|
125
126
|
if ENV["SHELL"]
|
@@ -128,6 +129,7 @@ module Bridgetown
|
|
128
129
|
system("/bin/sh")
|
129
130
|
end
|
130
131
|
end
|
132
|
+
# rubocop: enable Style/RedundantCondition
|
131
133
|
|
132
134
|
puts
|
133
135
|
Bridgetown.logger.info("Done!", "You're back in #{Dir.pwd.green}")
|
@@ -7,11 +7,11 @@ say "🎉 Webpack configuration updated successfully!"
|
|
7
7
|
|
8
8
|
return if Bridgetown.environment.test?
|
9
9
|
|
10
|
-
required_packages = %w(esbuild esbuild-loader webpack@5.
|
10
|
+
required_packages = %w(esbuild esbuild-loader css-loader@6.7.1 webpack@5.72.0 webpack-cli@4.9.2 webpack-manifest-plugin@5.0.0)
|
11
11
|
redundant_packages = %w(@babel/core @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators @babel/plugin-transform-runtime @babel/preset-env babel-loader)
|
12
12
|
|
13
13
|
say "Installing required packages"
|
14
|
-
run "yarn add -D #{required_packages.join(" ")}"
|
14
|
+
run "yarn add -D --tilde #{required_packages.join(" ")}"
|
15
15
|
|
16
16
|
packages_to_remove = package_json["devDependencies"].slice(*redundant_packages).keys
|
17
17
|
unless packages_to_remove.empty?
|
@@ -41,7 +41,9 @@ const cssRules = {
|
|
41
41
|
{
|
42
42
|
loader: "css-loader",
|
43
43
|
options: {
|
44
|
-
url:
|
44
|
+
url: {
|
45
|
+
filter: url => !url.startsWith('/')
|
46
|
+
},
|
45
47
|
importLoaders: 1
|
46
48
|
}
|
47
49
|
}
|
@@ -49,7 +51,14 @@ const cssRules = {
|
|
49
51
|
mode: '<%= self.config.uses_postcss? ? "postcss" : "sass" %>',
|
50
52
|
|
51
53
|
postcss: () => {
|
52
|
-
cssRules.use.push(
|
54
|
+
cssRules.use.push({
|
55
|
+
loader: "postcss-loader",
|
56
|
+
options: {
|
57
|
+
postcssOptions: {
|
58
|
+
config: "postcss.config.js"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
})
|
53
62
|
return { test: cssRules.test, use: cssRules.use }
|
54
63
|
},
|
55
64
|
|
@@ -4,7 +4,7 @@ module Bridgetown
|
|
4
4
|
class Component
|
5
5
|
extend Forwardable
|
6
6
|
|
7
|
-
def_delegators :@view_context, :
|
7
|
+
def_delegators :@view_context, :liquid_render, :partial
|
8
8
|
|
9
9
|
# @return [Bridgetown::Site]
|
10
10
|
attr_reader :site # will be nil unless you explicitly set a `@site` ivar
|
@@ -32,14 +32,12 @@ module Bridgetown
|
|
32
32
|
def renderer_for_ext(ext, &block)
|
33
33
|
@_tmpl ||= case ext.to_s
|
34
34
|
when "erb"
|
35
|
-
include ERBCapture
|
36
35
|
Tilt::ErubiTemplate.new(component_template_path,
|
37
36
|
outvar: "@_erbout",
|
38
37
|
bufval: "Bridgetown::OutputBuffer.new",
|
39
38
|
engine_class: Bridgetown::ERBEngine,
|
40
39
|
&block)
|
41
|
-
when "serb"
|
42
|
-
include Serbea::Helpers
|
40
|
+
when "serb"
|
43
41
|
Tilt::SerbeaTemplate.new(component_template_path, &block)
|
44
42
|
when "slim" # requires bridgetown-slim
|
45
43
|
Slim::Template.new(component_template_path, &block)
|
@@ -166,12 +164,20 @@ module Bridgetown
|
|
166
164
|
def _renderer
|
167
165
|
@_renderer ||= begin
|
168
166
|
ext = File.extname(self.class.component_template_path).delete_prefix(".")
|
169
|
-
self.class.renderer_for_ext(ext) { self.class.component_template_content }
|
167
|
+
self.class.renderer_for_ext(ext) { self.class.component_template_content }.tap do |rn|
|
168
|
+
self.class.include(rn.is_a?(Tilt::SerbeaTemplate) ? Serbea::Helpers : ERBCapture)
|
169
|
+
end
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
173
|
+
def helpers
|
174
|
+
@helpers ||= Bridgetown::RubyTemplateView::Helpers.new(
|
175
|
+
self, view_context&.site || Bridgetown::Current.site
|
176
|
+
)
|
177
|
+
end
|
178
|
+
|
173
179
|
def method_missing(method, *args, **kwargs, &block)
|
174
|
-
if
|
180
|
+
if helpers.respond_to?(method.to_sym)
|
175
181
|
helpers.send method.to_sym, *args, **kwargs, &block
|
176
182
|
else
|
177
183
|
super
|
@@ -179,7 +185,7 @@ module Bridgetown
|
|
179
185
|
end
|
180
186
|
|
181
187
|
def respond_to_missing?(method, include_private = false)
|
182
|
-
|
188
|
+
helpers.respond_to?(method.to_sym, include_private) || super
|
183
189
|
end
|
184
190
|
end
|
185
191
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bridgetown
|
4
|
+
module Localizable
|
5
|
+
def all_locales
|
6
|
+
result_set = case self
|
7
|
+
when Bridgetown::Resource::Base
|
8
|
+
collection.resources
|
9
|
+
when Bridgetown::GeneratedPage
|
10
|
+
site.generated_pages
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
|
15
|
+
result_set.select { |item| item.data.slug == data.slug }.sort_by do |item|
|
16
|
+
site.config.available_locales.index item.data.locale
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bridgetown
|
4
|
+
module Prioritizable
|
5
|
+
module ClassMethods
|
6
|
+
# @!method priorities
|
7
|
+
# @return [Hash<Symbol, Object>]
|
8
|
+
|
9
|
+
# Get or set the priority of this class. When called without an
|
10
|
+
# argument it returns the priority. When an argument is given, it will
|
11
|
+
# set the priority.
|
12
|
+
#
|
13
|
+
# @param priority [Symbol] new priority (optional)
|
14
|
+
# Valid options are: `:lowest`, `:low`, `:normal`, `:high`, `:highest`
|
15
|
+
# @return [Symbol]
|
16
|
+
def priority(priority = nil)
|
17
|
+
@priority ||= nil
|
18
|
+
@priority = priority if priority && priorities.key?(priority)
|
19
|
+
@priority || :normal
|
20
|
+
end
|
21
|
+
|
22
|
+
# Spaceship is priority [higher -> lower]
|
23
|
+
#
|
24
|
+
# @param other [Class] The class to be compared.
|
25
|
+
# @return [Integer] -1, 0, 1.
|
26
|
+
def <=>(other)
|
27
|
+
priorities[other.priority] <=> priorities[priority]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.included(klass)
|
32
|
+
klass.extend ClassMethods
|
33
|
+
klass.class_attribute :priorities, instance_accessor: false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Spaceship is priority [higher -> lower]
|
37
|
+
#
|
38
|
+
# @param other [object] The object to be compared.
|
39
|
+
# @return [Integer] -1, 0, 1.
|
40
|
+
def <=>(other)
|
41
|
+
self.class <=> other.class
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -2,9 +2,19 @@
|
|
2
2
|
|
3
3
|
module Bridgetown
|
4
4
|
module Publishable
|
5
|
-
# Whether the
|
5
|
+
# Whether the resource is published or not, as indicated in YAML front-matter
|
6
6
|
def published?
|
7
7
|
!(data.key?("published") && data["published"] == false)
|
8
8
|
end
|
9
|
+
|
10
|
+
def publishable?
|
11
|
+
return true if collection.data?
|
12
|
+
return false unless published? || @site.config.unpublished
|
13
|
+
|
14
|
+
future_allowed = collection.metadata.future || @site.config.future
|
15
|
+
this_time = date.is_a?(Date) ? date.to_time.to_i : date.to_i
|
16
|
+
|
17
|
+
future_allowed || this_time <= @site.time.to_i
|
18
|
+
end
|
9
19
|
end
|
10
20
|
end
|
@@ -38,7 +38,7 @@ class Bridgetown::Site
|
|
38
38
|
# @param strip_slash_only [Boolean] set to true if you wish "/" to be returned as ""
|
39
39
|
# @return [String]
|
40
40
|
def base_path(strip_slash_only: false)
|
41
|
-
(config[:base_path] || config[:baseurl]).
|
41
|
+
(config[:base_path] || config[:baseurl]).then do |path|
|
42
42
|
strip_slash_only ? path.to_s.sub(%r{^/$}, "") : path
|
43
43
|
end
|
44
44
|
end
|
@@ -61,14 +61,6 @@ class Bridgetown::Site
|
|
61
61
|
@frontmatter_defaults ||= Bridgetown::FrontmatterDefaults.new(self)
|
62
62
|
end
|
63
63
|
|
64
|
-
# Returns the current instance of {Publisher} or creates a new instance of
|
65
|
-
# {Publisher} if one doesn't exist.
|
66
|
-
#
|
67
|
-
# @return [Publisher] Returns an instance of {Publisher}
|
68
|
-
def publisher
|
69
|
-
@publisher ||= Bridgetown::Publisher.new(self)
|
70
|
-
end
|
71
|
-
|
72
64
|
# Prefix a path or paths with the {#root_dir} directory.
|
73
65
|
#
|
74
66
|
# @see Bridgetown.sanitized_path
|
@@ -166,7 +158,7 @@ class Bridgetown::Site
|
|
166
158
|
plugin_components_load_paths = Bridgetown::PluginManager.source_manifests
|
167
159
|
.filter_map(&:components)
|
168
160
|
|
169
|
-
local_components_load_paths = config["components_dir"].
|
161
|
+
local_components_load_paths = config["components_dir"].then do |dir|
|
170
162
|
dir.is_a?(Array) ? dir : [dir]
|
171
163
|
end
|
172
164
|
local_components_load_paths.map! do |dir|
|
@@ -7,11 +7,15 @@ class Bridgetown::Site
|
|
7
7
|
def locale
|
8
8
|
@locale ||= begin
|
9
9
|
locale = ENV.fetch("BRIDGETOWN_LOCALE", config[:default_locale]).to_sym
|
10
|
-
Dir["#{in_source_dir("_locales")}/*.yml"].each do |locale_path|
|
10
|
+
Dir["#{in_source_dir("_locales")}/*.{json,rb,yml}"].each do |locale_path|
|
11
11
|
I18n.load_path << locale_path
|
12
12
|
end
|
13
13
|
I18n.available_locales = config[:available_locales]
|
14
14
|
I18n.default_locale = locale
|
15
|
+
I18n.fallbacks = (config[:available_locales] + [:en]).uniq.to_h do |available_locale|
|
16
|
+
[available_locale, [available_locale, locale, :en].uniq]
|
17
|
+
end
|
18
|
+
locale
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|