diff --git a/.github/workflows/lint-js-and-ruby.yml b/.github/workflows/lint-js-and-ruby.yml index 7616b20ea9..1583a3d561 100644 --- a/.github/workflows/lint-js-and-ruby.yml +++ b/.github/workflows/lint-js-and-ruby.yml @@ -107,7 +107,7 @@ jobs: run: cd spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs - name: Detect dead code run: | - yarn run knip + yarn run knip --no-config-hints yarn run knip --production - name: Lint JS run: yarn run eslint --report-unused-disable-directives diff --git a/.github/workflows/pro-integration-tests.yml b/.github/workflows/pro-integration-tests.yml index 8a11cd5d23..51fad7f31b 100644 --- a/.github/workflows/pro-integration-tests.yml +++ b/.github/workflows/pro-integration-tests.yml @@ -92,8 +92,15 @@ jobs: sudo yarn global add yalc yarn install --frozen-lockfile --no-progress --no-emoji + - name: Build and publish packages with yalc + run: | + cd .. + yarn run yalc:publish + cd react_on_rails_pro + yarn && yalc publish + - name: Install Node modules with Yarn for Pro dummy app - run: cd spec/dummy && yarn install --frozen-lockfile --no-progress --no-emoji + run: cd spec/dummy && yarn install --ignore-scripts --no-progress --no-emoji - name: Install Ruby Gems for Pro dummy app run: | @@ -211,8 +218,15 @@ jobs: sudo yarn global add yalc yarn install --frozen-lockfile --no-progress --no-emoji + - name: Build and publish packages with yalc + run: | + cd .. + yarn run yalc:publish + cd react_on_rails_pro + yarn && yalc publish + - name: Install Node modules with Yarn for Pro dummy app - run: cd spec/dummy && yarn install --frozen-lockfile --no-progress --no-emoji + run: cd spec/dummy && yarn install --ignore-scripts --no-progress --no-emoji - name: Ensure minimum required Chrome version run: | @@ -402,8 +416,15 @@ jobs: sudo yarn global add yalc yarn install --frozen-lockfile --no-progress --no-emoji + - name: Build and publish packages with yalc + run: | + cd .. + yarn run yalc:publish + cd react_on_rails_pro + yarn && yalc publish + - name: Install Node modules with Yarn for Pro dummy app - run: cd spec/dummy && yarn install --frozen-lockfile --no-progress --no-emoji + run: cd spec/dummy && yarn install --ignore-scripts --no-progress --no-emoji - name: Ensure minimum required Chrome version run: | diff --git a/SHAKAPACKER_UPGRADE_PR_PLAN.md b/SHAKAPACKER_UPGRADE_PR_PLAN.md new file mode 100644 index 0000000000..7d1b1d6678 --- /dev/null +++ b/SHAKAPACKER_UPGRADE_PR_PLAN.md @@ -0,0 +1,338 @@ +# Shakapacker 9.3.0 Upgrade - PR Breakdown Strategy + +## Current Status + +- **Master branch**: Shakapacker 8.2.0 (per Gemfile.lock) +- **Feature branch**: Shakapacker 9.3.0 +- **Total changes**: 90 commits, 402 files modified + +## Key Architectural Notes + +- **Babel**: Used for non-React Server Components +- **SWC**: Used for React Server Components +- **React version**: React 19 with conditional exports ('react-server' vs 'default') + +--- + +## Recommended PR Sequence + +### PR #1: Preparatory Refactoring (Low Risk) + +**Goal**: Extract changes that improve code quality without changing behavior + +**Commits to cherry-pick**: + +- `517f1579` - Fix unsafe system calls to use array form in pack_generator.rb +- `5186da7a` - Fix bin/dev pack generation in Bundler context +- `1c37907f` - Skip generate_packs when shakapacker precompile hook configured +- `e33826f8` - Fix generator robustness issues + +**Files changed**: + +- `lib/react_on_rails/dev/pack_generator.rb` +- `lib/react_on_rails/engine.rb` +- `lib/generators/react_on_rails/base_generator.rb` + +**Why first**: These are bug fixes and safety improvements that work with 8.2.0 + +**Risk**: Low - No dependency changes + +--- + +### PR #2: Version Validation Improvements (Low Risk) + +**Goal**: Improve version checking to handle Shakapacker upgrade scenarios + +**Commits to cherry-pick**: + +- `45821a25` - Add lockfile version resolution for exact version checking +- `777bee2e` - Skip version validation when package.json doesn't exist during setup +- `2def04b0` - Fix CI failure by skipping version validation during generator runtime +- `ae5425bd` - Fix generator validation by using environment variable +- `8b7fb6a1` - Skip version validation when react-on-rails package not installed +- `0d87ea75` - Unify release scripts and add strict version validation + +**Files changed**: + +- `lib/react_on_rails/version_checker.rb` +- `lib/react_on_rails/packer_utils.rb` +- `lib/generators/react_on_rails/base_generator.rb` +- Test files for version checking + +**Why second**: Sets up better version checking before we start upgrading + +**Risk**: Low - Only affects validation, not runtime behavior + +--- + +### PR #3: Babel Configuration Updates (Medium Risk) + +**Goal**: Update Babel config detection for Shakapacker 9.x path changes + +**Commits to cherry-pick**: + +- `6b76f956` - Fix using_swc? to properly parse YAML and default to babel +- `f454ea0d` - Update using_swc? to return true by default for Shakapacker 9.3.0 + +**Files changed**: + +- `lib/react_on_rails/packer_utils.rb` +- Test specs + +**Why third**: Shakapacker 9.x changed babel preset paths from `shakapacker/package/babel/preset.js` to different locations + +**Risk**: Medium - Changes transpilation detection logic + +**Testing needed**: + +- Verify non-RSC components still use Babel +- Verify RSC components can use SWC + +--- + +### PR #4: CSS Modules Compatibility Fix (Medium Risk) + +**Goal**: Fix CSS Modules namedExport issue with Shakapacker 9.x + +**Commits to cherry-pick**: + +- `364b730b` - Fix CSS Modules compatibility with Shakapacker 9.0.0 + +**Files changed**: + +- `spec/dummy/config/webpack/commonWebpackConfig.js` +- `react_on_rails_pro/spec/dummy/config/webpack/commonWebpackConfig.js` + +**Background**: +Shakapacker 9.0+ defaults CSS Modules to `namedExport: true`, breaking existing code that uses `import styles from './file.module.css'`. Need to override with `namedExport: false`. + +**Why fourth**: CSS issues will break builds + +**Risk**: Medium - Changes webpack configuration + +**Testing needed**: Verify CSS Modules work in dummy apps + +--- + +### PR #5: SWC Loader Support (Medium Risk) + +**Goal**: Add SWC loader configuration for RSC bundles + +**Commits to cherry-pick**: + +- `c86f217e` - Add swc-loader support for Shakapacker 9.3.0 +- `ef315c91` - Add swc-loader to React on Rails generator dependencies +- `e7f23659` - Move swc-loader and @swc/core to devDependencies + +**Files changed**: + +- `lib/generators/react_on_rails/install_generator.rb` +- `packages/react-on-rails-pro/package.json` +- Generator templates + +**Why fifth**: Sets up SWC before the Shakapacker upgrade + +**Risk**: Medium - Adds new dependency but doesn't require it yet + +**Testing needed**: Verify RSC bundles can use SWC + +--- + +### PR #6: Core Shakapacker Upgrade 8.2.0 → 9.3.0 (HIGH RISK) + +**Goal**: Update Shakapacker gem and npm package versions + +**Commits to cherry-pick**: + +- `0b21a528` - Update shakapacker dependency to version 9.3.0 +- `c895c45b` - Update shakapacker gem version to 9.3.0 in Pro Gemfiles +- `8a6bb6e2` - Update Pro dummy app yarn.lock for Shakapacker 9.3.0 +- `eea877e4` - Update execjs-compatible-dummy yarn.lock for Shakapacker 9.3.0 + +**Files changed**: + +- `Gemfile.lock` +- `spec/dummy/Gemfile.lock` +- `spec/dummy/yarn.lock` +- `react_on_rails_pro/Gemfile*` +- Various `yarn.lock` files + +**Why sixth**: This is the actual version bump + +**Risk**: HIGH - Version upgrade can break everything + +**Testing needed**: + +- Run full test suite +- Test all dummy apps +- Test generators +- Manual testing of example apps + +--- + +### PR #7: React 19 Import Compatibility Fix (HIGH RISK) + +**Goal**: Fix React import issues with TypeScript + React 19 conditional exports + +**Commits to cherry-pick**: + +- `1129f940` - Fix React 19 server bundle errors by using named imports (YOUR LATEST FIX) +- `a229abc0` - Fix React 18.0.0 compatibility by using React namespace imports + +**Files changed**: + +- `packages/react-on-rails-pro/src/RSCProvider.tsx` +- `packages/react-on-rails-pro/src/RSCRoute.tsx` + +**Background**: +React 19 has conditional exports (`react-server` vs `default`). TypeScript with `esModuleInterop: false` was generating invalid imports like `import ReactClient from 'react/index.js'`. Fixed by using named imports: `import { createContext, useContext } from 'react'`. + +**Why seventh**: Fixes breaking changes introduced by React 19 + Shakapacker 9.3.0 + +**Risk**: HIGH - Core RSC functionality + +**Testing needed**: + +- Build server bundles +- Test RSC components render correctly +- Verify no import errors + +--- + +### PR #8: Generator Template Updates (Medium Risk) + +**Goal**: Update generator templates for Shakapacker 9.3.0 + +**Commits to cherry-pick**: + +- `6e55fe0f` - Remove Shakapacker config changes from generator templates +- Related generator fixes + +**Files changed**: + +- `lib/generators/react_on_rails/templates/**` +- Generator specs + +**Why eighth**: Templates need to generate 9.3.0-compatible configs + +**Risk**: Medium - Affects new installations only + +--- + +### PR #9: Cleanup and Documentation (Low Risk) + +**Goal**: Clean up temporary fixes and update docs + +**Commits to include**: + +- Any reverts from previous attempts +- Documentation updates about Babel vs SWC +- Changelog entries + +**Files changed**: + +- `CHANGELOG.md` +- `docs/**` +- `CLAUDE.md` updates + +**Why last**: Clean up after everything works + +**Risk**: Low - Documentation only + +--- + +## Alternative Strategy: Three Focused PRs + +If 9 PRs seems too granular: + +### **Fast Track Option - 3 PRs** + +#### **PR A: Infrastructure Prep (Steps 1-2)** + +- Bug fixes + version validation improvements +- ~10 commits, low risk +- Can merge independently + +#### **PR B: Shakapacker 9.3.0 Core Upgrade (Steps 3-6)** + +- Babel/SWC detection + CSS Modules + SWC support + version bump +- ~15-20 commits, HIGH risk +- Thorough testing required + +#### **PR C: React 19 Compatibility + Polish (Steps 7-9)** + +- React import fixes + generator updates + docs +- ~15 commits, medium-high risk +- Depends on PR B + +--- + +## Testing Checklist (For Each PR) + +- [ ] `bundle exec rubocop` passes with zero offenses +- [ ] `bundle exec rake lint` passes +- [ ] `bundle exec rake all_but_examples` passes +- [ ] Dummy app builds successfully +- [ ] Pro dummy app builds successfully +- [ ] Generator produces working apps +- [ ] Manual smoke test of key features +- [ ] CI passes on all workflows + +--- + +## Key Decisions Needed + +1. **How many PRs do you want?** + + - 9 small PRs: Maximum safety, easier review, slower progress + - 3 medium PRs: Good balance of safety and speed + - 1-2 large PRs: Fastest but highest risk per review + +2. **What's the timeline?** + + - Aggressive (1 week): Go with 2-3 large PRs + - Moderate (2-3 weeks): Go with 3 medium PRs + - Conservative (4+ weeks): Go with 9 small PRs + +3. **Are there active users/production systems?** + + - Yes → More smaller PRs for safety + - No/Internal only → Larger PRs acceptable + +4. **What's your testing capacity?** + - Limited → Smaller PRs with focused testing + - Full QA team → Larger PRs with comprehensive testing + +--- + +## Recommended Approach + +Based on the fact that you mentioned 9.2.0 (though git shows 8.2.0), I recommend: + +### **3 Medium PRs (Fast Track)** + +This balances: + +- ✅ Manageable review size +- ✅ Clear separation of concerns +- ✅ Reasonable risk per PR +- ✅ Can complete in 2-3 weeks +- ✅ Each PR provides value independently + +**Timeline**: + +- Week 1: PR A (prep) - merge after 1-2 days +- Week 2: PR B (core upgrade) - thorough testing, merge after 4-5 days +- Week 3: PR C (React 19 + polish) - merge after 3-4 days + +--- + +## Next Steps + +1. **Confirm your preference**: 3, 6, or 9 PRs? +2. **I'll create a new branch for PR #1** with the appropriate commits cherry-picked +3. **Test locally** before pushing +4. **Create PR** with clear description of changes and testing done +5. **Repeat** for subsequent PRs + +Would you like me to start with PR A (Infrastructure Prep)? diff --git a/TURBO_NAVIGATION_TEST_ISSUE.md b/TURBO_NAVIGATION_TEST_ISSUE.md new file mode 100644 index 0000000000..3416545692 --- /dev/null +++ b/TURBO_NAVIGATION_TEST_ISSUE.md @@ -0,0 +1,188 @@ +# Issue: Add Playwright Test to Catch Turbo Navigation Regression + +## Summary + +A regression was discovered where JavaScript fails to work after navigating between pages using Turbo links (only works on hard refresh). This issue existed in the codebase for over a year but wasn't caught by automated tests. + +## Background + +### What Happened + +**Bug introduced in:** PR #1620 (commit 56ee2bd9, ~1 year ago) + +- Added Turbo (Hotwire) support to replace Turbolinks +- Updated client-bundle.js to import `@hotwired/turbo-rails` +- Set `turbo: true` in ReactOnRails options +- **Forgot to update layout file** from `data-turbolinks-track` to `data-turbo-track` + +**Bug fixed in:** PR #1896 (commit f03b935d) + +- Updated `spec/dummy/app/views/layouts/application.html.erb` +- Changed `data-turbolinks-track: true` to `data-turbo-track: 'reload'` +- Re-added `defer: true` for proper Turbo compatibility + +### Impact + +Users experienced broken JavaScript when: + +1. Landing on a page (hard refresh) → ✅ JavaScript works +2. Clicking a link to navigate → ❌ JavaScript breaks +3. Hard refreshing again → ✅ JavaScript works again + +This severely degraded the user experience with Turbo navigation. + +## The Test Gap + +This bug went undetected for over a year, indicating a gap in test coverage for: + +- Turbo navigation flows +- JavaScript execution after client-side navigation +- React component hydration after Turbo page loads + +## Proposed Solution: Playwright E2E Test + +Add a Playwright test that verifies: + +### Test Scenario + +```javascript +test('React components work after Turbo navigation', async ({ page }) => { + // 1. Hard refresh - load first page + await page.goto('/react_router'); + + // 2. Verify JavaScript works on initial load + await expect(page.locator('input#name')).toBeVisible(); + await page.fill('input#name', 'Initial Page'); + await expect(page.locator('h3')).toContainText('Initial Page'); + + // 3. Click a Turbo link to navigate to second page + await page.click('a[href="/react_router/second_page"]'); + await page.waitForURL('/react_router/second_page'); + + // 4. Verify JavaScript STILL works after Turbo navigation + await expect(page.locator('input#name')).toBeVisible(); + await page.fill('input#name', 'After Turbo Navigation'); + await expect(page.locator('h3')).toContainText('After Turbo Navigation'); + + // 5. Navigate back + await page.click('a[href="/react_router"]'); + await page.waitForURL('/react_router'); + + // 6. Verify JavaScript works after navigating back + await expect(page.locator('input#name')).toBeVisible(); + await page.fill('input#name', 'After Back Navigation'); + await expect(page.locator('h3')).toContainText('After Back Navigation'); +}); +``` + +### What This Test Catches + +✅ JavaScript execution after Turbo navigation +✅ React component hydration on client-side page loads +✅ Proper data attributes for Turbo compatibility +✅ Component lifecycle management with Turbo + +## Verification Steps + +To verify the Playwright test works correctly: + +### Step 1: Ensure Test Passes with Fix + +```bash +# Current state (with fix) - test should PASS +npm run test:e2e -- --grep "Turbo navigation" +``` + +### Step 2: Revert the Fix + +```bash +# Revert to broken state +git show f03b935d:spec/dummy/app/views/layouts/application.html.erb > spec/dummy/app/views/layouts/application.html.erb + +# Change line 13 back to: +# <%= javascript_pack_tag('client-bundle', 'data-turbolinks-track': true) %> +``` + +### Step 3: Verify Test Fails + +```bash +# With reverted fix - test should FAIL +npm run test:e2e -- --grep "Turbo navigation" + +# Expected failure: +# Error: Timeout waiting for element 'input#name' after Turbo navigation +``` + +### Step 4: Restore the Fix + +```bash +# Restore the fix +git checkout HEAD spec/dummy/app/views/layouts/application.html.erb + +# Test should PASS again +npm run test:e2e -- --grep "Turbo navigation" +``` + +## Implementation Checklist + +- [ ] Create Playwright test file: `spec/dummy/spec/playwright/turbo_navigation.spec.js` +- [ ] Add test that verifies React components work after Turbo navigation +- [ ] Verify test passes with current fix in place +- [ ] Manually revert fix and confirm test fails (proves test is effective) +- [ ] Restore fix and confirm test passes again +- [ ] Add test to CI pipeline +- [ ] Document in CONTRIBUTING.md that Turbo navigation must be tested + +## Additional Test Cases to Consider + +1. **Multiple navigations**: Navigate through 3-4 pages to ensure no memory leaks +2. **Back/forward buttons**: Test browser back/forward with Turbo +3. **Turbo Frames**: Test components inside turbo frames +4. **Turbo Streams**: Test components updated via turbo streams (Pro feature) +5. **Redux stores**: Verify store state persists/resets appropriately + +## Files to Create/Modify + +```tree +spec/dummy/spec/playwright/ + ├── turbo_navigation.spec.js (new) + └── support/ + └── turbo_helpers.js (new - optional helper functions) + +.github/workflows/ + └── playwright.yml (update to run new tests) + +docs/contributor-info/ + └── testing-turbo-navigation.md (new - documentation) +``` + +## Success Criteria + +- [ ] Playwright test exists and passes in CI +- [ ] Test catches the regression when fix is reverted +- [ ] Test is documented and maintainable +- [ ] Test runs in <30 seconds +- [ ] No false positives in CI + +## References + +- **Original Turbo PR**: #1620 (56ee2bd9) +- **Fix commit**: f03b935d +- **Turbo documentation**: docs/building-features/turbolinks.md +- **Related issue**: This regression went undetected for 1+ year + +## Notes for Implementer + +- Use React on Rails Pro dummy app for testing (has more Turbo features) +- Consider using Playwright's `page.route()` to simulate slow networks +- Add `data-testid` attributes to components if needed for reliable selectors +- Test both development and production webpack builds +- Ensure test works with different Turbo Drive settings (`turbo: true/false`) + +--- + +**Priority**: High - This prevents regressions in core Turbo functionality + +**Estimated effort**: 2-4 hours (including documentation and verification) + +**Labels**: testing, playwright, turbo, e2e, regression-prevention diff --git a/lib/generators/react_on_rails/base_generator.rb b/lib/generators/react_on_rails/base_generator.rb index bce4b5de55..1756b8063f 100644 --- a/lib/generators/react_on_rails/base_generator.rb +++ b/lib/generators/react_on_rails/base_generator.rb @@ -2,6 +2,7 @@ require "rails/generators" require "fileutils" +require "yaml" require_relative "generator_messages" require_relative "generator_helper" module ReactOnRails @@ -183,11 +184,21 @@ def add_react_dependencies react_deps = %w[ react react-dom - @babel/preset-react prop-types - babel-plugin-transform-react-remove-prop-types - babel-plugin-macros ] + + # Add compiler-specific dependencies + # If using swc, add swc packages; otherwise add babel packages + react_deps += if using_swc? + %w[@swc/core swc-loader] + else + %w[ + @babel/preset-react + babel-plugin-transform-react-remove-prop-types + babel-plugin-macros + ] + end + return if add_npm_dependencies(react_deps) success = system("npm", "install", *react_deps) @@ -220,6 +231,25 @@ def add_dev_dependencies handle_npm_failure("development dependencies", dev_deps, dev: true) unless success end + def using_swc? + # Check shakapacker.yml for javascript_compiler setting + # Parse YAML to properly handle comments and get actual configured value + shakapacker_config_path = File.join(destination_root, "config", "shakapacker.yml") + return false unless File.exist?(shakapacker_config_path) + + begin + config = YAML.safe_load_file(shakapacker_config_path) + # Check default section for javascript_compiler setting + javascript_compiler = config.dig("default", "javascript_compiler") + # Return true only if explicitly set to "swc" + javascript_compiler == "swc" + rescue StandardError => e + # If YAML parsing fails, default to babel (false) + puts "Warning: Could not parse shakapacker.yml: #{e.message}" + false + end + end + def install_js_dependencies # Detect which package manager to use success = if File.exist?(File.join(destination_root, "yarn.lock")) diff --git a/lib/generators/react_on_rails/generator_helper.rb b/lib/generators/react_on_rails/generator_helper.rb index 8ebb641592..fa34cea669 100644 --- a/lib/generators/react_on_rails/generator_helper.rb +++ b/lib/generators/react_on_rails/generator_helper.rb @@ -2,6 +2,7 @@ require "rainbow" require "json" +require_relative "generator_messages" module GeneratorHelper def package_json @@ -95,4 +96,35 @@ def add_documentation_reference(message, source) def component_extension(options) options.typescript? ? "tsx" : "jsx" end + + # Detects the package manager based on lock files and returns the appropriate command and exact flag + # Returns: [package_manager, exact_flag, add_command] + # Examples: ["yarn", "--exact", "add"], ["npm", "--save-exact", "install"] + def detect_package_manager_and_exact_flag + lock_files = { + "yarn.lock" => ["yarn", "--exact", "add"], + "pnpm-lock.yaml" => ["pnpm", "--save-exact", "add"], + "bun.lockb" => ["bun", "--exact", "add"], + "package-lock.json" => ["npm", "--save-exact", "install"] + } + + detected = [] + lock_files.each do |lock_file, config| + detected << [lock_file, config] if File.exist?(File.join(destination_root, lock_file)) + end + + # Warn if multiple lock files detected + if detected.size > 1 + GeneratorMessages.add_warning(<<~MSG.strip) + ⚠️ Multiple package manager lock files detected: + #{detected.map { |lf, _| " • #{lf}" }.join("\n")} + + This can cause dependency conflicts. Consider using only one package manager. + Using #{detected.first[0]} based on file precedence. + MSG + end + + # Return first detected, or default to npm + detected.empty? ? ["npm", "--save-exact", "install"] : detected.first[1] + end end diff --git a/lib/generators/react_on_rails/install_generator.rb b/lib/generators/react_on_rails/install_generator.rb index f39168bc37..bf7eae04c6 100644 --- a/lib/generators/react_on_rails/install_generator.rb +++ b/lib/generators/react_on_rails/install_generator.rb @@ -461,25 +461,20 @@ def add_js_dependencies def add_react_on_rails_package major_minor_patch_only = /\A\d+\.\d+\.\d+\z/ - # Try to use package_json gem first, fall back to direct npm commands + # Use detected package manager with --save-exact flag to ensure exact version matching react_on_rails_pkg = if ReactOnRails::VERSION.match?(major_minor_patch_only) - ["react-on-rails@#{ReactOnRails::VERSION}"] + "react-on-rails@#{ReactOnRails::VERSION}" else puts "Adding the latest react-on-rails NPM module. " \ "Double check this is correct in package.json" - ["react-on-rails"] + "react-on-rails" end puts "Installing React on Rails package..." - if add_npm_dependencies(react_on_rails_pkg) - @added_dependencies_to_package_json = true - return - end - - puts "Using direct npm commands as fallback" - success = system("npm", "install", *react_on_rails_pkg) + package_manager, exact_flag, add_command = detect_package_manager_and_exact_flag + success = system(package_manager, add_command, exact_flag, react_on_rails_pkg) @ran_direct_installs = true if success - handle_npm_failure("react-on-rails package", react_on_rails_pkg) unless success + handle_npm_failure("react-on-rails package", [react_on_rails_pkg]) unless success end def add_react_dependencies @@ -497,7 +492,8 @@ def add_react_dependencies return end - success = system("npm", "install", *react_deps) + package_manager, _exact_flag, add_command = detect_package_manager_and_exact_flag + success = system(package_manager, add_command, *react_deps) @ran_direct_installs = true if success handle_npm_failure("React dependencies", react_deps) unless success end @@ -515,7 +511,8 @@ def add_css_dependencies return end - success = system("npm", "install", *css_deps) + package_manager, _exact_flag, add_command = detect_package_manager_and_exact_flag + success = system(package_manager, add_command, *css_deps) @ran_direct_installs = true if success handle_npm_failure("CSS dependencies", css_deps) unless success end @@ -555,7 +552,10 @@ def add_dev_dependencies return end - success = system("npm", "install", "--save-dev", *dev_deps) + package_manager, _exact_flag, add_command = detect_package_manager_and_exact_flag + # For dev dependencies, we need to add the --dev or -D flag depending on the package manager + dev_flag = package_manager == "npm" ? "--save-dev" : "-D" + success = system(package_manager, add_command, dev_flag, *dev_deps) @ran_direct_installs = true if success handle_npm_failure("development dependencies", dev_deps, dev: true) unless success end diff --git a/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml b/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml index 7ce2699e68..5a27cf5c37 100644 --- a/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +++ b/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml @@ -4,6 +4,10 @@ default: &default source_path: app/javascript + # Hook to run before compilation (e.g., for ReScript builds, pack generation) + # See: https://github.com/shakacode/shakapacker/blob/main/docs/precompile_hook.md + precompile_hook: bin/shakapacker-precompile-hook + # You can have a subdirectory of the source_path, like 'packs' (recommended). # Alternatively, you can use '/' to use the whole source_path directory. # Notice that this is a relative path to source_path @@ -36,9 +40,6 @@ default: &default # Reload manifest.json on all requests so we reload latest compiled packs cache_manifest: false - # Select loader to use, available options are 'babel' (default), 'swc' or 'esbuild' - webpack_loader: 'babel' - # Raises an error if there is a mismatch in the shakapacker gem and npm package being used ensure_consistent_versioning: true @@ -55,6 +56,12 @@ default: &default # https://webpack.js.org/guides/build-performance/#avoid-production-specific-tooling useContentHash: false + # Compiler to use for JavaScript: 'babel' or 'swc' + # SWC is faster but Babel has more plugins and wider ecosystem support + # React on Rails defaults to Babel if not specified for wider compatibility + # Uncomment and set to 'swc' for faster compilation: + # javascript_compiler: swc + # Setting the asset host here will override Rails.application.config.asset_host. # Here, you can set different asset_host per environment. Note that # SHAKAPACKER_ASSET_HOST will override both configurations. diff --git a/package-scripts.yml b/package-scripts.yml index 26657f1441..6027491034 100644 --- a/package-scripts.yml +++ b/package-scripts.yml @@ -26,7 +26,7 @@ scripts: # 4. If it failed, print an error message (still follow https://docs.npmjs.com/cli/v8/using-npm/scripts#best-practices). script: > [ -f packages/react-on-rails/lib/ReactOnRails.full.js ] || - (npm run build >/dev/null 2>&1 || true) && + (yarn run build >/dev/null 2>&1 || true) && [ -f packages/react-on-rails/lib/ReactOnRails.full.js ] || { echo 'Building react-on-rails seems to have failed!'; } diff --git a/rakelib/shakapacker_examples.rake b/rakelib/shakapacker_examples.rake index 47b56fc583..2d51a8d439 100644 --- a/rakelib/shakapacker_examples.rake +++ b/rakelib/shakapacker_examples.rake @@ -34,7 +34,7 @@ namespace :shakapacker_examples do # rubocop:disable Metrics/BlockLength sh_in_dir(example_type.dir, "touch .gitignore") sh_in_dir(example_type.dir, "echo \"gem 'react_on_rails', path: '#{relative_gem_root}'\" >> #{example_type.gemfile}") - sh_in_dir(example_type.dir, "echo \"gem 'shakapacker', '>= 8.2.0'\" >> #{example_type.gemfile}") + sh_in_dir(example_type.dir, "echo \"gem 'shakapacker', '>= 9.3.0'\" >> #{example_type.gemfile}") bundle_install_in(example_type.dir) sh_in_dir(example_type.dir, "rake shakapacker:install") diff --git a/react_on_rails_pro/spec/dummy/client/app/components/HelloWorld.module.scss b/react_on_rails_pro/spec/dummy/client/app/components/HelloWorld.module.scss index ae58c25083..3b77eb394e 100644 --- a/react_on_rails_pro/spec/dummy/client/app/components/HelloWorld.module.scss +++ b/react_on_rails_pro/spec/dummy/client/app/components/HelloWorld.module.scss @@ -1,3 +1,5 @@ +@import "../assets/styles/app-variables.scss"; + .brightColor { color: $bright-color; -} \ No newline at end of file +} diff --git a/react_on_rails_pro/spec/dummy/package.json b/react_on_rails_pro/spec/dummy/package.json index 6497a0bc00..d9cd0c5444 100644 --- a/react_on_rails_pro/spec/dummy/package.json +++ b/react_on_rails_pro/spec/dummy/package.json @@ -79,6 +79,7 @@ "@babel/preset-typescript": "^7.23.2", "@playwright/test": "^1.56.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.3", + "@swc/core": "^1.7.0", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.9", @@ -88,6 +89,8 @@ "jsdom": "^16.4.0", "pino-pretty": "^13.0.0", "preload-webpack-plugin": "^3.0.0-alpha.1", + "shakapacker": "9.3.0", + "swc-loader": "^0.2.6", "typescript": "^5.2.2", "webpack-dev-server": "^4.7.3" }, diff --git a/react_on_rails_pro/spec/dummy/yarn.lock b/react_on_rails_pro/spec/dummy/yarn.lock index 8c11e6e81a..03ea4b45c5 100644 --- a/react_on_rails_pro/spec/dummy/yarn.lock +++ b/react_on_rails_pro/spec/dummy/yarn.lock @@ -1245,6 +1245,87 @@ resolved "https://registry.yarnpkg.com/@shakacode/use-ssr-computation.runtime/-/use-ssr-computation.runtime-2.0.0.tgz#3944be3dd57e036d794def69bd7a10cc26978e95" integrity sha512-cWeekG6ehf3TtBUWmKtitQgXZOcqLlodmzCccWniAsE+1VmwcIJzCagTu72Ocq8fCtgfdMs94XSu314zfeWFAw== +"@swc/core-darwin-arm64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.14.0.tgz#1db614b52ed7369f47be2a1c6b5e80b6be923898" + integrity sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q== + +"@swc/core-darwin-x64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.14.0.tgz#900e56924994d0e723e6088e2a2e1a1c08c59a95" + integrity sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA== + +"@swc/core-linux-arm-gnueabihf@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.14.0.tgz#3c84966a8c6e308b0788d1c7875bce23c65134c6" + integrity sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg== + +"@swc/core-linux-arm64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.14.0.tgz#5190097d2ca4ea8b198f46a3abe2272331575b54" + integrity sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ== + +"@swc/core-linux-arm64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.14.0.tgz#420f510102a37feda0e3dfb8d21651515251476b" + integrity sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ== + +"@swc/core-linux-x64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.14.0.tgz#953f741d577a81f6e1e1b434856c48eb674cdeb7" + integrity sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ== + +"@swc/core-linux-x64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.14.0.tgz#bdf241062d1433ba617ffe1451dccde8923a28a2" + integrity sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw== + +"@swc/core-win32-arm64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.14.0.tgz#960919015bc31c46a8fc10df5c384add651df91e" + integrity sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A== + +"@swc/core-win32-ia32-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.14.0.tgz#826a76b2af0e4df4dee3674e91734cb85eb7b21f" + integrity sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ== + +"@swc/core-win32-x64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.14.0.tgz#75fe708a702f57f176fd640eb9af394cf767be91" + integrity sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg== + +"@swc/core@^1.7.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.14.0.tgz#ff7d287fbac6b6fd3adedf7b440cadfd0c389df6" + integrity sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.25" + optionalDependencies: + "@swc/core-darwin-arm64" "1.14.0" + "@swc/core-darwin-x64" "1.14.0" + "@swc/core-linux-arm-gnueabihf" "1.14.0" + "@swc/core-linux-arm64-gnu" "1.14.0" + "@swc/core-linux-arm64-musl" "1.14.0" + "@swc/core-linux-x64-gnu" "1.14.0" + "@swc/core-linux-x64-musl" "1.14.0" + "@swc/core-win32-arm64-msvc" "1.14.0" + "@swc/core-win32-ia32-msvc" "1.14.0" + "@swc/core-win32-x64-msvc" "1.14.0" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.25": + version "0.1.25" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" + integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== + dependencies: + "@swc/counter" "^0.1.3" + "@tailwindcss/aspect-ratio@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz#9ffd52fee8e3c8b20623ff0dcb29e5c21fb0a9ba" @@ -2262,6 +2343,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2997,7 +3087,7 @@ es5-shim@^4.5.9: resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955" integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== -escalade@^3.2.0: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -3443,7 +3533,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6173,7 +6263,7 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6191,15 +6281,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -6223,7 +6304,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6237,13 +6318,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -6331,6 +6405,13 @@ svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" +swc-loader@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz#bf0cba8eeff34bb19620ead81d1277fefaec6bc8" + integrity sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg== + dependencies: + "@swc/counter" "^0.1.3" + symbol-observable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" @@ -6937,6 +7018,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -6981,6 +7071,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -7004,6 +7099,11 @@ yargs-parser@^15.0.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" @@ -7021,6 +7121,19 @@ yargs@14.2.0: y18n "^4.0.0" yargs-parser "^15.0.0" +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/react_on_rails_pro/spec/execjs-compatible-dummy/Gemfile b/react_on_rails_pro/spec/execjs-compatible-dummy/Gemfile index 466feb7f95..636a2b0ef9 100644 --- a/react_on_rails_pro/spec/execjs-compatible-dummy/Gemfile +++ b/react_on_rails_pro/spec/execjs-compatible-dummy/Gemfile @@ -61,7 +61,7 @@ group :test do gem "selenium-webdriver" end -gem "shakapacker", "= 8.0" +gem "shakapacker", "= 9.3.0" gem "react_on_rails", path: "../../.." gem "react_on_rails_pro", path: "../.." diff --git a/react_on_rails_pro/spec/execjs-compatible-dummy/package.json b/react_on_rails_pro/spec/execjs-compatible-dummy/package.json index e9a55af6fb..8a531c5d85 100644 --- a/react_on_rails_pro/spec/execjs-compatible-dummy/package.json +++ b/react_on_rails_pro/spec/execjs-compatible-dummy/package.json @@ -44,7 +44,9 @@ }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@swc/core": "^1.7.0", "react-refresh": "^0.14.2", + "swc-loader": "^0.2.6", "webpack-dev-server": "4" } } diff --git a/react_on_rails_pro/spec/execjs-compatible-dummy/yarn.lock b/react_on_rails_pro/spec/execjs-compatible-dummy/yarn.lock index 6ba79d26f1..8cd0a1576b 100644 --- a/react_on_rails_pro/spec/execjs-compatible-dummy/yarn.lock +++ b/react_on_rails_pro/spec/execjs-compatible-dummy/yarn.lock @@ -934,6 +934,87 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@swc/core-darwin-arm64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.14.0.tgz#1db614b52ed7369f47be2a1c6b5e80b6be923898" + integrity sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q== + +"@swc/core-darwin-x64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.14.0.tgz#900e56924994d0e723e6088e2a2e1a1c08c59a95" + integrity sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA== + +"@swc/core-linux-arm-gnueabihf@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.14.0.tgz#3c84966a8c6e308b0788d1c7875bce23c65134c6" + integrity sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg== + +"@swc/core-linux-arm64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.14.0.tgz#5190097d2ca4ea8b198f46a3abe2272331575b54" + integrity sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ== + +"@swc/core-linux-arm64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.14.0.tgz#420f510102a37feda0e3dfb8d21651515251476b" + integrity sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ== + +"@swc/core-linux-x64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.14.0.tgz#953f741d577a81f6e1e1b434856c48eb674cdeb7" + integrity sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ== + +"@swc/core-linux-x64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.14.0.tgz#bdf241062d1433ba617ffe1451dccde8923a28a2" + integrity sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw== + +"@swc/core-win32-arm64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.14.0.tgz#960919015bc31c46a8fc10df5c384add651df91e" + integrity sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A== + +"@swc/core-win32-ia32-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.14.0.tgz#826a76b2af0e4df4dee3674e91734cb85eb7b21f" + integrity sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ== + +"@swc/core-win32-x64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.14.0.tgz#75fe708a702f57f176fd640eb9af394cf767be91" + integrity sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg== + +"@swc/core@^1.7.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.14.0.tgz#ff7d287fbac6b6fd3adedf7b440cadfd0c389df6" + integrity sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.25" + optionalDependencies: + "@swc/core-darwin-arm64" "1.14.0" + "@swc/core-darwin-x64" "1.14.0" + "@swc/core-linux-arm-gnueabihf" "1.14.0" + "@swc/core-linux-arm64-gnu" "1.14.0" + "@swc/core-linux-arm64-musl" "1.14.0" + "@swc/core-linux-x64-gnu" "1.14.0" + "@swc/core-linux-x64-musl" "1.14.0" + "@swc/core-win32-arm64-msvc" "1.14.0" + "@swc/core-win32-ia32-msvc" "1.14.0" + "@swc/core-win32-x64-msvc" "1.14.0" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.25": + version "0.1.25" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" + integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== + dependencies: + "@swc/counter" "^0.1.3" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -1387,7 +1468,12 @@ ansi-html@^0.0.9: resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.9.tgz#6512d02342ae2cc68131952644a129cb734cd3f0" integrity sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg== -ansi-styles@^4.1.0: +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1615,6 +1701,15 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -1994,6 +2089,11 @@ electron-to-chromium@^1.5.73: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz#d90008c4f8a506c1a6d1b329f922d83e18904101" integrity sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -2058,7 +2158,7 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== -escalade@^3.2.0: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -2269,6 +2369,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -2521,6 +2626,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3465,6 +3575,11 @@ regjsparser@^0.12.0: dependencies: jsesc "~3.0.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -3775,6 +3890,15 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -3789,6 +3913,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -3839,6 +3970,13 @@ svgo@^3.3.2: csso "^5.0.5" picocolors "^1.0.0" +swc-loader@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz#bf0cba8eeff34bb19620ead81d1277fefaec6bc8" + integrity sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg== + dependencies: + "@swc/counter" "^0.1.3" + tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -4120,6 +4258,15 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4130,6 +4277,11 @@ ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -4139,3 +4291,21 @@ yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" diff --git a/script/convert b/script/convert index b68d7c26fa..e580349b09 100755 --- a/script/convert +++ b/script/convert @@ -17,9 +17,9 @@ end # Keep shakapacker.yml since we're using Shakapacker 8+ # move("../spec/dummy/config/shakapacker.yml", "../spec/dummy/config/webpacker.yml") -# Shakapacker - use version with async script loading support (8.2.0+) -gsub_file_content("../Gemfile.development_dependencies", /gem "shakapacker", "[^"]*"/, 'gem "shakapacker", "8.2.0"') -gsub_file_content("../spec/dummy/package.json", /"shakapacker": "[^"]*",/, '"shakapacker": "8.2.0",') +# Shakapacker - use version with async script loading support (9.3.0+) +gsub_file_content("../Gemfile.development_dependencies", /gem "shakapacker", "[^"]*"/, 'gem "shakapacker", "9.3.0"') +gsub_file_content("../spec/dummy/package.json", /"shakapacker": "[^"]*",/, '"shakapacker": "9.3.0",') # The below packages don't work on the oldest supported Node version and aren't needed there anyway # Note: All dev dependencies remain in root package.json even after workspace migration diff --git a/spec/dummy/client/app/components/HelloWorld.module.scss b/spec/dummy/client/app/components/HelloWorld.module.scss index 55339905f4..3b77eb394e 100644 --- a/spec/dummy/client/app/components/HelloWorld.module.scss +++ b/spec/dummy/client/app/components/HelloWorld.module.scss @@ -1,3 +1,5 @@ +@import "../assets/styles/app-variables.scss"; + .brightColor { color: $bright-color; } diff --git a/spec/dummy/package.json b/spec/dummy/package.json index 7769dc7e5e..d409e49b81 100644 --- a/spec/dummy/package.json +++ b/spec/dummy/package.json @@ -29,6 +29,7 @@ "regenerator-runtime": "^0.13.4" }, "devDependencies": { + "@swc/core": "^1.7.0", "@babel/core": "7.17.9", "@babel/plugin-transform-runtime": "7.17.0", "@babel/preset-env": "7", @@ -53,6 +54,7 @@ "sass-resources-loader": "^2.1.0", "shakapacker": "9.2.0", "style-loader": "^3.3.1", + "swc-loader": "^0.2.6", "terser-webpack-plugin": "5.3.1", "url-loader": "^4.0.0", "webpack": "5.72.0", diff --git a/spec/dummy/yarn.lock b/spec/dummy/yarn.lock index 835bc0d002..41296649a9 100644 --- a/spec/dummy/yarn.lock +++ b/spec/dummy/yarn.lock @@ -1362,6 +1362,87 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@swc/core-darwin-arm64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.14.0.tgz#1db614b52ed7369f47be2a1c6b5e80b6be923898" + integrity sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q== + +"@swc/core-darwin-x64@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.14.0.tgz#900e56924994d0e723e6088e2a2e1a1c08c59a95" + integrity sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA== + +"@swc/core-linux-arm-gnueabihf@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.14.0.tgz#3c84966a8c6e308b0788d1c7875bce23c65134c6" + integrity sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg== + +"@swc/core-linux-arm64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.14.0.tgz#5190097d2ca4ea8b198f46a3abe2272331575b54" + integrity sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ== + +"@swc/core-linux-arm64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.14.0.tgz#420f510102a37feda0e3dfb8d21651515251476b" + integrity sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ== + +"@swc/core-linux-x64-gnu@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.14.0.tgz#953f741d577a81f6e1e1b434856c48eb674cdeb7" + integrity sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ== + +"@swc/core-linux-x64-musl@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.14.0.tgz#bdf241062d1433ba617ffe1451dccde8923a28a2" + integrity sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw== + +"@swc/core-win32-arm64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.14.0.tgz#960919015bc31c46a8fc10df5c384add651df91e" + integrity sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A== + +"@swc/core-win32-ia32-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.14.0.tgz#826a76b2af0e4df4dee3674e91734cb85eb7b21f" + integrity sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ== + +"@swc/core-win32-x64-msvc@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.14.0.tgz#75fe708a702f57f176fd640eb9af394cf767be91" + integrity sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg== + +"@swc/core@^1.7.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.14.0.tgz#ff7d287fbac6b6fd3adedf7b440cadfd0c389df6" + integrity sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.25" + optionalDependencies: + "@swc/core-darwin-arm64" "1.14.0" + "@swc/core-darwin-x64" "1.14.0" + "@swc/core-linux-arm-gnueabihf" "1.14.0" + "@swc/core-linux-arm64-gnu" "1.14.0" + "@swc/core-linux-arm64-musl" "1.14.0" + "@swc/core-linux-x64-gnu" "1.14.0" + "@swc/core-linux-x64-musl" "1.14.0" + "@swc/core-win32-arm64-msvc" "1.14.0" + "@swc/core-win32-ia32-msvc" "1.14.0" + "@swc/core-win32-x64-msvc" "1.14.0" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.25": + version "0.1.25" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" + integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== + dependencies: + "@swc/counter" "^0.1.3" + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -5967,6 +6048,13 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swc-loader@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz#bf0cba8eeff34bb19620ead81d1277fefaec6bc8" + integrity sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg== + dependencies: + "@swc/counter" "^0.1.3" + symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -6468,7 +6556,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==