bridgetown-core 1.3.0.beta1 → 1.3.0.beta2
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/lib/bridgetown-core/commands/build.rb +3 -0
- data/lib/bridgetown-core/commands/console.rb +0 -1
- data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +12 -2
- data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +64 -18
- data/lib/bridgetown-core/commands/esbuild/jsconfig.json +10 -0
- data/lib/bridgetown-core/commands/esbuild/setup.rb +1 -0
- data/lib/bridgetown-core/commands/esbuild/update.rb +3 -0
- data/lib/bridgetown-core/configuration.rb +13 -12
- data/lib/bridgetown-core/configurations/is-land.rb +15 -0
- data/lib/bridgetown-core/configurations/lit/lit-components-entry.js +1 -1
- data/lib/bridgetown-core/configurations/lit.rb +9 -54
- data/lib/bridgetown-core/configurations/ruby2js/ruby2js.rb +10 -0
- data/lib/bridgetown-core/configurations/ruby2js.rb +12 -40
- data/lib/bridgetown-core/configurations/turbo.rb +17 -7
- data/lib/bridgetown-core/filters/localization_filters.rb +11 -0
- data/lib/bridgetown-core/helpers.rb +34 -0
- data/lib/bridgetown-core/plugin_manager.rb +0 -24
- data/lib/bridgetown-core/tags/dsd.rb +15 -0
- data/lib/bridgetown-core/tags/l.rb +14 -0
- data/lib/bridgetown-core/utils/aux.rb +2 -0
- data/lib/bridgetown-core/utils/loaders_manager.rb +3 -0
- data/lib/bridgetown-core/utils.rb +34 -5
- data/lib/bridgetown-core/version.rb +1 -1
- data/lib/bridgetown-core/watcher.rb +14 -7
- data/lib/site_template/frontend/javascript/index.js.erb +10 -1
- data/lib/site_template/package.json.erb +6 -6
- metadata +8 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 58cbef52cc9ace0226b8a2ba380589287678d686684bf4d81e5889a6d3ed25bc
         | 
| 4 | 
            +
              data.tar.gz: 14a1a0f631574b0df1e9844660eeff2a6e5e50ad53b998991a3b9a636654a05f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 520791c7e08bdc24e4af37ac399bc0a2d73d939b8ea229188b162f90063b05e394e254dabfa7d529db2d41018bc2bf0fee62b5591a14961a2f88fd40d47a1ddc
         | 
| 7 | 
            +
              data.tar.gz: d623c999cb2ceadcacbed1b1dfbdfd365dd3b705e5583037cb23398d0519301d0052e20b9005b3ab0ce75d0b8c6143abc46f352fbeec7313eef1c8864da6ec57
         | 
| @@ -48,6 +48,9 @@ module Bridgetown | |
| 48 48 |  | 
| 49 49 | 
             
                    if !Bridgetown.env.production? &&
         | 
| 50 50 | 
             
                        !config_options[:skip_frontend] && config_options["using_puma"]
         | 
| 51 | 
            +
                      if Bridgetown::Utils.frontend_bundler_type(config_options[:root_dir]) == :esbuild
         | 
| 52 | 
            +
                        Bridgetown::Utils.update_esbuild_autogenerated_config config_options
         | 
| 53 | 
            +
                      end
         | 
| 51 54 | 
             
                      require "rake"
         | 
| 52 55 | 
             
                      Rake.with_application do |rake|
         | 
| 53 56 | 
             
                        rake.load_rakefile
         | 
| @@ -16,7 +16,6 @@ module Bridgetown | |
| 16 16 | 
             
                  I18n.reload! # make sure any locale files get read again
         | 
| 17 17 | 
             
                  Bridgetown::Hooks.trigger :site, :pre_reload, site
         | 
| 18 18 | 
             
                  Bridgetown::Hooks.clear_reloadable_hooks
         | 
| 19 | 
            -
                  site.plugin_manager.reload_plugin_files
         | 
| 20 19 | 
             
                  site.loaders_manager.reload_loaders
         | 
| 21 20 | 
             
                  Bridgetown::Hooks.trigger :site, :post_reload, site
         | 
| 22 21 |  | 
| @@ -24,13 +24,23 @@ const outputFolder = "output" | |
| 24 24 | 
             
            // You can also support custom base_path deployments via changing `publicPath`.
         | 
| 25 25 | 
             
            //
         | 
| 26 26 | 
             
            // ```
         | 
| 27 | 
            -
            // const esbuildOptions = { | 
| 27 | 
            +
            // const esbuildOptions = {
         | 
| 28 | 
            +
            //   publicPath: "/my_subfolder/_bridgetown/static",
         | 
| 29 | 
            +
            //   ...
         | 
| 30 | 
            +
            // }
         | 
| 28 31 | 
             
            // ```
         | 
| 29 32 |  | 
| 30 33 | 
             
            /**
         | 
| 31 34 | 
             
             * @typedef { import("esbuild").BuildOptions } BuildOptions
         | 
| 32 35 | 
             
             * @type {BuildOptions}
         | 
| 33 36 | 
             
             */
         | 
