jsbundling-rails 1.1.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 137e2a80465a741d5a59b07f3776f8de07461e782439f64f7a096ac9f46f4446
4
- data.tar.gz: 47ddd6de7ec38dbaaf5568c433723cf79c3f93a0b4409b580c85b7fceb5dbb01
3
+ metadata.gz: c5eb0a7f2f82b82a508d4640babe1980234db73e9f97f2bcdd08db417ad1dfee
4
+ data.tar.gz: 9ba266bcf549a314d0968705626021566c993a1c7e771ecf886627c307c0300a
5
5
  SHA512:
6
- metadata.gz: 04222ea64e7bf09c63fef4dddabc1e9537960fecf6629dcca6c3417c31bbfc580d0de716c45b8c9638e60d8c80cee213aa2263b4c0ed2cebf47d49f47f48079f
7
- data.tar.gz: ef8f1a586d142d28d4399530a1cdc34065f59ebf23e0446d0fda349ceaefd82dc4377382b9e7ad53c412e89ec03e73562809ba81d05f5a9db47bcfee47776f97
6
+ metadata.gz: b9f055b3a8a676d91e3fb421e757a5e81e6b01b4c165c8f45f889de1a2c0bbdcf574c6934d17c7b39006ad05a87b52be9e5c4429f0265ddd87888129fc472c3c
7
+ data.tar.gz: a07320167dc646b5b9792e8d02c770b2e4c40283a5219baf92cfca6b29ae04c54b2d2ab7e0c995514b4bf646b092272f9a3133cd46b0571ebd9190d57682a3d2
data/README.md CHANGED
@@ -1,33 +1,40 @@
1
1
  # JavaScript Bundling for Rails
2
2
 
