From 7d61174bb56af93d183c4e2b316793ed21222836 Mon Sep 17 00:00:00 2001 From: Andy Cohen Date: Tue, 28 Jul 2026 17:28:38 -0500 Subject: [PATCH 1/2] Add yarn_command to GeneratorBase --- .../rolemodel/linters/eslint/eslint_generator.rb | 3 +-- lib/generators/rolemodel/optics/base/base_generator.rb | 3 +-- lib/generators/rolemodel/react/react_generator.rb | 3 +-- lib/generators/rolemodel/sentry/sentry_generator.rb | 3 +-- .../tailored_select/tailored_select_generator.rb | 3 +-- .../jasmine_playwright/jasmine_playwright_generator.rb | 6 +----- .../rolemodel/testing/rspec/rspec_generator.rb | 5 ++--- .../rolemodel/testing/vitest/vitest_generator.rb | 3 +-- .../rolemodel/turbo/confirm/confirm_generator.rb | 3 +-- lib/generators/rolemodel/turbo/form/form_generator.rb | 3 +-- .../rolemodel/ui_components/navbar/navbar_generator.rb | 3 +-- lib/generators/rolemodel/webpack/webpack_generator.rb | 10 ++-------- lib/rolemodel/generator_base.rb | 8 +++++++- lib/rolemodel/yarn.rb | 5 ++--- 14 files changed, 23 insertions(+), 38 deletions(-) diff --git a/lib/generators/rolemodel/linters/eslint/eslint_generator.rb b/lib/generators/rolemodel/linters/eslint/eslint_generator.rb index 248cf01a..42d86015 100644 --- a/lib/generators/rolemodel/linters/eslint/eslint_generator.rb +++ b/lib/generators/rolemodel/linters/eslint/eslint_generator.rb @@ -18,8 +18,7 @@ class EslintGenerator < GeneratorBase ].freeze def install_eslint - ensure_yarn - run "yarn add --dev #{DEV_DEPENDENCIES.join(' ')}" + yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" end def add_config diff --git a/lib/generators/rolemodel/optics/base/base_generator.rb b/lib/generators/rolemodel/optics/base/base_generator.rb index efe335ff..0598f420 100644 --- a/lib/generators/rolemodel/optics/base/base_generator.rb +++ b/lib/generators/rolemodel/optics/base/base_generator.rb @@ -6,8 +6,7 @@ class BaseGenerator < Rolemodel::GeneratorBase def add_optics_package say 'installing Optics package', :green - ensure_yarn - run 'yarn add @rolemodel/optics' + yarn_command 'add @rolemodel/optics' end def copy_templates diff --git a/lib/generators/rolemodel/react/react_generator.rb b/lib/generators/rolemodel/react/react_generator.rb index 7b5b283e..c652cb7c 100644 --- a/lib/generators/rolemodel/react/react_generator.rb +++ b/lib/generators/rolemodel/react/react_generator.rb @@ -6,8 +6,7 @@ def add_npm_packages @add_react = yes?('Would you like to add react?') if @add_react - ensure_yarn - run 'yarn add react react-dom' + yarn_command 'add react react-dom' end end diff --git a/lib/generators/rolemodel/sentry/sentry_generator.rb b/lib/generators/rolemodel/sentry/sentry_generator.rb index f517d781..f05db37e 100644 --- a/lib/generators/rolemodel/sentry/sentry_generator.rb +++ b/lib/generators/rolemodel/sentry/sentry_generator.rb @@ -43,8 +43,7 @@ def add_user_context def add_js_dependencies say 'Adding Sentry JS dependencies to package.json', :green - ensure_yarn - run "yarn add --dev #{JS_DEPS.join(' ')}" + yarn_command "add --dev #{JS_DEPS.join(' ')}" end def add_js_initializer diff --git a/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb b/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb index a061b5b9..38446a71 100644 --- a/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb +++ b/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb @@ -7,8 +7,7 @@ class TailoredSelectGenerator < GeneratorBase def add_tailored_select_package say 'Installing Tailored Select package', :green - ensure_yarn - run 'yarn add @rolemodel/tailored-select' + yarn_command 'add @rolemodel/tailored-select' end def add_simple_form_input diff --git a/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb b/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb index 58e51ba1..a39745ac 100644 --- a/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb +++ b/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb @@ -18,10 +18,6 @@ def fail_without_github_token raise Thor::InvocationError, 'a --github_package_token option or GITHUB_PACKAGES_TOKEN environment variable is required' if options[:github_package_token].blank? end - def enable_corepack_and_yarn - ensure_yarn - end - def add_browser_test_script say 'Adding yarn test:browser command', :green @@ -37,7 +33,7 @@ def set_node_version def add_dev_dependencies say 'Adding new dev dependency to package.json', :green - run "yarn add --dev #{DEV_DEPENDENCIES.join(' ')}" + yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" end def add_spec_config_files diff --git a/lib/generators/rolemodel/testing/rspec/rspec_generator.rb b/lib/generators/rolemodel/testing/rspec/rspec_generator.rb index e23e225f..018c4b06 100644 --- a/lib/generators/rolemodel/testing/rspec/rspec_generator.rb +++ b/lib/generators/rolemodel/testing/rspec/rspec_generator.rb @@ -27,9 +27,8 @@ def bundle_install def install_playwright say 'Installing Playwright for system tests', :green - ensure_yarn - run 'yarn add --dev playwright' - run 'yarn run playwright install' + yarn_command 'add --dev playwright' + yarn_command 'run playwright install' end def add_spec_files diff --git a/lib/generators/rolemodel/testing/vitest/vitest_generator.rb b/lib/generators/rolemodel/testing/vitest/vitest_generator.rb index 4c25c34e..579fd52a 100644 --- a/lib/generators/rolemodel/testing/vitest/vitest_generator.rb +++ b/lib/generators/rolemodel/testing/vitest/vitest_generator.rb @@ -16,7 +16,6 @@ class VitestGenerator < GeneratorBase def update_test_script say 'Update yarn test command', :green - ensure_yarn add_package_json_script 'test', TEST_COMMAND end @@ -24,7 +23,7 @@ def update_test_script def add_dev_dependencies say 'Adding new dev dependency to package.json', :green - run "yarn add --dev #{DEV_DEPENDENCIES.join(' ')}" + yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" end def add_spec_config_files diff --git a/lib/generators/rolemodel/turbo/confirm/confirm_generator.rb b/lib/generators/rolemodel/turbo/confirm/confirm_generator.rb index 4edafb89..fd11817a 100644 --- a/lib/generators/rolemodel/turbo/confirm/confirm_generator.rb +++ b/lib/generators/rolemodel/turbo/confirm/confirm_generator.rb @@ -6,8 +6,7 @@ class ConfirmGenerator < ::Rolemodel::GeneratorBase def add_turbo_confirm_package say 'Installing Turbo Confirm package', :green - ensure_yarn - run 'yarn add @rolemodel/turbo-confirm' + yarn_command 'add @rolemodel/turbo-confirm' end def add_initializer diff --git a/lib/generators/rolemodel/turbo/form/form_generator.rb b/lib/generators/rolemodel/turbo/form/form_generator.rb index ceba805a..f563a896 100644 --- a/lib/generators/rolemodel/turbo/form/form_generator.rb +++ b/lib/generators/rolemodel/turbo/form/form_generator.rb @@ -6,8 +6,7 @@ class FormGenerator < GeneratorBase def add_rails_request_package say 'Installing @rails/request.js package', :green - ensure_yarn - run 'yarn add @rails/request.js' + yarn_command 'add @rails/request.js' end def add_stimulus_controller diff --git a/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb b/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb index e8ace7e5..9cb00422 100644 --- a/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb +++ b/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb @@ -25,8 +25,7 @@ def insert_navbar_before_content def install_shoelace say 'Installing Shoelace package', :green - ensure_yarn - run 'yarn add @shoelace-style/shoelace' + yarn_command 'add @shoelace-style/shoelace' end def add_shoelace_javascript_imports diff --git a/lib/generators/rolemodel/webpack/webpack_generator.rb b/lib/generators/rolemodel/webpack/webpack_generator.rb index 2c2a0b92..81b1f8c4 100644 --- a/lib/generators/rolemodel/webpack/webpack_generator.rb +++ b/lib/generators/rolemodel/webpack/webpack_generator.rb @@ -41,12 +41,6 @@ def ensure_node_version create_file '.node-version', NODE_VERSION, force: true end - def enable_corepack_and_yarn - say 'Enabling Corepack and pinning the project to Yarn 4+', :green - - ensure_yarn - end - def force_node_to_use_es_modules say 'Configuring project to use ES Modules instead of CommonJS', :green @@ -56,14 +50,14 @@ def force_node_to_use_es_modules def remove_obsolete_javascript_dependencies say 'Removing webpack & webpack-cli from package.json dependencies', :green - run 'yarn remove webpack webpack-cli' + yarn_command 'remove webpack webpack-cli' end def add_npm_packages say 'Adding new dev dependencies to package.json', :green dependencies = DEV_DEPS + POSTCSS_PKGS + WEBPACK_CSS_PKGS - run "yarn add --dev #{dependencies.join(' ')}" + yarn_command "add --dev #{dependencies.join(' ')}" end def add_webpack_config diff --git a/lib/rolemodel/generator_base.rb b/lib/rolemodel/generator_base.rb index 74ab5638..339d8754 100644 --- a/lib/rolemodel/generator_base.rb +++ b/lib/rolemodel/generator_base.rb @@ -9,19 +9,25 @@ module Rolemodel class GeneratorBase < ::Rails::Generators::Base include ::Rails::Generators::BundleHelper, ReplaceContentHelper - private # based on https://github.com/rails/rails/blob/main/railties/lib/rails/generators/app_base.rb#L713 def run_bundle bundle_command("install --quiet", "BUNDLE_IGNORE_MESSAGES" => "1") end + def yarn_command(command) + ensure_yarn + + run "yarn #{command}" + end + # Enable Corepack and pin the project to Yarn 4+ before running any `yarn` # command. Empty args/opts are required: without them, Thor forwards this # generator's own CLI args (e.g. the test harness's --skip-bundle # --skip-bootsnap) into Rolemodel::Yarn#setup, which takes none and raises # Thor::InvocationError. def ensure_yarn + return if Rails.root.join(destination_root, '.yarnrc.yml').exist? invoke 'rolemodel:yarn:setup', [], {} end diff --git a/lib/rolemodel/yarn.rb b/lib/rolemodel/yarn.rb index 8e500790..b352aeb5 100644 --- a/lib/rolemodel/yarn.rb +++ b/lib/rolemodel/yarn.rb @@ -5,11 +5,10 @@ module Rolemodel class Yarn < ::Thor include ::Thor::Actions - # Enable Corepack and pin the project to Yarn 4+ (instead of the classic - # Yarn 1.22). Idempotent, so any generator can call it before running a - # `yarn` command to guarantee the modern toolchain is in place. + # Enable Corepack and pin the project to Yarn 4+ (instead of the classic Yarn 1.22). desc 'setup', 'Set the current stable version of Yarn, enable corepack, and initialize a package.json file' def setup + say 'Setting up Yarn 4+ and Corepack', :green # Configure the node-modules linker so webpack, Playwright, and the Rails # asset pipeline keep working (Yarn 4 defaults to Plug'n'Play otherwise). # skip if exists? to avoid overwriting any other existing config From 2523013da0f82d54775f8781f4c2822eb6b7f252 Mon Sep 17 00:00:00 2001 From: Andy Cohen Date: Tue, 28 Jul 2026 17:42:57 -0500 Subject: [PATCH 2/2] fix failing specs --- .../jasmine_playwright_generator.rb | 12 ++++++------ .../rolemodel/testing/vitest/vitest_generator.rb | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb b/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb index a39745ac..a880d403 100644 --- a/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb +++ b/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb @@ -18,6 +18,12 @@ def fail_without_github_token raise Thor::InvocationError, 'a --github_package_token option or GITHUB_PACKAGES_TOKEN environment variable is required' if options[:github_package_token].blank? end + def add_dev_dependencies + say 'Adding new dev dependency to package.json', :green + + yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" + end + def add_browser_test_script say 'Adding yarn test:browser command', :green @@ -30,12 +36,6 @@ def set_node_version create_file '.node-version', NODE_VERSION, force: true end - def add_dev_dependencies - say 'Adding new dev dependency to package.json', :green - - yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" - end - def add_spec_config_files say 'Adding Jasmine Playwright configuration files', :green diff --git a/lib/generators/rolemodel/testing/vitest/vitest_generator.rb b/lib/generators/rolemodel/testing/vitest/vitest_generator.rb index 579fd52a..7e78ecf1 100644 --- a/lib/generators/rolemodel/testing/vitest/vitest_generator.rb +++ b/lib/generators/rolemodel/testing/vitest/vitest_generator.rb @@ -14,18 +14,18 @@ class VitestGenerator < GeneratorBase @vitest/ui ].freeze - def update_test_script - say 'Update yarn test command', :green - - add_package_json_script 'test', TEST_COMMAND - end - def add_dev_dependencies say 'Adding new dev dependency to package.json', :green yarn_command "add --dev #{DEV_DEPENDENCIES.join(' ')}" end + def update_test_script + say 'Update yarn test command', :green + + add_package_json_script 'test', TEST_COMMAND + end + def add_spec_config_files say 'Adding Vitest configuration files', :green