| 34 | 
            -
            const esbuildOptions = { | 
| 37 | 
            +
            const esbuildOptions = {
         | 
| 38 | 
            +
              plugins: [
         | 
| 39 | 
            +
                // add new plugins here...
         | 
| 40 | 
            +
              ],
         | 
| 41 | 
            +
              globOptions: {
         | 
| 42 | 
            +
                excludeFilter: /\.(dsd|lit)\.(css|js)$/
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
            }
         | 
| 35 45 |  | 
| 36 46 | 
             
            build(outputFolder, esbuildOptions)
         | 
| @@ -8,6 +8,14 @@ | |
| 8 8 | 
             
            //
         | 
| 9 9 | 
             
            // Shipped with Bridgetown v<%= Bridgetown::VERSION %>
         | 
| 10 10 |  | 
| 11 | 
            +
            // DO NOT MANUALLY EDIT THIS CONFIGURATION:
         | 
| 12 | 
            +
            const autogeneratedBridgetownConfig = {
         | 
| 13 | 
            +
              "source": "src",
         | 
| 14 | 
            +
              "destination": "output",
         | 
| 15 | 
            +
              "componentsDir": "_components",
         | 
| 16 | 
            +
              "islandsDir": "_islands"
         | 
| 17 | 
            +
            }
         | 
| 18 | 
            +
             | 
| 11 19 | 
             
            const path = require("path")
         | 
| 12 20 | 
             
            const fsLib = require("fs")
         | 
| 13 21 | 
             
            const fs = fsLib.promises
         | 
| @@ -41,7 +49,7 @@ if (moduleAvailable("sass")) { | |
| 41 49 | 
             
            // Glob plugin derived from:
         | 
| 42 50 | 
             
            // https://github.com/thomaschaaf/esbuild-plugin-import-glob
         | 
| 43 51 | 
             
            // https://github.com/xiaohui-zhangxh/jsbundling-rails/commit/b15025dcc20f664b2b0eb238915991afdbc7cb58
         | 
| 44 | 
            -
            const importGlobPlugin = () => ({
         | 
| 52 | 
            +
            const importGlobPlugin = (options, bridgetownConfig) => ({
         | 
| 45 53 | 
             
              name: "import-glob",
         | 
| 46 54 | 
             
              setup: (build) => {
         | 
| 47 55 | 
             
                build.onResolve({ filter: /\*/ }, async (args) => {
         | 
| @@ -49,7 +57,9 @@ const importGlobPlugin = () => ({ | |
| 49 57 | 
             
                    return; // Ignore unresolvable paths
         | 
| 50 58 | 
             
                  }
         | 
| 51 59 |  | 
| 52 | 
            -
                  const adjustedPath = args.path | 
| 60 | 
            +
                  const adjustedPath = args.path
         | 
| 61 | 
            +
                    .replace(/^\$components\/\*\*/, `../../${bridgetownConfig.source}/${bridgetownConfig.componentsDir}/**`)
         | 
| 62 | 
            +
                    .replace(/^bridgetownComponents\//, `../../${bridgetownConfig.source}/${bridgetownConfig.componentsDir}/`) // legacy
         | 
| 53 63 |  | 
| 54 64 | 
             
                  return {
         | 
| 55 65 | 
             
                    path: adjustedPath,
         | 
| @@ -64,7 +74,11 @@ const importGlobPlugin = () => ({ | |
| 64 74 | 
             
                build.onLoad({ filter: /.*/, namespace: "import-glob" }, async (args) => {
         | 
| 65 75 | 
             
                  const files = glob.sync(args.pluginData.path, {
         | 
| 66 76 | 
             
                    cwd: args.pluginData.resolveDir,
         | 
| 67 | 
            -
                  }) | 
| 77 | 
            +
                  })
         | 
| 78 | 
            +
                    .filter(module => options.excludeFilter ? !options.excludeFilter.test(module) : true)
         | 
| 79 | 
            +
                    .sort()
         | 
| 80 | 
            +
                    .map(module => module.replace(`../../${bridgetownConfig.source}/${bridgetownConfig.componentsDir}/`, "$components/"))
         | 
| 81 | 
            +
                    .map(module => module.match(/^[a-zA-Z0-9]/) ? `./${module}` : module)
         | 
| 68 82 |  | 
| 69 83 | 
             
                  const importerCode = `
         | 
| 70 84 | 
             
                    ${files
         | 
| @@ -72,7 +86,7 @@ const importGlobPlugin = () => ({ | |
| 72 86 | 
             
                      .join(';')}
         | 
| 73 87 | 
             
                    const modules = {${files
         | 
| 74 88 | 
             
                      .map((module, index) => `
         | 
| 75 | 
            -
                        "${module.replace(" | 
| 89 | 
            +
                        "${module.replace("$components/", "")}": module${index},`)
         | 
| 76 90 | 
             
                      .join("")}
         | 
| 77 91 | 
             
                    };
         | 
| 78 92 | 
             
                    export default modules;
         | 
| @@ -187,7 +201,7 @@ const sassPlugin = (options) => ({ | |
| 187 201 | 
             
            })
         | 
| 188 202 |  | 
| 189 203 | 
             
            // Set up defaults and generate frontend bundling manifest file
         | 
| 190 | 
            -
            const bridgetownPreset = ( | 
| 204 | 
            +
            const bridgetownPreset = (bridgetownConfig) => ({
         | 
| 191 205 | 
             
              name: "bridgetownPreset",
         | 
| 192 206 | 
             
              async setup(build) {
         | 
| 193 207 | 
             
                // Ensure any imports anywhere starting with `/` are left verbatim
         | 
| @@ -210,8 +224,10 @@ const bridgetownPreset = (outputFolder) => ({ | |
| 210 224 | 
             
                  const manifest = {}
         | 
| 211 225 | 
             
                  const entrypoints = []
         | 
| 212 226 |  | 
| 213 | 
            -
                  //  | 
| 214 | 
            -
                  const stripPrefix = (str) => str | 
| 227 | 
            +
                  // Clean up entrypoint naming
         | 
| 228 | 
            +
                  const stripPrefix = (str) => str
         | 
| 229 | 
            +
                    .replace(/^frontend\//, "")
         | 
| 230 | 
            +
                    .replace(RegExp(String.raw`^${bridgetownConfig.source}\/${bridgetownConfig.islandsDir}\/`), "islands/")
         | 
| 215 231 |  | 
| 216 232 | 
             
                  // For calculating the file size of bundle output
         | 
| 217 233 | 
             
                  const fileSize = (path) => {
         | 
| @@ -220,11 +236,12 @@ const bridgetownPreset = (outputFolder) => ({ | |
| 220 236 | 
             
                    return (size / Math.pow(1024, i)).toFixed(2) * 1 + ['B', 'KB', 'MB', 'GB', 'TB'][i]
         | 
| 221 237 | 
             
                  }
         | 
| 222 238 |  | 
| 239 | 
            +
                  const pathShortener = new RegExp(String.raw`^${bridgetownConfig.destination}\/_bridgetown\/static\/`, "g")
         | 
| 240 | 
            +
             | 
| 223 241 | 
             
                  // Let's loop through all the various outputs
         | 
| 224 242 | 
             
                  for (const key in result.metafile.outputs) {
         | 
| 225 243 | 
             
                    const value = result.metafile.outputs[key]
         | 
| 226 244 | 
             
                    const inputs = Object.keys(value.inputs)
         | 
| 227 | 
            -
                    const pathShortener = new RegExp(`^${outputFolder}\\/_bridgetown\\/static\\/`, "g")
         | 
| 228 245 | 
             
                    const outputPath = key.replace(pathShortener, "")
         | 
| 229 246 |  | 
| 230 247 | 
             
                    if (value.entryPoint) {
         | 
| @@ -256,23 +273,43 @@ const bridgetownPreset = (outputFolder) => ({ | |
| 256 273 | 
             
              }
         | 
| 257 274 | 
             
            })
         | 
| 258 275 |  | 
| 276 | 
            +
            const bridgetownConfigured = (bridgetownConfig, outputFolder) => {
         | 
| 277 | 
            +
              bridgetownConfig = {...autogeneratedBridgetownConfig, ...bridgetownConfig}
         | 
| 278 | 
            +
              if (outputFolder) bridgetownConfig.destination = outputFolder
         | 
| 279 | 
            +
             | 
| 280 | 
            +
              return bridgetownConfig
         | 
| 281 | 
            +
            }
         | 
| 282 | 
            +
             | 
| 259 283 | 
             
            // Load the PostCSS config from postcss.config.js or whatever else is a supported location/format
         | 
| 260 284 | 
             
            const postcssrc = require("postcss-load-config")
         | 
| 261 285 |  | 
| 262 | 
            -
            module.exports = async ( | 
| 286 | 
            +
            module.exports = async (esbuildOptions) => {
         | 
| 287 | 
            +
              let outputFolder;
         | 
| 288 | 
            +
              if (typeof esbuildOptions === "string") { // legacy syntax where first argument is output folder
         | 
| 289 | 
            +
                esbuildOptions = arguments[1]
         | 
| 290 | 
            +
                outputFolder = arguments[0]
         | 
| 291 | 
            +
              }
         | 
| 292 | 
            +
              const bridgetownConfig = bridgetownConfigured(esbuildOptions.bridgetownConfig, outputFolder)
         | 
| 293 | 
            +
             | 
| 263 294 | 
             
              esbuildOptions.plugins = esbuildOptions.plugins || []
         | 
| 264 295 | 
             
              // Add the PostCSS & glob plugins to the top of the plugin stack
         | 
| 265 296 | 
             
              const postCssConfig = await postcssrc()
         | 
| 266 297 | 
             
              esbuildOptions.plugins.unshift(importPostCssPlugin(postCssConfig, esbuildOptions.postCssPluginConfig || {}))
         | 
| 267 298 | 
             
              if (esbuildOptions.postCssPluginConfig) delete esbuildOptions.postCssPluginConfig
         | 
| 268 | 
            -
               | 
| 299 | 
            +
              // Add the Glob plugin
         | 
| 300 | 
            +
              esbuildOptions.plugins.unshift(importGlobPlugin(esbuildOptions.globOptions || {}, bridgetownConfig))
         | 
| 301 | 
            +
              if (esbuildOptions.globOptions) delete esbuildOptions.globOptions
         | 
| 269 302 | 
             
              // Add the Sass plugin
         | 
| 270 303 | 
             
              esbuildOptions.plugins.push(sassPlugin(esbuildOptions.sassOptions || {}))
         | 
| 304 | 
            +
              if (esbuildOptions.sassOptions) delete esbuildOptions.sassOptions
         | 
| 271 305 | 
             
              // Add the Bridgetown preset
         | 
| 272 | 
            -
              esbuildOptions.plugins.push(bridgetownPreset( | 
| 306 | 
            +
              esbuildOptions.plugins.push(bridgetownPreset(bridgetownConfig))
         | 
| 307 | 
            +
              if (esbuildOptions.bridgetownConfig) delete esbuildOptions.bridgetownConfig
         | 
| 273 308 |  | 
| 274 | 
            -
               | 
| 275 | 
            -
               | 
| 309 | 
            +
              const esbuild = require("esbuild")
         | 
| 310 | 
            +
              const islands = glob.sync(`./${bridgetownConfig.source}/${bridgetownConfig.islandsDir}/*.{js,js.rb}`).map(item => `./${item}`)
         | 
| 311 | 
            +
             | 
| 312 | 
            +
              esbuild.context({
         | 
| 276 313 | 
             
                bundle: true,
         | 
| 277 314 | 
             
                loader: {
         | 
| 278 315 | 
             
                  ".jpg": "file",
         | 
| @@ -285,16 +322,25 @@ module.exports = async (outputFolder, esbuildOptions) => { | |
| 285 322 | 
             
                  ".eot": "file",
         | 
| 286 323 | 
             
                },
         | 
| 287 324 | 
             
                resolveExtensions: [".tsx", ".ts", ".jsx", ".js", ".css", ".scss", ".sass", ".json", ".js.rb"],
         | 
| 288 | 
            -
                nodePaths: ["frontend/javascript", "frontend/styles"],
         | 
| 289 | 
            -
                watch: process.argv.includes("--watch"),
         | 
| 290 325 | 
             
                minify: process.argv.includes("--minify"),
         | 
| 291 326 | 
             
                sourcemap: true,
         | 
| 292 | 
            -
                target: " | 
| 293 | 
            -
                entryPoints: ["./frontend/javascript/index.js"],
         | 
| 327 | 
            +
                target: "es2020",
         | 
| 328 | 
            +
                entryPoints: ["./frontend/javascript/index.js", ...islands],
         | 
| 294 329 | 
             
                entryNames: "[dir]/[name].[hash]",
         | 
| 295 | 
            -
                outdir: path.join(process.cwd(), `${ | 
| 330 | 
            +
                outdir: path.join(process.cwd(), `${bridgetownConfig.destination}/_bridgetown/static`),
         | 
| 296 331 | 
             
                publicPath: "/_bridgetown/static",
         | 
| 297 332 | 
             
                metafile: true,
         | 
| 298 333 | 
             
                ...esbuildOptions,
         | 
| 334 | 
            +
              }).then(context => {
         | 
| 335 | 
            +
                if (process.argv.includes("--watch")) {
         | 
| 336 | 
            +
                  // Enable watch mode
         | 
| 337 | 
            +
                  context.watch()
         | 
| 338 | 
            +
                } else {
         | 
| 339 | 
            +
                  // Build once and exit if not in watch mode
         | 
| 340 | 
            +
                  context.rebuild().then(result => {
         | 
| 341 | 
            +
                    context.dispose()
         | 
| 342 | 
            +
                  })
         | 
| 343 | 
            +
                }
         | 
| 344 | 
            +
                process.on('SIGINT', () => process.exit())
         | 
| 299 345 | 
             
              }).catch(() => process.exit(1))
         | 
| 300 346 | 
             
            }
         | 
| @@ -1,4 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            template "esbuild.defaults.js.erb", "config/esbuild.defaults.js", force: true
         | 
| 4 | 
            +
            copy_file "jsconfig.json"
         | 
| 4 5 | 
             
            say "🎉 esbuild configuration updated successfully!"
         | 
| 6 | 
            +
            say "You may need to add `$styles/` to the front of your main CSS imports."
         | 
| 7 | 
            +
            say "See https://www.bridgetownrb.com/docs/frontend-assets#esbuild-setup for details."
         | 
| @@ -33,8 +33,8 @@ module Bridgetown | |
| 33 33 | 
             
                  "collections_dir"            => "",
         | 
| 34 34 | 
             
                  "cache_dir"                  => ".bridgetown-cache",
         | 
| 35 35 | 
             
                  "layouts_dir"                => "_layouts",
         | 
| 36 | 
            -
                  "data_dir"                   => "_data",
         | 
| 37 36 | 
             
                  "components_dir"             => "_components",
         | 
| 37 | 
            +
                  "islands_dir"                => "_islands",
         | 
| 38 38 | 
             
                  "partials_dir"               => "_partials",
         | 
| 39 39 | 
             
                  "collections"                => {},
         | 
| 40 40 | 
             
                  "taxonomies"                 => {
         | 
| @@ -44,7 +44,6 @@ module Bridgetown | |
| 44 44 | 
             
                  "eager_load_paths"           => [],
         | 
| 45 45 | 
             
                  "autoloader_collapsed_paths" => [],
         | 
| 46 46 | 
             
                  "additional_watch_paths"     => [],
         | 
| 47 | 
            -
                  "plugins_use_zeitwerk"       => true,
         | 
| 48 47 |  | 
| 49 48 | 
             
                  # Handling Reading
         | 
| 50 49 | 
             
                  "include"                    => [".htaccess", "_redirects", ".well-known"],
         | 
| @@ -335,30 +334,32 @@ module Bridgetown | |
| 335 334 | 
             
                    self[:source] = File.expand_path(self[:source], self[:root_dir])
         | 
| 336 335 | 
             
                    self[:destination] = File.expand_path(self[:destination], self[:root_dir])
         | 
| 337 336 |  | 
| 338 | 
            -
                     | 
| 339 | 
            -
                       | 
| 340 | 
            -
             | 
| 341 | 
            -
             | 
| 342 | 
            -
             | 
| 343 | 
            -
             | 
| 337 | 
            +
                    autoload_paths.unshift({
         | 
| 338 | 
            +
                      path: self[:plugins_dir],
         | 
| 339 | 
            +
                      eager: true,
         | 
| 340 | 
            +
                    })
         | 
| 341 | 
            +
                    autoload_paths.unshift({
         | 
| 342 | 
            +
                      path: File.expand_path(self[:islands_dir], self[:source]),
         | 
| 343 | 
            +
                      eager: true,
         | 
| 344 | 
            +
                    })
         | 
| 344 345 | 
             
                  end
         | 
| 345 346 |  | 
| 346 347 | 
             
                  autoload_paths.map! do |load_path|
         | 
| 347 348 | 
             
                    if load_path.is_a?(Hash)
         | 
| 348 | 
            -
                      expanded = File.expand_path(load_path[:path], root_dir)
         | 
| 349 | 
            +
                      expanded = File.expand_path(load_path[:path], self[:root_dir])
         | 
| 349 350 | 
             
                      self[:eager_load_paths] << expanded if load_path[:eager]
         | 
| 350 351 | 
             
                      next expanded
         | 
| 351 352 | 
             
                    end
         | 
| 352 353 |  | 
| 353 | 
            -
                    File.expand_path(load_path, root_dir)
         | 
| 354 | 
            +
                    File.expand_path(load_path, self[:root_dir])
         | 
| 354 355 | 
             
                  end
         | 
| 355 356 |  | 
| 356 357 | 
             
                  autoloader_collapsed_paths.map! do |collapsed_path|
         | 
| 357 | 
            -
                    File.expand_path(collapsed_path, root_dir)
         | 
| 358 | 
            +
                    File.expand_path(collapsed_path, self[:root_dir])
         | 
| 358 359 | 
             
                  end
         | 
| 359 360 |  | 
| 360 361 | 
             
                  additional_watch_paths.map! do |collapsed_path|
         | 
| 361 | 
            -
                    File.expand_path(collapsed_path, root_dir)
         | 
| 362 | 
            +
                    File.expand_path(collapsed_path, self[:root_dir])
         | 
| 362 363 | 
             
                  end
         | 
| 363 364 |  | 
| 364 365 | 
             
                  self
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            say_status "is-land", "Installing <is-land>..."
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            run "yarn add @11ty/is-land"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            javascript_import do
         | 
| 8 | 
            +
              <<~JS
         | 
| 9 | 
            +
                import "@11ty/is-land/is-land.js"
         | 
| 10 | 
            +
                import "@11ty/is-land/is-land-autoinit.js"
         | 
| 11 | 
            +
              JS
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            say_status "is-land", "<is-land> is now configured!"
         | 
| 15 | 
            +
            say 'For further reading, check out "https://www.bridgetownrb.com/docs/islands"', :blue
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            import components from " | 
| 1 | 
            +
            import components from "$components/**/*.{lit.js,lit.js.rb}"
         | 
| @@ -11,9 +11,9 @@ end | |
| 11 11 |  | 
| 12 12 | 
             
            say_status :lit, "Installing Lit + SSR Plugin..."
         | 
| 13 13 |  | 
| 14 | 
            -
            add_gem "bridgetown-lit-renderer"
         | 
| 14 | 
            +
            add_gem "bridgetown-lit-renderer", version: "2.1.0.beta1"
         | 
| 15 15 |  | 
| 16 | 
            -
            run "yarn add lit esbuild-plugin-lit-css bridgetown-lit-renderer"
         | 
| 16 | 
            +
            run "yarn add lit esbuild-plugin-lit-css bridgetown-lit-renderer@2.1.0-beta1"
         | 
| 17 17 |  | 
| 18 18 | 
             
            copy_file in_templates_dir("lit-ssr.config.js"), "config/lit-ssr.config.js"
         | 
| 19 19 | 
             
            copy_file in_templates_dir("lit-components-entry.js"), "config/lit-components-entry.js"
         | 
| @@ -27,45 +27,13 @@ insert_into_file "esbuild.config.js", | |
| 27 27 | 
             
              JS
         | 
| 28 28 | 
             
            end
         | 
| 29 29 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
               | 
| 33 | 
            -
             | 
| 34 | 
            -
              <<~JS
         | 
| 35 | 
            -
                const esbuildOptions = {
         | 
| 36 | 
            -
                  plugins: [...plugins],
         | 
| 37 | 
            -
                  // Uncomment the following to opt into `.global.css` & `.lit.css` nomenclature.
         | 
| 38 | 
            -
                  // Read https://www.bridgetownrb.com/docs/components/lit#sidecar-css-files for documentation.
         | 
| 39 | 
            -
                  /*
         | 
| 40 | 
            -
                  postCssPluginConfig: {
         | 
| 41 | 
            -
                    filter: /(?:index|\\.global)\\.css$/,
         | 
| 42 | 
            -
                  },
         | 
| 43 | 
            -
                  */
         | 
| 44 | 
            -
                }
         | 
| 30 | 
            +
            insert_into_file "esbuild.config.js",
         | 
| 31 | 
            +
                             after: "  plugins: [" do
         | 
| 32 | 
            +
              <<-JS
         | 
| 33 | 
            +
                plugins: [...plugins],
         | 
| 45 34 | 
             
              JS
         | 
| 46 35 | 
             
            end
         | 
| 47 36 |  | 
| 48 | 
            -
            unless found_match
         | 
| 49 | 
            -
              insert_into_file "esbuild.config.js",
         | 
| 50 | 
            -
                               after: 'const { plugins } = require("./config/esbuild-plugins.js")' do
         | 
| 51 | 
            -
                <<~JS
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                  // TODO: You will manually need to move any plugins below you wish to share with
         | 
| 54 | 
            -
                  // Lit SSR into the `config/esbuild-plugins.js` file.
         | 
| 55 | 
            -
                  // Then add `...plugins` as an item in your plugins array.
         | 
| 56 | 
            -
                  //
         | 
| 57 | 
            -
                  // You might also want to include the following in your esbuild config to opt into
         | 
| 58 | 
            -
                  // `.global.css` & `.lit.css` nomenclature.
         | 
| 59 | 
            -
                  // Read https://www.bridgetownrb.com/docs/components/lit#sidecar-css-files for documentation.
         | 
| 60 | 
            -
                  /*
         | 
| 61 | 
            -
                  postCssPluginConfig: {
         | 
| 62 | 
            -
                    filter: /(?:index|\\.global)\\.css$/,
         | 
| 63 | 
            -
                  },
         | 
| 64 | 
            -
                  */
         | 
| 65 | 
            -
                JS
         | 
| 66 | 
            -
              end
         | 
| 67 | 
            -
            end
         | 
| 68 | 
            -
             | 
| 69 37 | 
             
            copy_file in_templates_dir("happy-days.lit.js"), "src/_components/happy-days.lit.js"
         | 
| 70 38 |  | 
| 71 39 | 
             
            javascript_import do
         | 
| @@ -74,24 +42,11 @@ javascript_import do | |
| 74 42 | 
             
              JS
         | 
| 75 43 | 
             
            end
         | 
| 76 44 |  | 
| 77 | 
            -
            insert_into_file "frontend/javascript/index.js",
         | 
| 78 | 
            -
                             before: 'import components from "bridgetownComponents/**/*.{js,jsx,js.rb,css}"' do
         | 
| 79 | 
            -
              <<~JS
         | 
| 80 | 
            -
                // To opt into `.global.css` & `.lit.css` nomenclature, change the `css` extension below to `global.css`.
         | 
| 81 | 
            -
                // Read https://www.bridgetownrb.com/docs/components/lit#sidecar-css-files for documentation.
         | 
| 82 | 
            -
              JS
         | 
| 83 | 
            -
            end
         | 
| 84 | 
            -
             | 
| 85 45 | 
             
            add_initializer :"bridgetown-lit-renderer"
         | 
| 86 46 |  | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
                         "The `config/esbuild-plugins.js` file will let you add full-stack plugins in future."
         | 
| 91 | 
            -
            else
         | 
| 92 | 
            -
              say_status :lit, "Lit is just about configured!"
         | 
| 93 | 
            -
              say_status :lit, "You will need to edit `esbuild.config.js` to finish setting up the plugin."
         | 
| 94 | 
            -
            end
         | 
| 47 | 
            +
            say_status :lit, "Lit is now configured!"
         | 
| 48 | 
            +
            say_status :lit,
         | 
| 49 | 
            +
                       "The `config/esbuild-plugins.js` file will let you add full-stack plugins in future."
         | 
| 95 50 |  | 
| 96 51 | 
             
            say "Check out the example `happy-days.lit.js` file in `src/_components`", :blue
         | 
| 97 52 | 
             
            say 'For further reading, check out "https://www.bridgetownrb.com/docs/components/lit"', :blue
         | 
| @@ -11,57 +11,29 @@ end | |
| 11 11 |  | 
| 12 12 | 
             
            say_status :ruby2js, "Installing Ruby2JS..."
         | 
| 13 13 |  | 
| 14 | 
            +
            add_gem "ruby2js"
         | 
| 14 15 | 
             
            run "yarn add -D @ruby2js/esbuild-plugin"
         | 
| 15 16 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
              found_match = true
         | 
| 19 | 
            -
             | 
| 17 | 
            +
            insert_into_file "esbuild.config.js",
         | 
| 18 | 
            +
                             after: 'const build = require("./config/esbuild.defaults.js")' do
         | 
| 20 19 | 
             
              <<~JS
         | 
| 21 | 
            -
                const ruby2js = require("@ruby2js/esbuild-plugin")
         | 
| 22 20 |  | 
| 23 | 
            -
                const  | 
| 24 | 
            -
                  plugins: [
         | 
| 25 | 
            -
                    // See docs on Ruby2JS options here: https://www.ruby2js.com/docs/options
         | 
| 26 | 
            -
                    ruby2js({
         | 
| 27 | 
            -
                      eslevel: 2022,
         | 
| 28 | 
            -
                      autoexports: "default",
         | 
| 29 | 
            -
                      filters: ["camelCase", "functions", "lit", "esm", "return"]
         | 
| 30 | 
            -
                    })
         | 
| 31 | 
            -
                  ]
         | 
| 32 | 
            -
                }
         | 
| 21 | 
            +
                const ruby2js = require("@ruby2js/esbuild-plugin")
         | 
| 33 22 | 
             
              JS
         | 
| 34 23 | 
             
            end
         | 
| 35 24 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
               | 
| 38 | 
            -
             | 
| 39 | 
            -
                 | 
| 40 | 
            -
             | 
| 41 | 
            -
                  const ruby2js = require("@ruby2js/esbuild-plugin")
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  // TODO: Uncomment and move the following into your plugins array:
         | 
| 44 | 
            -
                  //
         | 
| 45 | 
            -
                  //  ruby2js({
         | 
| 46 | 
            -
                  //    eslevel: 2022,
         | 
| 47 | 
            -
                  //    autoexports: "default",
         | 
| 48 | 
            -
                  //    filters: ["camelCase", "functions", "lit", "esm", "return"]
         | 
| 49 | 
            -
                  //  })
         | 
| 50 | 
            -
                  //
         | 
| 51 | 
            -
                  // See docs on Ruby2JS options here: https://www.ruby2js.com/docs/options
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                JS
         | 
| 54 | 
            -
              end
         | 
| 25 | 
            +
            insert_into_file "esbuild.config.js",
         | 
| 26 | 
            +
                             after: "  plugins: [" do
         | 
| 27 | 
            +
              <<-JS
         | 
| 28 | 
            +
                ruby2js(),
         | 
| 29 | 
            +
              JS
         | 
| 55 30 | 
             
            end
         | 
| 56 31 |  | 
| 32 | 
            +
            copy_file in_templates_dir("ruby2js.rb"), "config/ruby2js.rb"
         | 
| 57 33 | 
             
            copy_file in_templates_dir("hello_world.js.rb"), "src/_components/hello_world.js.rb"
         | 
| 58 34 |  | 
| 59 | 
            -
             | 
| 60 | 
            -
              say_status :ruby2js, "Ruby2JS is now configured!"
         | 
| 61 | 
            -
            else
         | 
| 62 | 
            -
              say_status :ruby2js, "Ruby2JS is just about configured!"
         | 
| 63 | 
            -
              say_status :ruby2js, "You will need to edit `esbuild.config.js` to finish setting up the plugin."
         | 
| 64 | 
            -
            end
         | 
| 35 | 
            +
            say_status :ruby2js, "Ruby2JS is now configured!"
         | 
| 65 36 |  | 
| 66 37 | 
             
            say "Check out the example `hello_world.js.rb` file in `src/_components`", :blue
         | 
| 38 | 
            +
            say "Ruby2JS configuration options are saved in `config/ruby2js.rb`", :blue
         | 
| 67 39 | 
             
            say 'For further reading, check out "https://www.ruby2js.com"', :blue
         | 
| @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            say_status :turbo, "Installing Turbo..."
         | 
| 4 4 |  | 
| 5 5 | 
             
            run("yarn add @hotwired/turbo")
         | 
| 6 | 
            +
            run("yarn add turbo-shadow")
         | 
| 6 7 |  | 
| 7 8 | 
             
            say_status :turbo, 'Adding Turbo to "frontend/javascript/index.js"...', :magenta
         | 
| 8 9 |  | 
| @@ -10,11 +11,17 @@ javascript_import do | |
| 10 11 | 
             
              <<~JS
         | 
| 11 12 | 
             
                import * as Turbo from "@hotwired/turbo"
         | 
| 12 13 |  | 
| 13 | 
            -
                 | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                 | 
| 14 | 
            +
                /**
         | 
| 15 | 
            +
                 * Adds support for declarative shadow DOM. Requires your HTML <head> to include:
         | 
| 16 | 
            +
                 * `<meta name="turbo-cache-control" content="no-cache" />`
         | 
| 17 | 
            +
                 */
         | 
| 18 | 
            +
                import * as TurboShadow from "turbo-shadow"
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                /**
         | 
| 21 | 
            +
                 * Uncomment the line below to add transition animations when Turbo navigates.
         | 
| 22 | 
            +
                 * Use data-turbo-transition="false" on your <main> element for pages where
         | 
| 23 | 
            +
                 * you don't want any transition animation.
         | 
| 24 | 
            +
                 */
         | 
| 18 25 | 
             
                // import "./turbo_transitions.js"
         | 
| 19 26 | 
             
              JS
         | 
| 20 27 | 
             
            end
         | 
| @@ -22,5 +29,8 @@ end | |
| 22 29 | 
             
            copy_file in_templates_dir("turbo_transitions.js"), "frontend/javascript/turbo_transitions.js"
         | 
| 23 30 |  | 
| 24 31 | 
             
            say_status :turbo, "Turbo successfully added!", :magenta
         | 
| 25 | 
            -
            say_status :turbo, " | 
| 26 | 
            -
            say_status :turbo,  | 
| 32 | 
            +
            say_status :turbo, "For declarative shadow DOM support, you will need to update", :blue
         | 
| 33 | 
            +
            say_status :turbo, "your HTML <head> to add the following code:", :blue
         | 
| 34 | 
            +
            say %(<meta name="turbo-cache-control" content="no-cache" />)
         | 
| 35 | 
            +
            say_status :turbo, "Check out your index.js file for optional animation setup.", :blue
         | 
| 36 | 
            +
            say_status :turbo, 'For further reading, visit "https://turbo.hotwired.dev/"', :blue
         | 
| @@ -135,6 +135,14 @@ module Bridgetown | |
| 135 135 | 
             
                    I18n.send :t, *args, **kwargs
         | 
| 136 136 | 
             
                  end
         | 
| 137 137 |  | 
| 138 | 
            +
                  # Forward all arguments to I18n.l method
         | 
| 139 | 
            +
                  #
         | 
| 140 | 
            +
                  # @return [String] the localized string
         | 
| 141 | 
            +
                  # @see I18n
         | 
| 142 | 
            +
                  def l(*args, **kwargs)
         | 
| 143 | 
            +
                    I18n.send :l, *args, **kwargs
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
             | 
| 138 146 | 
             
                  # For template contexts where ActiveSupport's output safety is loaded, we
         | 
| 139 147 | 
             
                  # can ensure a string has been marked safe
         | 
| 140 148 | 
             
                  #
         | 
| @@ -221,6 +229,32 @@ module Bridgetown | |
| 221 229 | 
             
                    end
         | 
| 222 230 | 
             
                  end
         | 
| 223 231 |  | 
| 232 | 
            +
                  def dsd(input = nil, &block)
         | 
| 233 | 
            +
                    tmpl_content = block.nil? ? input.to_s : view.capture(&block)
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                    Bridgetown::Utils.dsd_tag(tmpl_content)
         | 
| 236 | 
            +
                  end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  def dsd_style
         | 
| 239 | 
            +
                    tmpl_path = caller_locations(1, 2).find do |loc|
         | 
| 240 | 
            +
                                  loc.label.include?("method_missing").!
         | 
| 241 | 
            +
                                end&.path
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                    return unless tmpl_path # virtually guaranteed not to happen
         | 
| 244 | 
            +
             | 
| 245 | 
            +
                    tmpl_basename = File.basename(tmpl_path, ".*")
         | 
| 246 | 
            +
                    style_path = File.join(File.dirname(tmpl_path), "#{tmpl_basename}.dsd.css")
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                    unless File.file?(style_path)
         | 
| 249 | 
            +
                      raise Bridgetown::Errors::FatalException, "Missing stylesheet at #{style_path}"
         | 
| 250 | 
            +
                    end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                    style_tag = site.tmp_cache["dsd_style:#{style_path}"] ||=
         | 
| 253 | 
            +
                      "<style>#{File.read(style_path)}</style>"
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                    style_tag.html_safe
         | 
| 256 | 
            +
                  end
         | 
| 257 | 
            +
             | 
| 224 258 | 
             
                  private
         | 
| 225 259 |  | 
| 226 260 | 
             
                  # Covert an underscored value into a dashed string.
         | 
| @@ -206,30 +206,6 @@ module Bridgetown | |
| 206 206 | 
             
                    sorted_plugin_files.each do |plugin_file|
         | 
| 207 207 | 
             
                      self.class.add_registered_plugin plugin_file
         | 
| 208 208 | 
             
                    end
         | 
| 209 | 
            -
                    next if site.config[:plugins_use_zeitwerk]
         | 
| 210 | 
            -
             | 
| 211 | 
            -
                    Deprecator.deprecation_message(
         | 
| 212 | 
            -
                      "The `plugins_use_zeitwerk' configuration option will be removed in the next version " \
         | 
| 213 | 
            -
                      "of Bridgetown (aka will be permanently set to \"true\")"
         | 
| 214 | 
            -
                    )
         | 
| 215 | 
            -
                    Bridgetown::Utils::RequireGems.require_with_graceful_fail(sorted_plugin_files)
         | 
| 216 | 
            -
                  end
         | 
| 217 | 
            -
                end
         | 
| 218 | 
            -
             | 
| 219 | 
            -
                # Reloads .rb plugin files via the watcher
         | 
| 220 | 
            -
                # DEPRECATED (not necessary with Zeitwerk)
         | 
| 221 | 
            -
                #
         | 
| 222 | 
            -
                # @return [void]
         | 
| 223 | 
            -
                def reload_plugin_files
         | 
| 224 | 
            -
                  return if site.config[:plugins_use_zeitwerk]
         | 
| 225 | 
            -
             | 
| 226 | 
            -
                  plugins_path.each do |plugin_search_path|
         | 
| 227 | 
            -
                    plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb"))
         | 
| 228 | 
            -
                    Array(plugin_files).each do |name|
         | 
| 229 | 
            -
                      Bridgetown.logger.debug "Reloading:", name.to_s
         | 
| 230 | 
            -
                      self.class.add_registered_plugin name
         | 
| 231 | 
            -
                      load name
         | 
| 232 | 
            -
                    end
         | 
| 233 209 | 
             
                  end
         | 
| 234 210 | 
             
                end
         | 
| 235 211 |  | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Bridgetown
         | 
| 4 | 
            +
              module Tags
         | 
| 5 | 
            +
                class DSDTag < Liquid::Block
         | 
| 6 | 
            +
                  def render(_context)
         | 
| 7 | 
            +
                    template_content = super
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    Bridgetown::Utils.dsd_tag(template_content)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Liquid::Template.register_tag("dsd", Bridgetown::Tags::DSDTag)
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Bridgetown
         | 
| 4 | 
            +
              module Tags
         | 
| 5 | 
            +
                class LocalizationTag < Liquid::Tag
         | 
| 6 | 
            +
                  def render(_context)
         | 
| 7 | 
            +
                    key = @markup.strip
         | 
| 8 | 
            +
                    I18n.l(key)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            Liquid::Template.register_tag("l", Bridgetown::Tags::LocalizationTag)
         | 
| @@ -29,6 +29,8 @@ module Bridgetown | |
| 29 29 | 
             
                      loop do
         | 
| 30 30 | 
             
                        line = rd.gets
         | 
| 31 31 | 
             
                        line.to_s.lines.map(&:chomp).each do |message|
         | 
| 32 | 
            +
                          next if name == "Frontend" && %r{ELIFECYCLE.*?Command failed}.match?(message)
         | 
| 33 | 
            +
             | 
| 32 34 | 
             
                          output = +""
         | 
| 33 35 | 
             
                          output << with_color(color, "[#{name}] ") if color
         | 
| 34 36 | 
             
                          output << message
         | 
| @@ -62,6 +62,9 @@ module Bridgetown | |
| 62 62 | 
             
                      end
         | 
| 63 63 | 
             
                      loader.enable_reloading if reloading_enabled?(load_path)
         | 
| 64 64 | 
             
                      loader.ignore(File.join(load_path, "**", "*.js.rb"))
         | 
| 65 | 
            +
                      loader.ignore(
         | 
| 66 | 
            +
                        File.join(File.expand_path(config[:islands_dir], config[:source]), "routes")
         | 
| 67 | 
            +
                      )
         | 
| 65 68 | 
             
                      config.autoloader_collapsed_paths.each do |collapsed_path|
         | 
| 66 69 | 
             
                        next unless collapsed_path.starts_with?(load_path)
         | 
| 67 70 |  | 
| @@ -412,7 +412,7 @@ module Bridgetown | |
| 412 412 | 
             
                                 end&.last
         | 
| 413 413 | 
             
                               end
         | 
| 414 414 |  | 
| 415 | 
            -
                  return log_frontend_asset_error(site, asset_type) if asset_path.nil?
         | 
| 415 | 
            +
                  return log_frontend_asset_error(site, "`#{asset_type}' asset") if asset_path.nil?
         | 
| 416 416 |  | 
| 417 417 | 
             
                  static_frontend_path site, [asset_path]
         | 
| 418 418 | 
             
                end
         | 
| @@ -429,14 +429,16 @@ module Bridgetown | |
| 429 429 |  | 
| 430 430 | 
             
                def log_frontend_asset_error(site, asset_type)
         | 
| 431 431 | 
             
                  site.data[:__frontend_asset_errors] ||= {}
         | 
| 432 | 
            -
                  site.data[:__frontend_asset_errors][asset_type] ||=
         | 
| 432 | 
            +
                  site.data[:__frontend_asset_errors][asset_type] ||= begin
         | 
| 433 | 
            +
                    Bridgetown.logger.warn("#{frontend_bundler_type}:", "The #{asset_type} could not be found.")
         | 
| 433 434 | 
             
                    Bridgetown.logger.warn(
         | 
| 434 435 | 
             
                      "#{frontend_bundler_type}:",
         | 
| 435 | 
            -
                      " | 
| 436 | 
            -
                      Please check your #{asset_type} file for any errors."
         | 
| 436 | 
            +
                      "Double-check your frontend config or re-run `bin/bridgetown frontend:build'"
         | 
| 437 437 | 
             
                    )
         | 
| 438 | 
            +
                    true
         | 
| 439 | 
            +
                  end
         | 
| 438 440 |  | 
| 439 | 
            -
                  "MISSING_#{frontend_bundler_type.upcase} | 
| 441 | 
            +
                  "MISSING_#{frontend_bundler_type.upcase}_ASSET"
         | 
| 440 442 | 
             
                end
         | 
| 441 443 |  | 
| 442 444 | 
             
                def frontend_bundler_type(cwd = Dir.pwd)
         | 
| @@ -449,6 +451,27 @@ module Bridgetown | |
| 449 451 | 
             
                  end
         | 
| 450 452 | 
             
                end
         | 
| 451 453 |  | 
| 454 | 
            +
                def update_esbuild_autogenerated_config(config)
         | 
| 455 | 
            +
                  defaults_file = File.join(config[:root_dir], "config", "esbuild.defaults.js")
         | 
| 456 | 
            +
                  return unless File.exist?(defaults_file)
         | 
| 457 | 
            +
             | 
| 458 | 
            +
                  config_hash = {
         | 
| 459 | 
            +
                    source: Pathname.new(config[:source]).relative_path_from(config[:root_dir]),
         | 
| 460 | 
            +
                    destination: Pathname.new(config[:destination]).relative_path_from(config[:root_dir]),
         | 
| 461 | 
            +
                    componentsDir: config[:components_dir],
         | 
| 462 | 
            +
                    islandsDir: config[:islands_dir],
         | 
| 463 | 
            +
                  }
         | 
| 464 | 
            +
             | 
| 465 | 
            +
                  defaults_file_contents = File.read(defaults_file)
         | 
| 466 | 
            +
                  File.write(
         | 
| 467 | 
            +
                    defaults_file,
         | 
| 468 | 
            +
                    defaults_file_contents.sub(
         | 
| 469 | 
            +
                      %r{(const autogeneratedBridgetownConfig = ){\n.*?}}m,
         | 
| 470 | 
            +
                      "\\1#{JSON.pretty_generate config_hash}"
         | 
| 471 | 
            +
                    )
         | 
| 472 | 
            +
                  )
         | 
| 473 | 
            +
                end
         | 
| 474 | 
            +
             | 
| 452 475 | 
             
                def default_github_branch_name(repo_url)
         | 
| 453 476 | 
             
                  repo_match = Bridgetown::Commands::Actions::GITHUB_REPO_REGEX.match(repo_url)
         | 
| 454 477 | 
             
                  api_endpoint = "https://api.github.com/repos/#{repo_match[1]}"
         | 
| @@ -523,6 +546,12 @@ module Bridgetown | |
| 523 546 | 
             
                  end
         | 
| 524 547 | 
             
                end
         | 
| 525 548 |  | 
| 549 | 
            +
                def dsd_tag(input, shadow_root_mode: :open)
         | 
| 550 | 
            +
                  raise ArgumentError unless [:open, :closed].include? shadow_root_mode
         | 
| 551 | 
            +
             | 
| 552 | 
            +
                  %(<template shadowrootmode="#{shadow_root_mode}">#{input}</template>).html_safe
         | 
| 553 | 
            +
                end
         | 
| 554 | 
            +
             | 
| 526 555 | 
             
                private
         | 
| 527 556 |  | 
| 528 557 | 
             
                def merge_values(target, overwrite)
         | 
| @@ -55,7 +55,7 @@ module Bridgetown | |
| 55 55 | 
             
                # Start a listener to watch for changes and call {#reload_site}
         | 
| 56 56 | 
             
                #
         | 
| 57 57 | 
             
                # @param (see #watch)
         | 
| 58 | 
            -
                def listen(site, options)
         | 
| 58 | 
            +
                def listen(site, options) # rubocop:disable Metrics/MethodLength
         | 
| 59 59 | 
             
                  bundling_path = site.frontend_bundling_path
         | 
| 60 60 | 
             
                  FileUtils.mkdir_p(bundling_path)
         | 
| 61 61 | 
             
                  Listen.to(
         | 
| @@ -66,12 +66,17 @@ module Bridgetown | |
| 66 66 | 
             
                    force_polling: options["force_polling"]
         | 
| 67 67 | 
             
                  ) do |modified, added, removed|
         | 
| 68 68 | 
             
                    c = modified + added + removed
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    # NOTE: inexplicably, this matcher doesn't work with the Listen gem, so
         | 
| 71 | 
            +
                    # we have to run it here manually
         | 
| 72 | 
            +
                    c.reject! { component_frontend_matcher(options).match? _1 }
         | 
| 69 73 | 
             
                    n = c.length
         | 
| 74 | 
            +
                    next if n.zero?
         | 
| 70 75 |  | 
| 71 76 | 
             
                    unless site.ssr?
         | 
| 72 77 | 
             
                      Bridgetown.logger.info(
         | 
| 73 78 | 
             
                        "Reloading…",
         | 
| 74 | 
            -
                        "#{n} file#{"s" if  | 
| 79 | 
            +
                        "#{n} file#{"s" if n > 1} changed at #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}"
         | 
| 75 80 | 
             
                      )
         | 
| 76 81 | 
             
                      c.each { |path| Bridgetown.logger.info "", "- #{path["#{site.root_dir}/".length..]}" }
         | 
| 77 82 | 
             
                    end
         | 
| @@ -93,7 +98,6 @@ module Bridgetown | |
| 93 98 | 
             
                    catch :halt do
         | 
| 94 99 | 
             
                      Bridgetown::Hooks.trigger :site, :pre_reload, site, paths
         | 
| 95 100 | 
             
                      Bridgetown::Hooks.clear_reloadable_hooks
         | 
| 96 | 
            -
                      site.plugin_manager.reload_plugin_files
         | 
| 97 101 | 
             
                      site.loaders_manager.reload_loaders
         | 
| 98 102 | 
             
                      Bridgetown::Hooks.trigger :site, :post_reload, site, paths
         | 
| 99 103 |  | 
| @@ -124,12 +128,15 @@ module Bridgetown | |
| 124 128 | 
             
                end
         | 
| 125 129 |  | 
| 126 130 | 
             
                def custom_excludes(options)
         | 
| 127 | 
            -
                  Array(options["exclude"]).map { |e| Bridgetown.sanitized_path(options[" | 
| 131 | 
            +
                  Array(options["exclude"]).map { |e| Bridgetown.sanitized_path(options["root_dir"], e) }
         | 
| 128 132 | 
             
                end
         | 
| 129 133 |  | 
| 130 | 
            -
                 | 
| 131 | 
            -
             | 
| 134 | 
            +
                # rubocop:disable Layout/LineLength
         | 
| 135 | 
            +
                def component_frontend_matcher(options)
         | 
| 136 | 
            +
                  @fematcher ||=
         | 
| 137 | 
            +
                    %r{(#{options[:components_dir]}|#{options[:islands_dir]})/(?:[^.]+|\.(?!dsd))+(\.js|\.jsx|\.js\.rb|\.css)$}
         | 
| 132 138 | 
             
                end
         | 
| 139 | 
            +
                # rubocop:enable Layout/LineLength
         | 
| 133 140 |  | 
| 134 141 | 
             
                def to_exclude(options)
         | 
| 135 142 | 
             
                  [
         | 
| @@ -162,7 +169,7 @@ module Bridgetown | |
| 162 169 | 
             
                    rescue ArgumentError
         | 
| 163 170 | 
             
                      # Could not find a relative path
         | 
| 164 171 | 
             
                    end
         | 
| 165 | 
            -
                  end | 
| 172 | 
            +
                  end
         | 
| 166 173 | 
             
                end
         | 
| 167 174 |  | 
| 168 175 | 
             
                def sleep_forever
         | 
| @@ -1,13 +1,22 @@ | |
| 1 | 
            +
            <%- if frontend_bundling_option == "esbuild" -%>
         | 
| 2 | 
            +
            <%- if postcss_option -%>
         | 
| 3 | 
            +
            import "$styles/index.css"
         | 
| 4 | 
            +
            <%- else -%>
         | 
| 5 | 
            +
            import "$styles/index.scss"
         | 
| 6 | 
            +
            <%- end -%>
         | 
| 7 | 
            +
            import "$styles/syntax-highlighting.css"
         | 
| 8 | 
            +
            <%- else -%>
         | 
| 1 9 | 
             
            <%- if postcss_option -%>
         | 
| 2 10 | 
             
            import "index.css"
         | 
| 3 11 | 
             
            <%- else -%>
         | 
| 4 12 | 
             
            import "index.scss"
         | 
| 5 13 | 
             
            <%- end -%>
         | 
| 6 14 | 
             
            import "syntax-highlighting.css"
         | 
| 15 | 
            +
            <%- end -%>
         | 
| 7 16 |  | 
| 8 17 | 
             
            // Import all JavaScript & CSS files from src/_components
         | 
| 9 18 | 
             
            <%- if frontend_bundling_option == "esbuild" -%>
         | 
| 10 | 
            -
            import components from " | 
| 19 | 
            +
            import components from "$components/**/*.{js,jsx,js.rb,css}"
         | 
| 11 20 | 
             
            <%- else -%>
         | 
| 12 21 | 
             
            const componentsContext = require.context("bridgetownComponents", true, /\.(js|css)$/)
         | 
| 13 22 | 
             
            componentsContext.keys().forEach(componentsContext)
         | 
| @@ -15,29 +15,29 @@ | |
| 15 15 | 
             
                <%- if frontend_bundling_option == "webpack" -%>
         | 
| 16 16 | 
             
                "css-loader": "^6.7.1",
         | 
| 17 17 | 
             
                <%- end -%>
         | 
| 18 | 
            -
                "esbuild": "^0. | 
| 18 | 
            +
                "esbuild": "^0.17.19",
         | 
| 19 19 | 
             
                <%- if frontend_bundling_option == "webpack" -%>
         | 
| 20 20 | 
             
                "esbuild-loader": "^2.18.0",
         | 
| 21 21 | 
             
                "mini-css-extract-plugin": "^2.6.0",
         | 
| 22 22 | 
             
                <%- else -%>
         | 
| 23 | 
            -
                "glob": "^ | 
| 23 | 
            +
                "glob": "^10.2.6",
         | 
| 24 24 | 
             
                <%- end -%>
         | 
| 25 25 | 
             
                <%- unless disable_postcss? -%>
         | 
| 26 | 
            -
                "postcss": "^8.4. | 
| 26 | 
            +
                "postcss": "^8.4.23",
         | 
| 27 27 | 
             
                "postcss-flexbugs-fixes": "^5.0.2",
         | 
| 28 28 | 
             
                <%- if frontend_bundling_option == "esbuild" -%>
         | 
| 29 | 
            -
                "postcss-import": "^ | 
| 29 | 
            +
                "postcss-import": "^15.1.0",
         | 
| 30 30 | 
             
                "postcss-load-config": "^4.0.1",
         | 
| 31 31 | 
             
                <%- else -%>
         | 
| 32 32 | 
             
                "postcss-loader": "^6.2.1",
         | 
| 33 33 | 
             
                <%- end -%>
         | 
| 34 | 
            -
                "postcss-preset-env": "^ | 
| 34 | 
            +
                "postcss-preset-env": "^8.4.1",
         | 
| 35 35 | 
             
                <%- if frontend_bundling_option == "esbuild" -%>
         | 
| 36 36 | 
             
                "read-cache": "^1.0.0"<%= "," unless postcss_option  %>
         | 
| 37 37 | 
             
                <%- end -%>
         | 
| 38 38 | 
             
                <%- end -%>
         | 
| 39 39 | 
             
                <%- unless postcss_option -%>
         | 
| 40 | 
            -
                "sass": "^1. | 
| 40 | 
            +
                "sass": "^1.62.1",
         | 
| 41 41 | 
             
                "sass-loader": "^12.6.0"<%= "," if frontend_bundling_option == "webpack" %>
         | 
| 42 42 | 
             
                <%- end -%>
         | 
| 43 43 | 
             
                <%- if frontend_bundling_option == "webpack" -%>
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: bridgetown-core
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.3.0. | 
| 4 | 
            +
              version: 1.3.0.beta2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Bridgetown Team
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023- | 
| 11 | 
            +
            date: 2023-06-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activemodel
         | 
| @@ -348,6 +348,7 @@ files: | |
| 348 348 | 
             
            - lib/bridgetown-core/commands/esbuild.rb
         | 
| 349 349 | 
             
            - lib/bridgetown-core/commands/esbuild/esbuild.config.js
         | 
| 350 350 | 
             
            - lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb
         | 
| 351 | 
            +
            - lib/bridgetown-core/commands/esbuild/jsconfig.json
         | 
| 351 352 | 
             
            - lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb
         | 
| 352 353 | 
             
            - lib/bridgetown-core/commands/esbuild/setup.rb
         | 
| 353 354 | 
             
            - lib/bridgetown-core/commands/esbuild/update.rb
         | 
| @@ -392,6 +393,7 @@ files: | |
| 392 393 | 
             
            - lib/bridgetown-core/configurations/cypress/cypress_tasks
         | 
| 393 394 | 
             
            - lib/bridgetown-core/configurations/gh-pages.rb
         | 
| 394 395 | 
             
            - lib/bridgetown-core/configurations/gh-pages/gh-pages.yml
         | 
| 396 | 
            +
            - lib/bridgetown-core/configurations/is-land.rb
         | 
| 395 397 | 
             
            - lib/bridgetown-core/configurations/lit.rb
         | 
| 396 398 | 
             
            - lib/bridgetown-core/configurations/lit/esbuild-plugins.js
         | 
| 397 399 | 
             
            - lib/bridgetown-core/configurations/lit/happy-days.lit.js
         | 
| @@ -408,6 +410,7 @@ files: | |
| 408 410 | 
             
            - lib/bridgetown-core/configurations/render/render.yaml.erb
         | 
| 409 411 | 
             
            - lib/bridgetown-core/configurations/ruby2js.rb
         | 
| 410 412 | 
             
            - lib/bridgetown-core/configurations/ruby2js/hello_world.js.rb
         | 
| 413 | 
            +
            - lib/bridgetown-core/configurations/ruby2js/ruby2js.rb
         | 
| 411 414 | 
             
            - lib/bridgetown-core/configurations/shoelace.rb
         | 
| 412 415 | 
             
            - lib/bridgetown-core/configurations/stimulus.rb
         | 
| 413 416 | 
             
            - lib/bridgetown-core/configurations/tailwindcss.rb
         | 
| @@ -444,6 +447,7 @@ files: | |
| 444 447 | 
             
            - lib/bridgetown-core/filters/date_filters.rb
         | 
| 445 448 | 
             
            - lib/bridgetown-core/filters/from_liquid.rb
         | 
| 446 449 | 
             
            - lib/bridgetown-core/filters/grouping_filters.rb
         | 
| 450 | 
            +
            - lib/bridgetown-core/filters/localization_filters.rb
         | 
| 447 451 | 
             
            - lib/bridgetown-core/filters/translation_filters.rb
         | 
| 448 452 | 
             
            - lib/bridgetown-core/filters/url_filters.rb
         | 
| 449 453 | 
             
            - lib/bridgetown-core/frontmatter_defaults.rb
         | 
| @@ -490,8 +494,10 @@ files: | |
| 490 494 | 
             
            - lib/bridgetown-core/static_file.rb
         | 
| 491 495 | 
             
            - lib/bridgetown-core/tags/asset_path.rb
         | 
| 492 496 | 
             
            - lib/bridgetown-core/tags/class_map.rb
         | 
| 497 | 
            +
            - lib/bridgetown-core/tags/dsd.rb
         | 
| 493 498 | 
             
            - lib/bridgetown-core/tags/find.rb
         | 
| 494 499 | 
             
            - lib/bridgetown-core/tags/highlight.rb
         | 
| 500 | 
            +
            - lib/bridgetown-core/tags/l.rb
         | 
| 495 501 | 
             
            - lib/bridgetown-core/tags/link.rb
         | 
| 496 502 | 
             
            - lib/bridgetown-core/tags/live_reload_dev_js.rb
         | 
| 497 503 | 
             
            - lib/bridgetown-core/tags/post_url.rb
         |