3
- Use [esbuild](https://esbuild.github.io), [rollup.js](https://rollupjs.org), or [Webpack](https://webpack.js.org) to bundle your JavaScript, then deliver it via the asset pipeline in Rails. This gem provides installers to get you going with the bundler of your choice in a new Rails application, and a convention to use `app/assets/builds` to hold your bundled output as artifacts that are not checked into source control (the installer adds this directory to `.gitignore` by default).
3
+ Use [Bun](https://bun.sh), [esbuild](https://esbuild.github.io), [rollup.js](https://rollupjs.org), or [Webpack](https://webpack.js.org) to bundle your JavaScript, then deliver it via the asset pipeline in Rails. This gem provides installers to get you going with the bundler of your choice in a new Rails application, and a convention to use `app/assets/builds` to hold your bundled output as artifacts that are not checked into source control (the installer adds this directory to `.gitignore` by default).
4
4
 
5
5
  You develop using this approach by running the bundler in watch mode in a terminal with `yarn build --watch` (and your Rails server in another, if you're not using something like [puma-dev](https://github.com/puma/puma-dev)). You can also use `./bin/dev`, which will start both the Rails server and the JS build watcher (along with a CSS build watcher, if you're also using `cssbundling-rails`).
6
6
 
7
7
  Whenever the bundler detects changes to any of the JavaScript files in your project, it'll bundle `app/javascript/application.js` into `app/assets/builds/application.js` (and all other entry points configured). You can refer to the build output in your layout using the standard asset pipeline approach with `<%= javascript_include_tag "application", defer: true %>`.
8
8
 
9
- When you deploy your application to production, the `javascript:build` task attaches to the `assets:precompile` task to ensure that all your package dependencies from `package.json` have been installed via yarn, and then runs `yarn build` to process all the entry points, as it would in development. The latter files are then picked up by the asset pipeline, digested, and copied into public/assets, as any other asset pipeline file.
9
+ When you deploy your application to production, the `javascript:build` task attaches to the `assets:precompile` task to ensure that all your package dependencies from `package.json` have been installed via your javascript package manager ([bun](https://bun.sh), [npm](https://www.npmjs.com), [pnpm](https://pnpm.io), or [yarn](https://yarnpkg.com)), and then runs the build script defined in `package.json` to process all the entry points, as it would in development. The latter files are then picked up by the asset pipeline, digested, and copied into public/assets, as any other asset pipeline file.
10
10
 
11
- This also happens in testing where the bundler attaches to the `test:prepare` task to ensure the JavaScript has been bundled before testing commences. (Note that this currently only applies to rails `test:*` tasks (like `test:all` or `test:controllers`), not "rails test", as that doesn't load `test:prepare`).
12
-
13
- If your testing library of choice does not define a `test:prepare` Rake task, ensure that your test suite runs `javascript:build` to bundle JavaScript before testing commences.
11
+ This also happens in testing where the bundler attaches to the `test:prepare` task to ensure the JavaScript has been bundled before testing commences. If your testing library of choice does not call the `test:prepare` Rake task, ensure that your test suite runs `javascript:build` to bundle JavaScript before testing commences.
14
12
 
15
13
  That's it!
16
14
 
17
- You can configure your bundler options in the `build` script in `package.json` or via the installer-generated `rollup.config.js` for rollup.js or `webpack.config.json` for Webpack (esbuild does not have a default configuration format, and we don't intend to use esbuild as an API in order to hack around it).
15
+ You can configure your bundler options in the `build` script in `package.json` or via the installer-generated `bun.config.js` for Bun, `rollup.config.js` for rollup.js or `webpack.config.json` for Webpack (esbuild does not have a default configuration format, and we don't intend to use esbuild as an API in order to hack around it).
18
16
 
19
17
  If you're already using [`webpacker`](https://github.com/rails/webpacker) and you're wondering if you should migrate to `jsbundling-rails`, have a look at [the high-level comparison](./docs/comparison_with_webpacker.md). If you're looking to migrate from webpacker, see the [migration guide](https://github.com/rails/jsbundling-rails/blob/main/docs/switch_from_webpacker.md).
20
18
 
21
19
  If you want to use webpack features like [code splitting](https://webpack.js.org/guides/code-splitting/) and [hot module reloading](https://webpack.js.org/concepts/hot-module-replacement/), consider using the official fork of `webpacker`, [`shakapacker`](https://github.com/shakacode/shakapacker).
22
20
 
23
21
  ## Installation
22
+ If you are installing esbuild, rollup, or webpack, you must already have node installed on your system. You will also need npx version 7.1.0 or later.
23
+
24
+ If you are using Bun, then you must have the Bun runtime already installed on
25
+ your system.
26
+
27
+ To get started run:
24
28
 
25
- You must already have node and yarn installed on your system. You will also need npx version 7.1.0 or later. Then:
29
+ ```
30
+ ./bin/bundle add jsbundling-rails
31
+ ```
26
32
 
27
- 1. Run `./bin/bundle add jsbundling-rails`
28
- 2. Run `./bin/rails javascript:install:[esbuild|rollup|webpack]`
33
+ ```
34
+ ./bin/rails javascript:install:[bun|esbuild|rollup|webpack]
35
+ ```
29
36
 
30
- Or, in Rails 7+, you can preconfigure your new application to use a specific bundler with `rails new myapp -j [esbuild|rollup|webpack]`.
37
+ Or, in Rails 7+, you can preconfigure your new application to use a specific bundler with `rails new myapp -j [bun|esbuild|rollup|webpack]`.
31
38
 
32
39
 
33
40
  ## FAQ
@@ -36,20 +43,22 @@ Or, in Rails 7+, you can preconfigure your new application to use a specific bun
36
43
 
37
44
  The default build script for esbuild relies on the `app/javascript/*.*` glob pattern to compile multiple entrypoints automatically. This glob pattern is not available by default on Windows, so you need to change the build script in `package.json` to manually list the entrypoints you wish to compile.
38
45
 
39
- ### Why does esbuild overwrite my application.css?
46
+ ### Why does bun/esbuild overwrite my application.css?
40
47
 
41
- If you [import CSS](https://esbuild.github.io/content-types/#css-from-js) in your application.js while using esbuild, you'll be creating both an `app/assets/builds/application.js` _and_ `app/assets/builds/application.css` file when bundling. The latter can conflict with the `app/assets/builds/application.css` produced by [cssbundling-rails](https://github.com/rails/cssbundling-rails). The solution is to either change the output file for esbuild (and the references for that) or for cssbundling. Both are specified in `package.json`.
48
+ If you [import CSS](https://esbuild.github.io/content-types/#css-from-js) in your application.js while using esbuild or Bun, you'll be creating both an `app/assets/builds/application.js` _and_ `app/assets/builds/application.css` file when bundling. The latter can conflict with the `app/assets/builds/application.css` produced by [cssbundling-rails](https://github.com/rails/cssbundling-rails). The solution is to either change the output file for bun/esbuild (and the references for that) or for cssbundling. Both are specified in `package.json`.
42
49
 
43
50
  ### How can I reference static assets in JavaScript code?
44
51
 
45
52
  Suppose you have an image `app/javascript/images/example.png` that you need to reference in frontend code built with esbuild.
46
53
 
47
54
  1. Create the image at `app/javascript/images/example.png`.
48
- 1. In `package.json`, under `"scripts"` and `"build"`, add the option `--loader:.png=file` to the esbuild script, which instructs esbuild to copy png files to the build directory.
49
- 1. When esbuild runs, it will copy the png file to something like `app/assets/builds/example-5SRKKTLZ.png`.
55
+ 1. In `package.json`, under `"scripts"` and `"build"`, add the additional arguments:
56
+ * `--loader:.png=file` This instructs esbuild to copy png files to the build directory.
57
+ * `--asset-names=[name]-[hash].digested` This tells esbuild to append `.digested` to the file name so that sprockets or propshaft will not append an additional digest hash to the file.
58
+ 1. When esbuild runs, it will copy the png file to something like `app/assets/builds/example-5SRKKTLZ.digested.png`.
50
59
  1. In frontend code, the image is available for import by its original name: `import Example from "../images/example.png"`.
51
60
  1. The image itself can now be referenced by its imported name, e.g. in React, `<img src={Example} />`.
52
- 1. The path of the image resolves to `/assets/example-5SRKKTLZ.png`, which is served by the asset pipeline.
61
+ 1. The path of the image resolves to `/assets/example-5SRKKTLZ.digested.png`, which is served by the asset pipeline.
53
62
 
54
63
  ## License
55
64
 
@@ -1,2 +1,2 @@
1
- web: unset PORT && bin/rails server
1
+ web: env RUBY_DEBUG_OPEN=true bin/rails server
2
2
  js: yarn build --watch
@@ -0,0 +1,2 @@
1
+ web: env RUBY_DEBUG_OPEN=true bin/rails server
2
+ js: bun run build --watch
@@ -0,0 +1,37 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+
4
+ const config = {
5
+ sourcemap: "external",
6
+ entrypoints: ["app/javascript/application.js"],
7
+ outdir: path.join(process.cwd(), "app/assets/builds"),
8
+ };
9
+
10
+ const build = async (config) => {
11
+ const result = await Bun.build(config);
12
+
13
+ if (!result.success) {
14
+ if (process.argv.includes('--watch')) {
15
+ console.error("Build failed");
16
+ for (const message of result.logs) {
17
+ console.error(message);
18
+ }
19
+ return;
20
+ } else {
21
+ throw new AggregateError(result.logs, "Build failed");
22
+ }
23
+ }
24
+ };
25
+
26
+ (async () => {
27
+ await build(config);
28
+
29
+ if (process.argv.includes('--watch')) {
30
+ fs.watch(path.join(process.cwd(), "app/javascript"), { recursive: true }, (eventType, filename) => {
31
+ console.log(`File changed: ${filename}. Rebuilding...`);
32
+ build(config);
33
+ });
34
+ } else {
35
+ process.exit(0);
36
+ }
37
+ })();
@@ -0,0 +1,30 @@
1
+ require 'json'
2
+
3
+ apply "#{__dir__}/../install.rb"
4
+
5
+ if Rails.root.join("Procfile.dev").exist?
6
+ append_to_file "Procfile.dev", "js: bun run build --watch\n"
7
+ else
8
+ say "Add default Procfile.dev"
9
+ copy_file "#{__dir__}/Procfile.dev", "Procfile.dev"
10
+
11
+ say "Ensure foreman is installed"
12
+ run "gem install foreman"
13
+ end
14
+
15
+ say "Add default bun.config.js"
16
+ copy_file "#{__dir__}/bun.config.js", "bun.config.js"
17
+
18
+ say "Add build script to package.json"
19
+ package_json = JSON.parse(File.read("package.json"))
20
+ package_json["scripts"] ||= {}
21
+ package_json["scripts"]["build"] = "bun bun.config.js"
22
+ File.write("package.json", JSON.pretty_generate(package_json))
23
+
24
+ say "Add ability to diff lockb to .gitattributes"
25
+ if Rails.root.join(".gitattributes").exist?
26
+ append_to_file ".gitattributes", "\n# See https://bun.sh/docs/install/lockfile\n*.lockb diff=lockb\n"
27
+ else
28
+ copy_file "#{__dir__}/.gitattributes", ".gitattributes"
29
+ end
30
+ say %(Run `git config diff.lockb.textconv bun && git config diff.lockb.binary true` to enable pretty diffs for Bun's .lockb file), :green
data/lib/install/dev CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env sh
2
2
 
3
- if ! gem list foreman -i --silent; then
3
+ if gem list --no-installed --exact --silent foreman; then
4
4
  echo "Installing foreman..."
5
5
  gem install foreman
6
6
  fi
7
7
 
8
+ # Default to port 3000 if not specified
9
+ export PORT="${PORT:-3000}"
10
+
8
11
  exec foreman start -f Procfile.dev "$@"
@@ -1,8 +1,11 @@
1
+ apply "#{__dir__}/../install.rb"
2
+ apply "#{__dir__}/../install_procfile.rb"
3
+
1
4
  say "Install esbuild"
2
5
  run "yarn add esbuild"
3
6
 
4
7
  say "Add build script"
5
- build_script = "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets"
8
+ build_script = "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets"
6
9
 
7
10
  case `npx -v`.to_f
8
11
  when 7.1...8.0
@@ -14,10 +14,10 @@ end
14
14
  if (app_layout_path = Rails.root.join("app/views/layouts/application.html.erb")).exist?
15
15
  say "Add JavaScript include tag in application layout"
16
16
  insert_into_file app_layout_path.to_s,
17
- %(\n <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>), before: /\s*<\/head>/
17
+ %(\n <%= javascript_include_tag "application", "data-turbo-track": "reload", type: "module" %>), before: /\s*<\/head>/
18
18
  else
19
19
  say "Default application.html.erb is missing!", :red
20
- say %( Add <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %> within the <head> tag in your custom layout.)
20
+ say %( Add <%= javascript_include_tag "application", "data-turbo-track": "reload", type: "module" %> within the <head> tag in your custom layout.)
21
21
  end
22
22
 
23
23
  unless (app_js_entrypoint_path = Rails.root.join("app/javascript/application.js")).exist?
@@ -31,16 +31,6 @@ unless Rails.root.join("package.json").exist?
31
31
  copy_file "#{__dir__}/package.json", "package.json"
32
32
  end
33
33
 
34
- if Rails.root.join("Procfile.dev").exist?
35
- append_to_file "Procfile.dev", "js: yarn build --watch\n"
36
- else
37
- say "Add default Procfile.dev"
38
- copy_file "#{__dir__}/Procfile.dev", "Procfile.dev"
39
-
40
- say "Ensure foreman is installed"
41
- run "gem install foreman"
42
- end
43
-
44
34
  say "Add bin/dev to start foreman"
45
35
  copy_file "#{__dir__}/dev", "bin/dev"
46
36
  chmod "bin/dev", 0755, verbose: false
@@ -0,0 +1,9 @@
1
+ if Rails.root.join("Procfile.dev").exist?
2
+ append_to_file "Procfile.dev", "js: yarn build --watch\n"
3
+ else
4
+ say "Add default Procfile.dev"
5
+ copy_file "#{__dir__}/Procfile.dev", "Procfile.dev"
6
+
7
+ say "Ensure foreman is installed"
8
+ run "gem install foreman"
9
+ end
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "app",
3
- "private": "true"
3
+ "private": true
4
4
  }
@@ -1,3 +1,6 @@
1
+ apply "#{__dir__}/../install.rb"
2
+ apply "#{__dir__}/../install_procfile.rb"
3
+
1
4
  say "Install rollup with config"
2
5
  copy_file "#{__dir__}/rollup.config.js", "rollup.config.js"
3
6
  run "yarn add rollup @rollup/plugin-node-resolve"
@@ -4,7 +4,7 @@ export default {
4
4
  input: "app/javascript/application.js",
5
5
  output: {
6
6
  file: "app/assets/builds/application.js",
7
- format: "es",
7
+ format: "esm",
8
8
  inlineDynamicImports: true,
9
9
  sourcemap: true
10
10
  },
@@ -1,3 +1,6 @@
1
+ apply "#{__dir__}/../install.rb"
2
+ apply "#{__dir__}/../install_procfile.rb"
3
+
1
4
  say "Install Webpack with config"
2
5
  copy_file "#{__dir__}/webpack.config.js", "webpack.config.js"
3
6
  run "yarn add webpack webpack-cli"
@@ -10,6 +10,7 @@ module.exports = {
10
10
  output: {
11
11
  filename: "[name].js",
12
12
  sourceMapFilename: "[file].map",
13
+ chunkFormat: "module",
13
14
  path: path.resolve(__dirname, "app/assets/builds"),
14
15
  },
15
16
  plugins: [
@@ -1,3 +1,3 @@
1
1
  module Jsbundling
2
- VERSION = "1.1.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -1,20 +1,76 @@
1
1
  namespace :javascript do
2
+ desc "Install JavaScript dependencies"
3
+ task :install do
4
+ command = Jsbundling::Tasks.install_command
5
+ unless system(command)
6
+ raise "jsbundling-rails: Command install failed, ensure #{command.split.first} is installed"
7
+ end
8
+ end
9
+
2
10
  desc "Build your JavaScript bundle"
3
- task :build do
4
- unless system "yarn install && yarn build"
5
- raise "jsbundling-rails: Command build failed, ensure yarn is installed and `yarn build` runs without errors"
11
+ build_task = task :build do
12
+ command = Jsbundling::Tasks.build_command
13
+ unless system(command)
14
+ raise "jsbundling-rails: Command build failed, ensure `#{command}` runs without errors"
6
15
  end
7
16
  end
17
+
18
+ build_task.prereqs << :install unless ENV["SKIP_YARN_INSTALL"] || ENV["SKIP_BUN_INSTALL"]
8
19
  end
9
20
 
10
- if Rake::Task.task_defined?("assets:precompile")
11
- Rake::Task["assets:precompile"].enhance(["javascript:build"])
21
+ module Jsbundling
22
+ module Tasks
23
+ extend self
24
+
25
+ def install_command
26
+ case tool
27
+ when :bun then "bun install"
28
+ when :yarn then "yarn install"
29
+ when :pnpm then "pnpm install"
30
+ when :npm then "npm install"
31
+ else raise "jsbundling-rails: No suitable tool found for installing JavaScript dependencies"
32
+ end
33
+ end
34
+
35
+ def build_command
36
+ case tool
37
+ when :bun then "bun run build"
38
+ when :yarn then "yarn build"
39
+ when :pnpm then "pnpm build"
40
+ when :npm then "npm run build"
41
+ else raise "jsbundling-rails: No suitable tool found for building JavaScript"
42
+ end
43
+ end
44
+
45
+ def tool_exists?(tool)
46
+ system "command -v #{tool} > /dev/null"
47
+ end
48
+
49
+ def tool
50
+ case
51
+ when File.exist?('bun.lockb') then :bun
52
+ when File.exist?('yarn.lock') then :yarn
53
+ when File.exist?('pnpm-lock.yaml') then :pnpm
54
+ when File.exist?('package-lock.json') then :npm
55
+ when tool_exists?('bun') then :bun
56
+ when tool_exists?('yarn') then :yarn
57
+ when tool_exists?('pnpm') then :pnpm
58
+ when tool_exists?('npm') then :npm
59
+ end
60
+ end
61
+ end
12
62
  end
13
63
 
14
- if Rake::Task.task_defined?("test:prepare")
15
- Rake::Task["test:prepare"].enhance(["javascript:build"])
16
- elsif Rake::Task.task_defined?("spec:prepare")
17
- Rake::Task["spec:prepare"].enhance(["javascript:build"])
18
- elsif Rake::Task.task_defined?("db:test:prepare")
19
- Rake::Task["db:test:prepare"].enhance(["javascript:build"])
64
+ unless ENV["SKIP_JS_BUILD"]
65
+ if Rake::Task.task_defined?("assets:precompile")
66
+ Rake::Task["assets:precompile"].enhance(["javascript:build"])
67
+ end
68
+
69
+ if Rake::Task.task_defined?("test:prepare")
70
+ Rake::Task["test:prepare"].enhance(["javascript:build"])
71
+ elsif Rake::Task.task_defined?("spec:prepare")
72
+ Rake::Task["spec:prepare"].enhance(["javascript:build"])
73
+ elsif Rake::Task.task_defined?("db:test:prepare")
74
+ Rake::Task["db:test:prepare"].enhance(["javascript:build"])
75
+ end
20
76
  end
@@ -1,22 +1,22 @@
1
1
  namespace :javascript do
2
2
  namespace :install do
3
- desc "Install shared elements for all bundlers"
4
- task :shared do
5
- system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../install/install.rb", __dir__)}"
3
+ desc "Install Bun"
4
+ task :bun do
5
+ system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../install/bun/install.rb", __dir__)}"
6
6
  end
7
7
 
8
8
  desc "Install esbuild"
9
- task esbuild: "javascript:install:shared" do
9
+ task :esbuild do
10
10
  system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../install/esbuild/install.rb", __dir__)}"
11
11
  end
12
12
 
13
13
  desc "Install rollup.js"
14
- task rollup: "javascript:install:shared" do
14
+ task :rollup do
15
15
  system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../install/rollup/install.rb", __dir__)}"
16
16
  end
17
17
 
18
18
  desc "Install Webpack"
19
- task webpack: "javascript:install:shared" do
19
+ task :webpack do
20
20
  system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../install/webpack/install.rb", __dir__)}"
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsbundling-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-14 00:00:00.000000000 Z
11
+ date: 2024-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -34,9 +34,13 @@ files:
34
34
  - README.md
35
35
  - lib/install/Procfile.dev
36
36
  - lib/install/application.js
37
+ - lib/install/bun/Procfile.dev
38
+ - lib/install/bun/bun.config.js
39
+ - lib/install/bun/install.rb
37
40
  - lib/install/dev
38
41
  - lib/install/esbuild/install.rb
39
42
  - lib/install/install.rb
43
+ - lib/install/install_procfile.rb
40
44
  - lib/install/package.json
41
45
  - lib/install/rollup/install.rb
42
46
  - lib/install/rollup/rollup.config.js
@@ -67,8 +71,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
71
  - !ruby/object:Gem::Version
68
72
  version: '0'
69
73
  requirements: []
70
- rubygems_version: 3.3.26
74
+ rubygems_version: 3.4.20
71
75
  signing_key:
72
76
  specification_version: 4
73
- summary: Bundle and transpile JavaScript in Rails with esbuild, rollup.js, or Webpack.
77
+ summary: Bundle and transpile JavaScript in Rails with bun, esbuild, rollup.js, or
78
+ Webpack.
74
79
  test_files: []