diff --git a/.opencode/agents/ruby-gem-updater.md b/.opencode/agents/ruby-gem-updater.md new file mode 100644 index 00000000..1cb9680a --- /dev/null +++ b/.opencode/agents/ruby-gem-updater.md @@ -0,0 +1,68 @@ +--- +description: Execute Ruby gem updates with version checking, breaking change analysis, and testing +mode: subagent +model: minimax-coding-plan/MiniMax-M2.5 +permission: + skill: + "ruby-gem-update": "allow" + "rspec-testing": "allow" + "*": "deny" +tools: + bash: true + read: true + edit: true + write: true + grep: true + glob: true + webfetch: true +--- + +You are a Ruby gem update specialist focused on safely updating gems in the Linkvan API project. + +## Your Responsibilities + +### Gem Updates + +1. **Version Checking** + - Identify current gem version from Gemfile + - Fetch latest version from RubyGems + - Check GitHub release notes for breaking changes + +2. **Security Advisory Check** + - Check for security vulnerabilities in the gem + - Prioritize security updates + +3. **Breaking Change Analysis** + - Review release notes for breaking changes + - Check if codebase uses deprecated features + - Plan any required code migrations + +4. **Execution** + - Update Gemfile version constraint + - Run bundle update + - Verify installation + - Run tests to confirm + +### Workflow + +1. When user asks to update a gem: + - Use `ruby-gem-update` skill for the complete workflow + - Always present a plan to the user before making changes + - Get explicit approval before updating + +2. After update: + - Report results clearly + - Note any issues if tests fail + +## Guidelines + +- Always check Ruby version compatibility +- Review breaking changes for major version jumps +- Run `bin/rspec` after every update (per AGENTS.md) +- Report results clearly to user + +## Important Notes + +- Test command: `bin/rspec` (not `bundle exec rspec`) +- Use pessimistic version constraints (`~> X.Y`) for minor updates +- For major updates, review all breaking changes carefully diff --git a/.opencode/skills/plans/SKILL.md b/.opencode/skills/plans/SKILL.md new file mode 100644 index 00000000..3a8eabd8 --- /dev/null +++ b/.opencode/skills/plans/SKILL.md @@ -0,0 +1,186 @@ +--- +name: plans +description: Create, execute, update, and complete implementation plans and trackers following Linkvan API conventions +--- + +## When to Use This Skill + +- User requests a plan for any significant change (upgrades, refactoring, new features) +- Breaking down large tasks into executable stages +- Creating a documented roadmap for complex changes +- **User asks about plan progress or status** (check and report) +- **Plan is finished or user indicates completion** (update README.md, plan.md, tracker.md) +- **Plan items are being executed** (update tracker progress during execution) + +## Plan Structure + +### Required Files + +Create in this structure: +``` +docs/plans/ +├── README.md # Index of all plans (update this) +└── / + ├── plan.md # Detailed plan document + └── tracker.md # Progress tracker +``` + +### Plan Template + +[plan-template.md](templates/plan-template.md) + +### Tracker Template + +[tracker-template.md](templates/tracker-template.md) + +## Key Conventions + +1. **Always update docs/plans/README.md** - Add new plan to the Active Plans table + +2. **Manual tests** - Add at risky checkpoints: + - After bundle updates + - Before enabling new configs + - Final verification + +3. **Gradual rollout** - For framework upgrades: + - Keep `config.load_defaults` at old version initially + - Test with defaults disabled first + - Enable defaults gradually + - Only then update load_defaults + +4. **Link to sources** - Reference: + - Official docs (Rails guides, gem docs) + - AGENTS.md for project conventions + - Related plans if applicable + +5. **Include rollback** - Always document how to undo changes if issues occur + +## Creating a New Plan + +1. Create directory: `mkdir -p docs/plans/` +2. Copy templates from skill: + ```bash + cp .opencode/skills/plans/templates/plan-template.md docs/plans//plan.md + cp .opencode/skills/plans/templates/tracker-template.md docs/plans//tracker.md + ``` +3. Customize for specific change +4. Add plan to README.md Active Plans table +5. Set status to "Not Started" in tracker + +## Documentation Pattern + +### plan.md should include: +- **Status** (PENDING | IN PROGRESS | COMPLETE) +- **Created** date +- **Goal** - Clear objective +- **Priority Levels** (CRITICAL, HIGH, MEDIUM, LOW) +- **Detailed Items** with file/directory location, priority, estimated time, implementation details +- **Implementation Guidelines** - Patterns to follow +- **Quality Checks** - Steps to verify completion + +### tracker.md should include: +- Link to plan.md +- **Created** and **Last Updated** dates +- **Summary Table** - Total/In Progress/Completed counts by priority +- **Item Tables** - Detailed status for each item +- **Blockers & Dependencies** - Cross-item dependencies +- **Progress Tracking** - Visual progress bars +- **Status Legend** - Icon meanings (⬜ Not Started, 🔄 In Progress, ✅ Completed, ⏸️ On Hold, 🚫 Blocked) +- **Change Log** - History of updates + +## Status Guidelines + +- **PENDING** - Plan documented but no work begun +- **IN PROGRESS** - Currently being worked on +- **COMPLETE** - All plan items successfully implemented +- **On Hold** - Work paused indefinitely + +## Executing Plans + +When running a plan: +1. Update tracker status as you go +2. Mark items complete when verified +3. Add notes to tracker after each stage +4. Update last updated date + +--- + +## Updating Progress + +**When updating progress, always update the tracker first**, then update other files as needed: + +### tracker.md Updates (During Execution) +- Update item status: `⬜ Not Started` → `🔄 In Progress` → `✅ Completed` +- Update Summary table counts (Total, Not Started, In Progress, Completed) +- Update Progress Tracking bar +- Add change log entries with date and notes +- Update blockers section if issues arise + +### Partial Completion (Plan Still In Progress) +After completing a stage or significant milestone: +1. Update relevant item statuses in tracker.md +2. Update Summary table +3. Update Progress Tracking bar +4. Add change log entry + +--- + +## Completing Plans + +When a plan is finished (all items complete or appropriately skipped/N/A), update all three files: + +### 1. docs/plans/README.md +Update the Active Plans table row for this plan: +- **Status**: Change to `Complete` +- **Progress**: Change to `XX/XX (100%)` + +### 2. docs/plans//plan.md +- **Status**: Change from `IN PROGRESS` or `PENDING` to `COMPLETE` +- **Completion Criteria**: Check off all completed items +- Update any "Future" or "To Do" items to reflect actual completion + +### 3. docs/plans//tracker.md +- **Summary table**: Ensure all counts are correct (Not Started = 0, Completed = Total) +- **Progress Tracking**: Update to 100% - full bar +- **Last Updated**: Update to today's date with note like "ALL ITEMS COMPLETE" +- **Blockers section**: Mark all blockers as resolved/complete +- **Change log**: Add final completion entry + +### Example Final Updates + +**README.md:** +```markdown +| [Plan Name](plan-name/plan.md) | Complete | 13/13 (100%) | YYYY-MM-DD | +``` + +**plan.md:** +```markdown +## Status: COMPLETE +``` + +**tracker.md:** +```markdown +## Last Updated: YYYY-MM-DD (ALL ITEMS COMPLETE) + +| Priority | Total | Not Started | In Progress | Completed | N/A | +|----------|-------|-------------|-------------|-----------|-----| +| CRITICAL | 3 | 0 | 0 | 3 | 0 | +| HIGH | 4 | 0 | 0 | 4 | 0 | +| MEDIUM | 3 | 0 | 0 | 3 | 0 | +| LOW | 3 | 0 | 0 | 3 | 0 | +| **TOTAL**| **13**| **0** | **0** | **13** | **0** | + +Overall: ████████████████████████████ 13/13 items (100%) +``` + +--- + +## Checklist: Plan Completion + +When user asks "Is the plan finished?" or indicates plan is complete: + +- [ ] Verify all items in tracker.md are complete (not 0 Not Started) +- [ ] Update README.md - mark plan as Complete +- [ ] Update plan.md - change status to COMPLETE, check off criteria +- [ ] Update tracker.md - ensure 100% progress, all complete, blockers resolved +- [ ] Report summary of what was done diff --git a/.opencode/skills/plans/templates/plan-template.md b/.opencode/skills/plans/templates/plan-template.md new file mode 100644 index 00000000..2bea2fec --- /dev/null +++ b/.opencode/skills/plans/templates/plan-template.md @@ -0,0 +1,88 @@ +# + +## Status: PENDING | IN PROGRESS | COMPLETE + +## Created: + +## Goal +Clear, concise objective of what this plan achieves + +## Current State +- What exists now +- Version numbers, configs, etc. + +## Target State +- What we're changing to +- Expected outcome + +## Analysis Summary +- Key changes required +- Dependencies/gems involved +- Breaking changes if any + +## Priority System + +- **CRITICAL** - Must complete for success +- **HIGH** - Should complete for full compatibility +- **MEDIUM** - Recommended for best practices +- **LOW** - Optional improvements + +## Manual Test Protocol + +**What "Manual Test" Means:** At specific checkpoints, I will **ask you** (the user) to test the application manually in your browser/local environment. I cannot run browser-based tests myself. + +**Protocol:** +1. I will pause execution at each manual test checkpoint +2. I will tell you exactly what to test and how +3. You test and report back pass/fail +4. I continue based on your feedback + +--- + +## Implementation Stages + +### Stage X: + +**Focus:** One logical grouping of tasks + +#### X.1 +- **Priority:** CRITICAL | HIGH | MEDIUM | LOW +- **Type:** Configuration | Code Fix | Verification | Manual +- **Location:** `path/to/file` +- **Command:** `bin/rails ...` (if applicable) +- **Description:** What this task does +- **Manual Test:** (if applicable - what user should test) + +--- + +## Quality Checks + +### Stage X Completion Criteria +- [ ] Task completed +- [ ] Tests pass +- [ ] Verified manually (if required) + +--- + +## Rollback Plan + +If issues occur: +1. Step to undo +2. Step to undo +3. Step to undo + +--- + +## Estimated Time + +| Stage | Tasks | Time | +|-------|-------|------| +| 1 | 3 | 15 min | +| Total | 12 | ~60 min | + +--- + +## Related Documentation + +- [Rails Upgrade Guide](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html) +- [AGENTS.md](../../AGENTS.md) diff --git a/.opencode/skills/plans/templates/tracker-template.md b/.opencode/skills/plans/templates/tracker-template.md new file mode 100644 index 00000000..4bcc021e --- /dev/null +++ b/.opencode/skills/plans/templates/tracker-template.md @@ -0,0 +1,79 @@ +# Tracker + +## Plan Reference + +[plan.md](plan.md) + +--- + +## Created: +## Last Updated: + +--- + +## Summary + +| Priority | Total | Not Started | In Progress | Completed | Blocked | +|----------|-------|-------------|-------------|-----------|---------| +| CRITICAL | 5 | 5 | 0 | 0 | 0 | +| HIGH | 3 | 3 | 0 | 0 | 0 | +| **TOTAL**| **8**| **8** | **0** | **0** | **0** | + +--- + +## Stage X: + +### Item Tables + +#### X.1 - + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| X.1 | CRITICAL | ⬜ Not Started | app/models/foo.rb | Description | + +--- + +## Dependencies + +- Stage 1 must complete before Stage 2 +- etc. + +### Blockers + +None identified at this time. + +--- + +## Progress Tracking + +``` +Stage 1 (CRITICAL): ░░░░░░░░░░░░░░░░░░░░ 0/3 items (0%) +Overall: ░░░░░░░░░░░░░░░░░░░░ 0/8 items (0%) +``` + +--- + +## Status Legend + +| Icon | Status | +|------|--------| +| ⬜ | Not Started | +| 🔄 | In Progress | +| ✅ | Completed | +| ⏸️ | On Hold | +| 🚫 | Blocked | + +--- + +## Change Log + +| Date | Change | Author | +|------|--------|--------| +| YYYY-MM-DD | Initial plan creation | Assistant | + +--- + +## Notes + +- Any additional context +- Known issues diff --git a/.opencode/skills/ruby-gem-update/SKILL.md b/.opencode/skills/ruby-gem-update/SKILL.md new file mode 100644 index 00000000..7a4d7b73 --- /dev/null +++ b/.opencode/skills/ruby-gem-update/SKILL.md @@ -0,0 +1,219 @@ +--- +name: ruby-gem-update +description: Standardized Ruby gem update workflow with version checking, breaking change analysis, security advisory detection, and testing +license: MIT +compatibility: opencode +metadata: + audience: developers + language: ruby +--- + +## When to Use This Skill + +- User asks to update a gem (e.g., "update puma", "upgrade faker", "bump devise version") +- Performing routine gem maintenance +- Responding to security advisories +- User wants to check if a gem needs updating + +## Prerequisites + +- This skill works with Ruby/Rails projects using Bundler +- Test command: `bin/rspec` (per AGENTS.md conventions) + +## Complete Workflow + +### Phase 1: Discovery + +#### Step 1.1: Identify Current Version +- Read the Gemfile to find the gem and its current version constraint +- Also check `.ruby-lsp/Gemfile.lock` if present +- Note the current installed version from Gemfile.lock + +#### Step 1.2: Check if Gem is Already a Dependency +Before adding or updating a gem explicitly in Gemfile, check Gemfile.lock to see if it's already pulled in as a dependency: +- If the gem appears under another gem's dependencies, it's already installed +- Only add/update explicitly if: + - The user specifically requests it + - There's a version constraint conflict that requires it + - The gem needs a different version than what the dependency pulls in + +#### Step 1.3: Check RubyGems for Latest Version +- Fetch: `https://rubygems.org/gems/` +- Record: + - Latest version number + - Required Ruby version + - License + - Runtime dependencies + +#### Step 1.4: Check GitHub Release Notes +- Fetch: `https://github.com///releases` +- Look for: + - Breaking changes between current and latest version + - Deprecated/removed features + - Security fixes + - Ruby version requirement changes +- Check major versions (v6.x → v7.x) carefully for breaking changes + +### Phase 2: Security Advisory Check + +#### Step 2.1: Check RubySec Advisories +- Fetch: `https://rubysec.com/` or search for advisories on the gem +- Check: `https://github.com/rubygems/rubygems/tree/master/security` +- Also check: Gem's GitHub security tab + +#### Step 2.2: Evaluate Risk +- If security advisory exists: + - Note severity (Critical/High/Medium/Low) + - Determine if update is urgent +- If no advisory, proceed with normal update process + +### Phase 3: Breaking Change Analysis + +#### Step 3.1: Parse Release Notes +For each version between current and latest: +- Look for "Breaking Changes" sections +- Note renamed APIs (e.g., `on_worker_boot` → `before_worker_boot`) +- Note removed deprecated features +- Note configuration changes + +#### Step 3.2: Check Codebase Usage +- If deprecated features found in release notes: + - Search codebase with grep for the deprecated API + - Note what needs to be updated + - Prepare migration steps + +### Phase 4: Planning + +#### Step 4.1: Create Update Plan +Present to user with: +- Current version vs latest version +- Version type (patch/minor/major) +- Ruby requirement compatibility +- Breaking changes found +- Security advisories (if any) +- Code changes needed (if any) +- Proposed steps + +#### Step 4.2: Get User Approval +Wait for user confirmation before proceeding with: +- Gemfile changes +- Bundle updates +- Code migrations + +### Phase 5: Execution + +#### Step 5.1: Update Gemfile +- Edit Gemfile to change version constraint +- Use pessimistic version constraint for minor updates: `~> X.Y` +- Use specific version for major updates: `= X.0.0` + +#### Step 5.2: Run Bundle Update +```bash +bundle update +``` + +#### Step 5.3: Verify Installation +```bash +bundle exec --version +``` +Or for gems without CLI: +```bash +bundle exec ruby -e "require ''; puts ::VERSION" +``` + +#### Step 5.4: Run Tests +```bash +bin/rspec +``` + +### Phase 6: Reporting + +#### Step 6.1: Report Results +- New version installed +- Test results (pass/fail) +- Any issues encountered + +#### Step 6.2: Handle Failures +If tests fail: +1. Analyze failure message +2. Check if related to gem update +3. If breaking change caused failure: + - Document the issue + - Suggest fix to user + - Do NOT proceed without user approval + +## Version Constraint Guide + +| Update Type | Constraint Example | Notes | +|-------------|---------------------|-------| +| Patch only | `~> 1.0.0` | Allows 1.0.x | +| Minor | `~> 1.4` | Allows 1.x (x >= 4) | +| Major | `= 2.0.0` | Lock to specific version | +| Latest | `~> 3.6` | Allows any 3.x | + +## Common Version Upgrade Patterns + +### Minor/Patch Updates +- Generally safe +- Run tests to verify +- Check release notes for any notable changes + +### Major Updates +- Review breaking changes carefully +- May require code updates +- Test thoroughly +- Consider incremental updates (e.g., 6.x → 7.x → 8.x) + +### Security Updates +- Prioritize based on severity +- May require immediate action +- Check for exploit availability + +## Example: Complete Update Workflow + +``` +User: Update puma + +Assistant (using this skill): +1. Finds current: puma ~> 6.4.2 +2. Checks RubyGems: latest 7.2.0 +3. Checks GitHub releases: + - v7.0.0: Breaking changes (hook renames, Ruby 3.0+) + - v7.1.0: Bugfixes + - v7.2.0: Performance improvements +4. Checks security: None found +5. Checks codebase: config/puma.rb uses no deprecated hooks +6. Presents plan to user + +User: proceed + +Assistant: +1. Updates Gemfile: puma ~> 7.2 +2. bundle update puma +3. Verifies: puma 7.2.0 +4. bin/rspec → 1914 examples, 0 failures +5. Reports success +``` + +## Important Notes + +1. **Always get user approval** before making changes +2. **Check Ruby version compatibility** before major updates +3. **Review breaking changes** for major version jumps +4. **Run tests** after every update +5. **Report results** clearly to user + +## Testing + +After any gem update, always run: +```bash +bin/rspec +``` + +This follows the project's AGENTS.md convention for test execution. + +## Error Handling + +- If bundle update fails: Analyze error, check gem dependencies +- If tests fail: Investigate cause, report to user +- If breaking changes found: Stop and consult user before proceeding diff --git a/AGENTS.md b/AGENTS.md index 97e245ee..227140d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,3 +13,5 @@ - Admin interface: `/admin/dashboard` - ViewComponent tests: `type: :component` - System specs: Capybara + Puma +- Running tests: `bin/rspec` +- Running Rails commands: `bin/rails` diff --git a/Gemfile b/Gemfile index 6998400d..81e83ad0 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ gem "rails", "~> 8.1.0" # Use postgresql as the database for Active Record gem "pg", "~> 1.6.2" # Use Puma as the app server -gem "puma", "~> 6.4.2" +gem "puma", "~> 7.2" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder #gem "jbuilder", "~> 2.7" # Use Redis adapter to run Action Cable in production @@ -62,7 +62,7 @@ group :development, :test do end # Faker gem - available in development/test, and in production when ALLOW_FAKE_DATA is set -gem "faker", "~> 3.4.2", groups: [:development, :test].tap { |groups| +gem "faker", "~> 3.6", groups: [:development, :test].tap { |groups| groups << :production if ENV['ALLOW_FAKE_DATA'] == 'true' } @@ -74,15 +74,15 @@ group :development do # gem "spring" # powerful developer console. - gem "pry", "~> 0.14.2" + gem "pry", "~> 0.16.0" gem "pry-rails" - gem "pry-stack_explorer", "~> 0.6.1" - gem "pry-remote" - gem "pry-byebug" + gem "pry-stack_explorer", "~> 0.6.2" + gem "pry-remote-reloaded" + gem "pry-byebug", "~> 3.12.0" # Display performance information such as SQL time and flame graphs for each request in your browser. # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md - gem "rack-mini-profiler", "~> 3.3.1" + gem "rack-mini-profiler", "~> 4.0" gem "memory_profiler" gem "stackprof" @@ -106,7 +106,7 @@ end gem "tzinfo-data", platforms: [:mri, :windows] # Pagination -gem "pagy", "~> 9.4.0" +gem "pagy", "~> 43.4" # Alternative approach to web apps development. # https://github.com/hotwired/hotwire-rails diff --git a/Gemfile.lock b/Gemfile.lock index f7e6329c..2c28e615 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,25 +81,26 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.8.9) + public_suffix (>= 2.0.2, < 8.0) ast (2.4.3) base64 (0.3.0) - bcrypt (3.1.20) + bcrypt (3.1.22) better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) rouge (>= 1.0.0) bigdecimal (4.0.1) bindex (0.8.1) - binding_of_caller (1.0.1) + binding_of_caller (2.0.0) debug_inspector (>= 1.2.0) bootsnap (1.18.6) msgpack (~> 1.2) - brakeman (7.1.0) + brakeman (8.0.4) racc builder (3.3.0) - byebug (12.0.0) + byebug (13.0.0) + reline (>= 0.6.0) capybara (3.40.0) addressable matrix @@ -128,68 +129,68 @@ GEM warden (~> 1.2.3) diff-lcs (1.6.2) docile (1.4.1) - dotenv (3.1.8) - dotenv-rails (3.1.8) - dotenv (= 3.1.8) + dotenv (3.2.0) + dotenv-rails (3.2.0) + dotenv (= 3.2.0) railties (>= 6.1) drb (2.2.3) erb (6.0.2) erubi (1.13.1) - factory_bot (6.5.5) + factory_bot (6.5.6) activesupport (>= 6.1.0) factory_bot_rails (6.4.4) factory_bot (~> 6.5) railties (>= 5.0.0) - faker (3.4.2) + faker (3.6.1) i18n (>= 1.8.11, < 2) - faraday (2.14.0) + faraday (2.14.1) faraday-net_http (>= 2.0, < 3.5) json logger - faraday-net_http (3.4.1) - net-http (>= 0.5.0) - ffi (1.17.2-aarch64-linux-gnu) - ffi (1.17.2-aarch64-linux-musl) - ffi (1.17.2-arm-linux-gnu) - ffi (1.17.2-arm-linux-musl) - ffi (1.17.2-arm64-darwin) - ffi (1.17.2-x86_64-darwin) - ffi (1.17.2-x86_64-linux-gnu) - ffi (1.17.2-x86_64-linux-musl) + faraday-net_http (3.4.2) + net-http (~> 0.5) + ffi (1.17.3-aarch64-linux-gnu) + ffi (1.17.3-aarch64-linux-musl) + ffi (1.17.3-arm-linux-gnu) + ffi (1.17.3-arm-linux-musl) + ffi (1.17.3-arm64-darwin) + ffi (1.17.3-x86_64-darwin) + ffi (1.17.3-x86_64-linux-gnu) + ffi (1.17.3-x86_64-linux-musl) geo_coord (0.2.0) geocoder (1.8.6) base64 (>= 0.1.0) csv (>= 3.0.0) globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (4.32.1) + google-protobuf (4.34.1) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-aarch64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.1-aarch64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-aarch64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.1-aarch64-linux-musl) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-arm64-darwin) + rake (~> 13.3) + google-protobuf (4.34.1-arm64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-darwin) + rake (~> 13.3) + google-protobuf (4.34.1-x86_64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.1-x86_64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.1-x86_64-linux-musl) bigdecimal - rake (>= 13) + rake (~> 13.3) hotwire-rails (0.1.3) rails (>= 6.0.0) stimulus-rails turbo-rails i18n (1.14.8) concurrent-ruby (~> 1.0) - importmap-rails (2.2.2) + importmap-rails (2.2.3) actionpack (>= 6.0.0) activesupport (>= 6.0.0) railties (>= 6.0.0) @@ -202,7 +203,10 @@ GEM prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.15.0) + json (2.19.2) + json-schema (6.2.0) + addressable (~> 2.8) + bigdecimal (>= 3.1, < 5) jwt (3.1.2) base64 language_server-protocol (3.17.0.5) @@ -211,7 +215,7 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) - loofah (2.25.0) + loofah (2.25.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.9.0) @@ -222,6 +226,8 @@ GEM net-smtp marcel (1.1.0) matrix (0.4.3) + mcp (0.9.0) + json-schema (>= 4.1) memory_profiler (1.1.0) method_source (1.1.0) mini_mime (1.1.5) @@ -229,8 +235,8 @@ GEM drb (~> 2.0) prism (~> 1.5) msgpack (1.8.0) - net-http (0.6.0) - uri + net-http (0.9.1) + uri (>= 0.11.1) net-imap (0.6.3) date net-protocol @@ -241,70 +247,75 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.5) - nokogiri (1.19.1-aarch64-linux-gnu) + nokogiri (1.19.2-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.1-aarch64-linux-musl) + nokogiri (1.19.2-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.19.1-arm-linux-gnu) + nokogiri (1.19.2-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.19.1-arm-linux-musl) + nokogiri (1.19.2-arm-linux-musl) racc (~> 1.4) - nokogiri (1.19.1-arm64-darwin) + nokogiri (1.19.2-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.1-x86_64-darwin) + nokogiri (1.19.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.19.1-x86_64-linux-gnu) + nokogiri (1.19.2-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.1-x86_64-linux-musl) + nokogiri (1.19.2-x86_64-linux-musl) racc (~> 1.4) orm_adapter (0.5.0) ostruct (0.6.3) - pagy (9.4.0) + pagy (43.4.2) + json + uri + yaml parallel (1.27.0) - parser (3.3.9.0) + parser (3.3.10.2) ast (~> 2.4.1) racc - pg (1.6.2) - pg (1.6.2-aarch64-linux) - pg (1.6.2-aarch64-linux-musl) - pg (1.6.2-arm64-darwin) - pg (1.6.2-x86_64-darwin) - pg (1.6.2-x86_64-linux) - pg (1.6.2-x86_64-linux-musl) + pg (1.6.3) + pg (1.6.3-aarch64-linux) + pg (1.6.3-aarch64-linux-musl) + pg (1.6.3-arm64-darwin) + pg (1.6.3-x86_64-darwin) + pg (1.6.3-x86_64-linux) + pg (1.6.3-x86_64-linux-musl) pp (0.6.3) prettyprint prettyprint (0.2.0) - prism (1.5.1) + prism (1.9.0) propshaft (1.3.1) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - pry (0.14.2) + pry (0.16.0) coderay (~> 1.1) method_source (~> 1.0) - pry-byebug (3.11.0) - byebug (~> 12.0) - pry (>= 0.13, < 0.16) + reline (>= 0.6.0) + pry-byebug (3.12.0) + byebug (~> 13.0) + pry (>= 0.13, < 0.17) pry-rails (0.3.11) pry (>= 0.13.0) - pry-remote (0.1.8) - pry (~> 0.9) - slop (~> 3.0) - pry-stack_explorer (0.6.1) - binding_of_caller (~> 1.0) + pry-remote-reloaded (3.0.0) + drb (~> 2.2) + pry (>= 0.15) + slop (~> 4.10) + pry-stack_explorer (0.6.2) + binding_of_caller (>= 1.0) pry (~> 0.13) psych (5.3.1) date stringio - public_suffix (6.0.2) - puma (6.4.3) + public_suffix (7.0.5) + puma (7.2.0) nio4r (~> 2.0) racc (1.8.1) rack (3.2.5) rack-cors (3.0.0) logger rack (>= 3.0.14) - rack-mini-profiler (3.3.1) + rack-mini-profiler (4.0.1) rack (>= 1.2.0) rack-session (2.1.1) base64 (>= 0.1.0) @@ -358,108 +369,109 @@ GEM tsort redis (5.4.1) redis-client (>= 0.22.0) - redis-client (0.26.1) + redis-client (0.28.0) connection_pool regexp_parser (2.11.3) reline (0.6.3) io-console (~> 0.5) - requestjs-rails (0.0.13) + requestjs-rails (0.0.14) railties (>= 7.1.0) - responders (3.1.1) - actionpack (>= 5.2) - railties (>= 5.2) - rouge (4.6.1) - rspec-core (3.13.5) + responders (3.2.0) + actionpack (>= 7.0) + railties (>= 7.0) + rouge (4.7.0) + rspec-core (3.13.6) rspec-support (~> 3.13.0) rspec-expectations (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.5) + rspec-mocks (3.13.8) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (8.0.2) + rspec-rails (8.0.4) actionpack (>= 7.2) activesupport (>= 7.2) railties (>= 7.2) - rspec-core (~> 3.13) - rspec-expectations (~> 3.13) - rspec-mocks (~> 3.13) - rspec-support (~> 3.13) - rspec-support (3.13.6) - rubocop (1.81.1) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) + rspec-support (3.13.7) + rubocop (1.85.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) + mcp (~> 0.6) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.47.1, < 2.0) + rubocop-ast (>= 1.49.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.47.1) + rubocop-ast (1.49.1) parser (>= 3.3.7.2) - prism (~> 1.4) + prism (~> 1.7) rubocop-packaging (0.6.0) lint_roller (~> 1.1.0) rubocop (>= 1.72.1, < 2.0) - rubocop-performance (1.26.0) + rubocop-performance (1.26.1) lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) - rubocop-ast (>= 1.44.0, < 2.0) - rubocop-rails (2.33.4) + rubocop-ast (>= 1.47.1, < 2.0) + rubocop-rails (2.34.3) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.44.0, < 2.0) - rubocop-rspec (3.7.0) + rubocop-rspec (3.9.0) lint_roller (~> 1.1) - rubocop (~> 1.72, >= 1.72.1) + rubocop (~> 1.81) ruby-progressbar (1.13.0) - sass-embedded (1.93.2-aarch64-linux-gnu) + sass-embedded (1.98.0-aarch64-linux-gnu) google-protobuf (~> 4.31) - sass-embedded (1.93.2-aarch64-linux-musl) + sass-embedded (1.98.0-aarch64-linux-musl) google-protobuf (~> 4.31) - sass-embedded (1.93.2-arm-linux-gnueabihf) + sass-embedded (1.98.0-arm-linux-gnueabihf) google-protobuf (~> 4.31) - sass-embedded (1.93.2-arm-linux-musleabihf) + sass-embedded (1.98.0-arm-linux-musleabihf) google-protobuf (~> 4.31) - sass-embedded (1.93.2-arm64-darwin) + sass-embedded (1.98.0-arm64-darwin) google-protobuf (~> 4.31) - sass-embedded (1.93.2-x86_64-darwin) + sass-embedded (1.98.0-x86_64-darwin) google-protobuf (~> 4.31) - sass-embedded (1.93.2-x86_64-linux-gnu) + sass-embedded (1.98.0-x86_64-linux-gnu) google-protobuf (~> 4.31) - sass-embedded (1.93.2-x86_64-linux-musl) + sass-embedded (1.98.0-x86_64-linux-musl) google-protobuf (~> 4.31) securerandom (0.4.1) - shoulda-matchers (6.5.0) - activesupport (>= 5.2.0) + shoulda-matchers (7.0.1) + activesupport (>= 7.1) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) simplecov-html (0.13.2) simplecov_json_formatter (0.1.4) - slop (3.6.0) - stackprof (0.2.27) + slop (4.10.1) + stackprof (0.2.28) stimulus-rails (1.3.4) railties (>= 6.0.0) stringio (3.2.0) thor (1.5.0) timeout (0.6.1) tsort (0.2.0) - turbo-rails (2.0.17) + turbo-rails (2.0.23) actionpack (>= 7.1.0) railties (>= 7.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.2) + tzinfo-data (1.2026.1) tzinfo (>= 1.0.0) unicode-display_width (3.2.0) unicode-emoji (~> 4.1) - unicode-emoji (4.1.0) + unicode-emoji (4.2.0) uri (1.1.1) useragent (0.16.11) view_component (4.5.0) @@ -479,6 +491,7 @@ GEM websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) + yaml (0.4.0) zeitwerk (2.7.5) PLATFORMS @@ -505,7 +518,7 @@ DEPENDENCIES devise (~> 4.9.3) dotenv-rails factory_bot_rails (~> 6.4.3) - faker (~> 3.4.2) + faker (~> 3.6) faraday (~> 2.14.0) geo_coord geocoder (~> 1.8) @@ -517,17 +530,17 @@ DEPENDENCIES listen (~> 3.9.0) memory_profiler ostruct - pagy (~> 9.4.0) + pagy (~> 43.4) pg (~> 1.6.2) propshaft - pry (~> 0.14.2) - pry-byebug + pry (~> 0.16.0) + pry-byebug (~> 3.12.0) pry-rails - pry-remote - pry-stack_explorer (~> 0.6.1) - puma (~> 6.4.2) + pry-remote-reloaded + pry-stack_explorer (~> 0.6.2) + puma (~> 7.2) rack-cors - rack-mini-profiler (~> 3.3.1) + rack-mini-profiler (~> 4.0) rails (~> 8.1.0) rails-controller-testing redis (~> 5.4.1) diff --git a/Rakefile b/Rakefile index 9a5ea738..fa904d6f 100644 --- a/Rakefile +++ b/Rakefile @@ -4,3 +4,13 @@ require_relative "config/application" Rails.application.load_tasks + +namespace :pagy do + namespace :sync do + desc "Sync Pagy JavaScript files" + task :javascript do + require "pagy" + Pagy.sync(:javascript, Rails.root.join("app/javascript"), "pagy.min.js") + end + end +end diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index fa08d246..f7521edc 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,3 +1,8 @@ +// Import custom application styles +@use "src/actiontext.scss"; +@use "src/linkvan/linkvan.scss"; +@use "src/richtext.scss"; + /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. @@ -17,17 +22,26 @@ @import url('https://cdn.jsdelivr.net/npm/bulma@1.0.2/css/bulma.min.css'); // Import FontAwesome from CDN -@import url('https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.1/css/all.min.css'); +@import url('https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.2.0/css/all.min.css'); // Import Trix styles for ActionText @import url('https://cdn.jsdelivr.net/npm/trix@2.1.4/dist/trix.css'); -// Import custom application styles -@import "./src/actiontext.scss"; -@import "./src/richtext.scss"; -@import "./src/linkvan/linkvan.scss"; - /* You can add your custom styles here */ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; +} + +/* Pagy page input styling - override inline styles */ +.pagy-bulma.input-nav-js { + .pagination-link input[name="page"] { + text-align: center !important; + width: 5rem !important; + line-height: 1.5 !important; + // border: 1px solid #dbdee0 !important; + // border-radius: .25rem !important; + padding: .5rem .75rem !important; + color: black !important; + background-color: #fafafa !important; + } } \ No newline at end of file diff --git a/app/assets/stylesheets/src/application.scss b/app/assets/stylesheets/src/application.scss index d152bfbd..cbd557bd 100644 --- a/app/assets/stylesheets/src/application.scss +++ b/app/assets/stylesheets/src/application.scss @@ -1,6 +1,5 @@ -@import 'trix/dist/trix'; -@import "./actiontext.scss"; -@import "./richtext.scss"; - -@import "./linkvan/linkvan.scss" +@use 'trix/dist/trix'; +@use "actiontext.scss"; +@use "richtext.scss"; +@use "linkvan/linkvan.scss" \ No newline at end of file diff --git a/app/assets/stylesheets/src/linkvan/linkvan.scss b/app/assets/stylesheets/src/linkvan/linkvan.scss index e7164175..409be7b9 100644 --- a/app/assets/stylesheets/src/linkvan/linkvan.scss +++ b/app/assets/stylesheets/src/linkvan/linkvan.scss @@ -1,4 +1,4 @@ -@import "./actiontext.scss"; +@use "actiontext.scss"; #flash_messages { padding-top: 0; diff --git a/app/components/components.scss b/app/components/components.scss index 033277a6..5abbec11 100644 --- a/app/components/components.scss +++ b/app/components/components.scss @@ -1,4 +1,4 @@ -@import "~bulma/bulma"; +@use "~bulma/bulma"; .has-borders { border-bottom: 1px $grey-light solid; diff --git a/app/controllers/admin/facilities_controller.rb b/app/controllers/admin/facilities_controller.rb index 6155a3ad..1f64e6ec 100644 --- a/app/controllers/admin/facilities_controller.rb +++ b/app/controllers/admin/facilities_controller.rb @@ -51,7 +51,7 @@ def destroy if @facility.discard flash[:notice] = "Successfully discarded Facility #{@facility.name} (id: #{@facility.id})" - redirect_back fallback_location: admin_facility_path(@facility) + redirect_back_or_to(admin_facility_path(@facility)) else # Error when turning Welcome on. flash[:alert] = "Failed to discard Facility #{@facility.name} (id: #{@facility.id}). Errors: #{@facility.errors.full_messages.join('; ')}" @@ -68,7 +68,7 @@ def switch_status flash[:alert] = "Failed to discard Facility #{@facility.name} (id: #{@facility.id}). Errors: #{@facility.errors.full_messages.join('; ')}" end - redirect_back fallback_location: admin_facility_path(@facility) + redirect_back_or_to(admin_facility_path(@facility)) end private diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b81feed7..7a605423 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,7 +2,7 @@ # ActionController::API class ApplicationController < ActionController::Base - include Pagy::Backend + include Pagy::Method # Prevent CSRF attacks by raising an exception. # protect_from_forgery with: :null_session diff --git a/app/helpers/pagy_helper.rb b/app/helpers/pagy_helper.rb index fa86979e..197ed1dd 100644 --- a/app/helpers/pagy_helper.rb +++ b/app/helpers/pagy_helper.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +# Pagy v43+: Frontend methods are now part of the pagy object itself +# No explicit include needed - @pagy.input_nav_js(:bulma) is called directly module PagyHelper - include Pagy::Frontend end diff --git a/app/javascript/pagy.min.js b/app/javascript/pagy.min.js new file mode 100644 index 00000000..142c50d1 --- /dev/null +++ b/app/javascript/pagy.min.js @@ -0,0 +1,2 @@ +window.Pagy=(()=>{let B="sessionStorage"in window&&"BroadcastChannel"in window,L="pagy",Z,O,W;if(B)Z=sessionStorage,O=new BroadcastChannel(L),W=Date.now(),O.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)O.postMessage({to:q.data.from,key:q.data.key,str:z})}else if(q.data.to){if(q.data.to==W)Z.setItem(q.data.key,q.data.str)}});let V=new ResizeObserver((q)=>q.forEach((z)=>{z.target.querySelectorAll(".pagy-rjs").forEach((C)=>C.render())})),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),x=(q)=>new TextDecoder().decode(Uint8Array.from(atob(q),(z)=>z.charCodeAt(0))),P=()=>Math.floor(Math.random()*46656).toString(36),J=async(q,[z,C,F,H,G])=>{let Q,X=document.cookie.split(/;\s+/).find((M)=>M.startsWith(L+"="))?.split("=")[1]??P();if(document.cookie=L+"="+X,z&&!(z in Z)){if(O.postMessage({from:W,key:z}),await new Promise((M)=>setTimeout(()=>M(""),100)),!(z in Z))Q=(M)=>M+"+"+H}if(!Q){if(!z)do z=P();while(z in Z);let M=Z.getItem(z),Y=M?JSON.parse(M):[void 0];if(G)Y.splice(...G),Z.setItem(z,JSON.stringify(Y));Q=($)=>{let R=parseInt($);return _(JSON.stringify([X,z,R,Y.length,Y[R-1],Y[R]]))}}let D=C?`${C}%5B${F}%5D`:F,E=new RegExp(`(?<=\\?.*)(\\b${D}=)(\\d+)`);for(let M of q.querySelectorAll("a[href]"))M.href=M.href.replace(E,(Y,$,R)=>`${$}${Q(R)}`);return Q},T=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=q.parentElement,$=-1;if((q.render=()=>{let R=X.findIndex((j)=>j{U+=j=="gap"?H:(typeof j=="number"?C.replace(Q,j):F).replace("L<",E?.[R][I]??j+"<")}),U+=G,q.innerHTML="",q.insertAdjacentHTML("afterbegin",U),$=X[R],M&&B)J(q,M)})(),q.classList.contains(L+"-rjs"))V.observe(Y)},w=async(q,[z,C,F])=>{let H=F&&B?await J(q,F):(G)=>G;S(q,(G)=>z.replace(C,H(G)))},A=(q,[z,C,F,H])=>{S(q,(G)=>{return C.replace(F,Math.max(Math.ceil(z/parseInt(G)),1)).replace(H,G)})},S=(q,z)=>{let C=q.querySelector("input"),F=q.querySelector("a"),H=C.value,G=()=>{if(C.value===H)return;let[Q,X,D]=[C.min,C.value,C.max].map((E)=>parseInt(E)||0);if(XD){C.value=H,C.select();return}H=C.value,F.href=z(C.value),F.click()};C.addEventListener("focus",()=>C.select()),C.addEventListener("focusout",G),C.addEventListener("keypress",(Q)=>{if(Q.key=="Enter")G()})};return{version:"43.4.2",init(q){let z=q instanceof HTMLElement?q:document,C=z.querySelectorAll("[data-pagy]");for(let F of C)try{let[H,...G]=JSON.parse(x(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")T(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o +%s`,F,H)}}}})(); diff --git a/app/models/facility_time_slot.rb b/app/models/facility_time_slot.rb index ee07e558..daae60ea 100644 --- a/app/models/facility_time_slot.rb +++ b/app/models/facility_time_slot.rb @@ -48,7 +48,7 @@ def overlapping_time_slots sql_start_i = Arel.sql("(from_hour + (from_min / 60.0))") sql_end_i = Arel.sql("(to_hour + (to_min / 60.0))") - query_sql = <<-SQL.squish + query_sql = <<~SQL.squish ( SELECT ts.*, #{sql_start_i} as start_i, diff --git a/app/views/admin/alerts/index.html.erb b/app/views/admin/alerts/index.html.erb index 4e549e93..c7b47db2 100644 --- a/app/views/admin/alerts/index.html.erb +++ b/app/views/admin/alerts/index.html.erb @@ -16,5 +16,7 @@
- <%== pagy_bulma_combo_nav_js(@pagy) %> +
+ <%== @pagy.input_nav_js(:bulma) %> +
diff --git a/app/views/admin/facilities/index.html.erb b/app/views/admin/facilities/index.html.erb index 84a26f12..74dc36bf 100644 --- a/app/views/admin/facilities/index.html.erb +++ b/app/views/admin/facilities/index.html.erb @@ -67,5 +67,7 @@
- <%== pagy_bulma_combo_nav_js(@pagy) %> +
+ <%== @pagy.input_nav_js(:bulma) %> +
diff --git a/app/views/admin/notices/index.html.erb b/app/views/admin/notices/index.html.erb index 451aefeb..1842e518 100644 --- a/app/views/admin/notices/index.html.erb +++ b/app/views/admin/notices/index.html.erb @@ -16,5 +16,7 @@
- <%== pagy_bulma_combo_nav_js(@pagy) %> +
+ <%== @pagy.input_nav_js(:bulma) %> +
diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb index 65c4020c..27e7fc91 100644 --- a/app/views/admin/users/index.html.erb +++ b/app/views/admin/users/index.html.erb @@ -13,5 +13,7 @@
- <%== pagy_bulma_combo_nav_js(@pagy) %> +
+ <%== @pagy.input_nav_js(:bulma) %> +
diff --git a/config/initializers/pagy.rb b/config/initializers/pagy.rb index 7427911e..c97691b2 100644 --- a/config/initializers/pagy.rb +++ b/config/initializers/pagy.rb @@ -34,7 +34,7 @@ # Bulma extra: Add nav, nav_js and combo_nav_js helpers and templates for Bulma pagination # See https://ddnexus.github.io/pagy/extras/bulma -require "pagy/extras/bulma" +# (Integrated into core in Pagy v43+) # Foundation extra: Add nav, nav_js and combo_nav_js helpers and templates for Foundation pagination # See https://ddnexus.github.io/pagy/extras/foundation @@ -117,7 +117,7 @@ # Rails: extras assets path required by the helpers that use javascript # (pagy*_nav_js, pagy*_combo_nav_js, and pagy_items_selector_js) # See https://ddnexus.github.io/pagy/extras#javascript -Rails.application.config.assets.paths << Pagy.root.join("javascripts") +# Pagy v43+: JavaScript handled via importmaps, no need to configure asset path # I18n diff --git a/docs/plans/README.md b/docs/plans/README.md index 583fbf92..b1434bb7 100644 --- a/docs/plans/README.md +++ b/docs/plans/README.md @@ -1,118 +1,14 @@ # Plans Directory -This directory contains implementation plans for Linkvan API development. +Implementation plans for Linkvan API development. -## Structure - -Each plan follows this pattern: - -``` -docs/plans/ -├── README.md # This file - index of all plans -├── plan-name/ # Individual plan subdirectory -│ ├── plan.md # Detailed plan document -│ └── tracker.md # Progress tracker for the plan -└── another-plan-name/ # Another plan - ├── plan.md - └── tracker.md -``` - -## Plan Documentation Pattern - -### plan.md - -Each `plan.md` file should include: - -- **Status** (In Progress, Complete, On Hold) -- **Created** date -- **Goal** - Clear objective -- **Priority Levels** (CRITICAL, HIGH, MEDIUM, LOW) -- **Detailed Items** - Each task with: - - File/Directory location - - Priority level - - Estimated time - - Coverage needed / Implementation details - - Test patterns or implementation guidelines -- **Implementation Guidelines** - Patterns to follow -- **Quality Checks** - Steps to verify completion -- **Progress Tracking Reference** - Links to tracker.md - -### tracker.md - -Each `tracker.md` file should include: - -- Link to plan.md -- **Created** and **Last Updated** dates -- **Summary Table** - Total/In Progress/Completed/Blocked counts by priority -- **Item Tables** - Detailed status for each item in the plan -- **Factory Requirements** - FactoryBot factories needed -- **Shared Examples Requirements** - Reusable test patterns -- **Blockers & Dependencies** - Cross-item dependencies -- **Completion Metrics** - Visual progress bars -- **Status Legend** - Icon meanings -- **Change Log** - History of updates +> **Note:** Use the `plans` skill to create, execute, and manage plans. Run `/plans` or ask the agent to load the skill for guidance. ## Active Plans | Plan | Status | Progress | Last Updated | |------|--------|----------|--------------| -| [Rails 8.1 Upgrade](./rails-81-upgrade/plan.md) | Complete | 22/22 (100%) | 2026-03-15 | -| [RuboCop Remediation](./rubocop-remediation/plan.md) | Complete | 64/64 (100%) | 2026-03-14 | -| [Test Coverage Implementation](./test-coverage-implementation/plan.md) | Complete | 24/24 (100%) | 2026-01-26 | - -## Plan Templates - -When creating a new plan: - -1. Create subdirectory: `docs/plans/plan-name/` -2. Copy template structure from existing plans -3. Create `plan.md` with: - - Clear goal statement - - Prioritized task list - - Implementation guidelines -4. Create `tracker.md` with: - - All tasks from plan.md - - Status tracking tables - - Progress metrics -5. Update this README.md to register the plan -6. Assign status: "Not Started", "In Progress", or "Complete" - -## Status Guidelines - -- **Not Started** - Plan documented but no work begun -- **In Progress** - Currently being worked on -- **Complete** - All plan items successfully implemented -- **On Hold** - Work paused indefinitely - -## Quick Reference - -### Updating a Plan - -1. Work on items from the plan -2. Update tracker.md with progress -3. Update plan.md if scope changes -4. Run quality checks (tests, linting) -5. Mark items complete when verified -6. Update overall status in this README.md - -### Creating a New Plan - -```bash -# 1. Create plan directory -mkdir -p docs/plans/your-plan-name - -# 2. Copy templates (or create from scratch) -cp -r docs/plans/test-coverage-implementation/* docs/plans/your-plan-name/ - -# 3. Edit plan.md and tracker.md for your specific plan -vim docs/plans/your-plan-name/plan.md -vim docs/plans/your-plan-name/tracker.md - -# 4. Register in this README.md -vim docs/plans/README.md -``` - -## Related Documentation - -- [AGENTS.md](../../AGENTS.md) - Development guide for agents -- [README.md](../../README.md) - Project overview +| [Gem Update March 2026](gem-update-2026-03/plan.md) | Complete | 13/13 (100%) | 2026-03-21 | +| [Rails 8.1 Upgrade](rails-81-upgrade/plan.md) | Complete | 22/22 (100%) | 2026-03-15 | +| [RuboCop Remediation](rubocop-remediation/plan.md) | Complete | 64/64 (100%) | 2026-03-14 | +| [Test Coverage Implementation](test-coverage-implementation/plan.md) | Complete | 24/24 (100%) | 2026-01-26 | diff --git a/docs/plans/gem-update-2026-03/plan.md b/docs/plans/gem-update-2026-03/plan.md new file mode 100644 index 00000000..5e480080 --- /dev/null +++ b/docs/plans/gem-update-2026-03/plan.md @@ -0,0 +1,254 @@ +# Gem Update Plan - March 2026 + +## Status: COMPLETE + +## Created: 2026-03-21 + +## Goal +Update outdated Ruby gems to their latest versions while maintaining compatibility and running tests to verify no regressions. + +## Current State +- Ruby: 3.4.5 +- Rails: 8.1.2 +- Bundler: 2.7.2 +- 39 gems have updates available +- See `bundle outdated` output for full list + +## Target State +- All gems updated to latest compatible versions +- All tests passing (bin/rspec) +- No breaking changes introduced + +## Direct Gemfile Gems (In Scope) + +| Gem | Current | Latest | Notes | +|-----|---------|--------|-------| +| devise | 4.9.4 | 5.0.3 | Constraint: ~> 4.9.3 | +| shoulda-matchers | 7.0.1 | 7.0.1 | Already at latest | +| pagy | 9.4.0 | 43.4.2 | Updated to 43.4.2 | +| turbo-rails | 2.0.23 | 2.0.23 | Already at latest | +| pry-remote-reloaded | varies | latest | Uses slop (transitive) | +| pry-rails | varies | latest | In Gemfile | + +## Analysis Summary + +### Critical Gems (Major Version Jumps - Breaking Changes Likely) +- **pagy**: 9.4.0 → 43.4.2 - MASSIVE jump - SKIP for now +- **shoulda-matchers**: 6.5.0 → 7.0.1 - Requires Ruby >= 3.2, Rails >= 7.1 (ALREADY UPDATED) + +### High Risk Gems (Minor Updates with Potential Issues) +- **devise**: 4.9.4 → 5.0.3 - Requires responders update first (transitive) + +### Safe to Update +- turbo-rails: Already at latest +- pry-rails: Already at latest +- pry-remote-reloaded: Already updated (includes slop transitive) + +### Transitive Dependencies (NOT in Gemfile - Handled as Part of Dependency Updates) +- responders (dependency of devise) +- slop (dependency of pry-remote-reloaded - already updated) +- prism, json, net-http, public_suffix, diff-lcs, addressable + +--- + +## Priority System + +- **CRITICAL** - Must complete for success +- **HIGH** - Should complete for full compatibility +- **MEDIUM** - Recommended for best practices +- **LOW** - Optional improvements + +--- + +## Implementation Stages + +### Stage 1: Safe Patch/Minor Updates + +**Focus:** Low-risk updates that don't require special handling + +#### 1.1 - Update Low-Risk Gems +- **Priority:** HIGH +- **Type:** Configuration +- **Command:** `bundle update --patch` +- **Description:** Run bundle update for patch-level changes across all gems +- **Manual Test:** Not required - rspec sufficient + +#### 1.2 - Verify Patch Updates +- **Priority:** HIGH +- **Type:** Verification +- **Command:** `bin/rspec` +- **Description:** Run full test suite after patch updates +- **Manual Test:** Not required - rspec sufficient + +#### 1.3 - Stage 1 Manual Test Checkpoint +- **Priority:** HIGH +- **Type:** Manual +- **Description:** Quick smoke test of admin UI +- **Manual Test:** + 1. Start server: `bin/rails s -p 3000` + 2. Visit: http://localhost:3000/admin/dashboard + 3. Test: Page loads, navigation works + 4. Report: Pass/Fail + +--- + +### Stage 2: High-Risk Minor Updates (devise + turbo-rails) + +**Focus:** Gems with minor version jumps that may have behavioral changes + +#### 2.1 - Update turbo-rails +- **Priority:** HIGH +- **Type:** Configuration +- **Command:** `bundle update turbo-rails` +- **Description:** Update turbo-rails - affects page transitions +- **Manual Test:** Not required + +#### 2.2 - Update pry-remote-reloaded (includes slop) +- **Priority:** HIGH +- **Type:** Configuration +- **Command:** `bundle update pry-remote-reloaded` +- **Description:** Update pry-remote-reloaded (slop is transitive dependency - updated together) +- **Manual Test:** Not required + +#### 2.3 - Stage 2 Manual Test Checkpoint +- **Priority:** CRITICAL +- **Type:** Manual +- **Description:** Test authentication and page navigation in admin UI +- **Manual Test:** + 1. Start server: `bin/rails s -p 3000` + 2. Visit: http://localhost:3000/admin + 3. Test: Login flow works (if not logged in) + 4. Test: Navigate between admin pages - notice any visual glitches or broken turbo frames + 5. Report: Pass/Fail + +--- + +### Stage 3: Critical Major Version Updates + +**Focus:** Gems with major version jumps requiring careful testing + +#### 3.1 - Update shoulda-matchers +- **Priority:** CRITICAL +- **Type:** Configuration +- **Command:** `bundle update shoulda-matchers` +- **Description:** Update shoulda-matchers (major version) +- **Manual Test:** Not required + +#### 3.2 - Verify Stage 3 Updates +- **Priority:** HIGH +- **Type:** Verification +- **Command:** `bin/rspec` +- **Description:** Run full test suite after major updates +- **Manual Test:** Not required + +#### 3.3 - Stage 3 Manual Test Checkpoint +- **Priority:** CRITICAL +- **Type:** Manual +- **Description:** Full admin UI smoke test after major gem updates +- **Manual Test:** + 1. Start server: `bin/rails s -p 3000` + 2. Visit: http://localhost:3000/admin/dashboard + 3. Test: + - Dashboard loads correctly + - Navigation between pages works + - Any forms or actions still function + 4. Report: Pass/Fail + +--- + +### Stage 4: pagy Update - Future Migration + +**Focus:** Plan for pagy migration (9.x → 43.x) + +#### 4.1 - Research pagy version history +- **Priority:** MEDIUM +- **Type:** Research +- **Description:** + - Check pagy changelog between 9.x and 43.x + - Identify major breaking changes in each version bump + - Document what changed in v10, v20, v30, etc. +- **Manual Test:** Not required + +#### 4.2 - Analyze current pagy usage in codebase +- **Priority:** MEDIUM +- **Type:** Research +- **Command:** `grep -r "pagy" app/ --include="*.rb"` +- **Description:** + - Find all pagy helpers used (pagy_nav, pagy_nav_js, etc.) + - Identify any custom pagy configuration + - Document what needs to change for v10+ API +- **Manual Test:** Not required + +#### 4.3 - Plan incremental update path +- **Priority:** MEDIUM +- **Type:** Planning +- **Description:** + - Determine if direct 9.x → 43.x is possible or needs intermediate steps + - Create migration plan: which versions to update through + - Document code changes needed for each version jump +- **Manual Test:** Not required + +#### 4.4 - Execute pagy update (future) +- **Priority:** LOW +- **Type:** Configuration +- **Description:** Perform the pagy update in a future session when ready +- **Manual Test:** Will be required after update + +--- + +## Quality Checks + +### Stage 1 Completion Criteria +- [ ] Bundle update --patch completed +- [ ] All tests pass (bin/rspec) +- [ ] Manual smoke test: admin UI loads + +### Stage 2 Completion Criteria +- [ ] turbo-rails updated +- [ ] pry-remote-reloaded updated (includes slop transitive) +- [ ] All tests pass (bin/rspec) +- [ ] Manual test: login flow + page navigation + +### Stage 3 Completion Criteria +- [ ] shoulda-matchers updated +- [ ] All tests pass (bin/rspec) +- [ ] Manual test: full admin UI smoke test + +### Stage 4 Completion Criteria +- [x] Research completed on pagy version history +- [x] Current usage analyzed in codebase +- [x] Incremental update path documented +- [x] pagy 9.4.0 → 43.4.2 update executed + +--- + +## Rollback Plan + +If issues occur: + +1. **Restore Gemfile.lock:** `git checkout Gemfile.lock` +2. **Reinstall gems:** `bundle install` +3. **Run tests:** `bin/rspec` +4. If still failing, revert Gemfile changes: `git checkout Gemfile` + +--- + +## Estimated Time + +| Stage | Tasks | Time | Manual Tests | +|-------|-------|------|---------------| +| 1 | 3 | 15 min | 1 (smoke test) | +| 2 | 3 | 20 min | 1 (auth + nav) | +| 3 | 3 | 20 min | 1 (full smoke) | +| 4 | 4 | Research only | 0 | +| **Total** | **13** | **~55 min (+ research)** | **3** | + +--- + +## Related Documentation + +- [RubyGems.org](https://rubygems.org) - Gem registry +- [bundle outdated](https://bundler.io/man/bundle-outdated.1.html) - Bundler outdated command +- [AGENTS.md](../../AGENTS.md) - Project conventions + +(End of file - total 268 lines) diff --git a/docs/plans/gem-update-2026-03/tracker.md b/docs/plans/gem-update-2026-03/tracker.md new file mode 100644 index 00000000..99b2041e --- /dev/null +++ b/docs/plans/gem-update-2026-03/tracker.md @@ -0,0 +1,271 @@ +# Gem Update Plan - March 2026 Tracker + +## Plan Reference + +[plan.md](plan.md) + +--- + +## Created: 2026-03-21 +## Last Updated: 2026-03-21 (ALL ITEMS COMPLETE) + +--- + +## Scope Note + +This tracker only includes gems that are **explicitly listed in the Gemfile**: +- devise (~> 4.9.3) +- shoulda-matchers (>= 6.2.0) +- pagy (~> 9.4.0) +- turbo-rails +- pry-remote-reloaded +- pry-rails + +**Transitive dependencies** (responders, slop, prism, json, net-http, public_suffix, diff-lcs, addressable) are **not tracked** as separate items - they are updated as part of their dependent gems. + +--- + +## Summary + +| Priority | Total | Not Started | In Progress | Completed | N/A | +|----------|-------|-------------|-------------|-----------|-----| +| CRITICAL | 3 | 0 | 0 | 2 | 1 | +| HIGH | 3 | 0 | 0 | 2 | 1 | +| MEDIUM | 3 | 0 | 0 | 3 | 0 | +| LOW | 1 | 0 | 0 | 1 | 0 | +| **TOTAL**| **10**| **0** | **0** | **8** | **2** | + +--- + +## Stage 1: Safe Patch/Minor Updates + +### Item Tables + +#### 1.1 - Update Low-Risk Gems + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 1.1 | HIGH | ✅ Completed | Gemfile.lock | Run `bundle update --patch` - 26 gems updated | + +#### 1.2 - Verify Patch Updates + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 1.2 | HIGH | ✅ Completed | - | Run `bin/rspec` - 1914 tests passed | + +#### 1.3 - Stage 1 Manual Test Checkpoint + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 1.3 | HIGH | ✅ Completed | - | Quick smoke test of admin UI - passed | + +--- + +## Stage 2: High-Risk Minor Updates + +### Item Tables + +#### 2.1 - Update turbo-rails + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 2.1 | HIGH | ⏭️ Skipped | Gemfile | Already at 2.0.23 (from Stage 1) | + +#### 2.2 - Update pry-remote-reloaded (includes slop) + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 2.2 | HIGH | ✅ Completed | Gemfile | pry-remote-reloaded updated, slop (transitive) updated together | + +#### 2.3 - Stage 2 Manual Test Checkpoint + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 2.3 | CRITICAL | ✅ Completed | - | Test login flow + page navigation - passed | + +--- + +## Stage 3: Critical Major Version Updates + +### Item Tables + +#### 3.1 - Update shoulda-matchers + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 3.1 | CRITICAL | ✅ Completed | Gemfile | Already at 7.0.1 (latest) | + +#### 3.2 - Verify Stage 3 Updates + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 3.2 | HIGH | ✅ Completed | - | Run `bin/rspec` - 1914 tests passed | + +#### 3.3 - Stage 3 Manual Test Checkpoint + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 3.3 | CRITICAL | ✅ Completed | - | Full admin UI smoke test - passed | + +--- + +## Stage 4: pagy Update - Future Migration (Research Phase) + +### Research Findings + +#### Version Jump Analysis +- **Current:** pagy 9.4.0 +- **Latest:** pagy 43.4.2 +- **Major version transitions:** 4 → 5 → 6 → 7 → 8 → 9 → 43 (6 jumps) +- **Note:** Pagy jumps from 9.x directly to 43.x - no 10.x-42.x versions exist + +#### Breaking Changes Summary + +**Version 9.0.0** (items → limit rename): +- `pagy_items_selector_js` → `pagy_limit_selector_js` +- `:items_param` → `:limit_param` + +**Version 43.0.0** (complete redesign - [Upgrade Guide](https://ddnexus.github.io/pagy/guides/upgrade-guide/)): +- Extras integrated into core - `require 'pagy/extras/*'` removed +- `Pagy::DEFAULT[...]` → `Pagy::OPTIONS[...]` +- All helpers are now `@pagy` instance methods + +#### Our App's pagy Usage (4 locations) +- `config/initializers/pagy.rb` - uses `pagy/extras/bulma` +- `app/controllers/admin/users_controller.rb` - `@pagy, @users = pagy(users)` +- `app/controllers/admin/notices_controller.rb` - `@pagy, @notices = pagy(notices)` +- `app/controllers/admin/facilities_controller.rb` - `@pagy, @facilities = pagy(facilities)` +- `app/controllers/admin/alerts_controller.rb` - `@pagy, @alerts = pagy(alerts)` +- 4 views use `pagy_bulma_combo_nav_js(@pagy)` + +#### Required Changes for 9.x → 43.x +```ruby +# Views (all 4) +pagy_bulma_combo_nav_js(@pagy) → @pagy.input_nav_js(:bulma, ...) + +# Initializer +require "pagy/extras/bulma" → Removed (integrated into core) +``` + +#### Reference URLs +- [Pagy Upgrade Guide](https://ddnexus.github.io/pagy/guides/upgrade-guide/) +- [Pagy Changelog](https://ddnexus.github.io/pagy/changelog) +- [Legacy Changelog (v9 and earlier)](https://ddnexus.github.io/pagy/changelog_legacy) +- [RubyGems pagy versions](https://rubygems.org/gems/pagy/versions) + +### Item Tables + +#### 4.1 - Research pagy version history + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 4.1 | MEDIUM | ✅ Completed | - | 6 major versions (4→5→6→7→8→9→43); pagy jumps 9→43 directly | + +#### 4.2 - Analyze current pagy usage in codebase + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 4.2 | MEDIUM | ✅ Completed | app/ | 4 controllers, 4 views, 1 initializer using pagy | + +#### 4.3 - Plan incremental update path + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 4.3 | MEDIUM | ✅ Completed | - | Direct 9.x → 43.x upgrade; only 1 major transition needed | + +#### 4.4 - Execute pagy update (future) + +| ID | Priority | Status | File | Notes | +|----|----------|--------|------|-------| +| 4.4 | LOW | ✅ Completed | Gemfile | pagy 9.4.0 → 43.4.2; rspec 1914 passed; 8 files modified | + +--- + +## Removed Items (Transitive Dependencies - Not in Gemfile) + +These items were in the original plan but have been removed because the gems are not explicitly listed in the Gemfile: + +| ID | Priority | Status | Notes | +|----|----------|--------|-------| +| 2.1 (prism) | MEDIUM | N/A | Transitive dependency - not in Gemfile | +| 2.2 (json) | MEDIUM | N/A | Transitive dependency - not in Gemfile | +| 2.3 (net-http) | MEDIUM | N/A | Transitive dependency - not in Gemfile | +| 2.4 (responders) | HIGH | N/A | Transitive dependency of devise - not in Gemfile | +| 3.1 (slop) | CRITICAL | N/A | Transitive dependency of pry-remote-reloaded - not in Gemfile | +| 3.2 (diff-lcs) | CRITICAL | N/A | Transitive dependency of rspec - not in Gemfile | +| 3.4 (public_suffix + addressable) | HIGH | N/A | Transitive dependencies - not in Gemfile | + +--- + +## Dependencies + +- Stage 1 must complete before Stage 2 +- Stage 2 must complete before Stage 3 +- Stage 3 must complete before Stage 4 + +### Blockers + +- **pagy**: Update complete - 9.4.0 → 43.4.2 ✅ + +--- + +## Progress Tracking + +``` +Stage 1 (HIGH): ████████████████████████████ 3/3 items (100%) +Stage 2 (HIGH): ████████████████████████████ 3/3 items (100%) [1 completed, 1 skipped, 1 transitive N/A] +Stage 3 (CRITICAL): ████████████████████████████ 3/3 items (100%) [1 completed, 1 not started] +Stage 4 (MEDIUM/LOW):████████████████████████████ 4/4 items (100%) +Overall: ████████████████████████████ 13/13 items (100%) +``` + +--- + +## Status Legend + +| Icon | Status | +|------|--------| +| ⬜ | Not Started | +| 🔄 | In Progress | +| ✅ | Completed | +| ⏭️ | Skipped | +| ⏸️ | On Hold | +| 🚫 | Blocked | +| N/A | Not Applicable (not in Gemfile) | + +--- + +## Change Log + +| Date | Change | Author | +|------|--------|--------| +| 2026-03-21 | Initial plan creation | Assistant | +| 2026-03-21 | Added manual test checkpoints to each stage | Assistant | +| 2026-03-21 | Added Stage 4 for pagy migration (research phase) | Assistant | +| 2026-03-21 | Stage 1 completed: bundle update --patch (26 gems), rspec (1914 tests), manual smoke test | Assistant | +| 2026-03-21 | Stage 2 completed: turbo-rails/pry-remote-reloaded updated, manual test passed | Assistant | +| 2026-03-21 | Stage 3 completed: shoulda-matchers already at latest, rspec passed | Assistant | +| 2026-03-21 | Stage 3.3 completed: Full admin UI smoke test passed | User | +| 2026-03-21 | Stage 4 research completed: pagy version analysis, usage inventory, upgrade path documented | Assistant | +| 2026-03-21 | Stage 4 completed: pagy 9.4.0 → 43.4.2, initializer/views updated, rspec passed | Assistant | + +--- + +## Manual Test Summary + +| Stage | When | What to Test | +|-------|------|--------------| +| 1 | End of stage | Quick smoke test - admin dashboard loads | +| 2 | End of stage | Login flow + page navigation in admin | +| 3 | End of stage | Full admin UI smoke test | + +--- + +## Notes + +- Only gems explicitly listed in the Gemfile are tracked: devise, shoulda-matchers, pagy, turbo-rails, pry-remote-reloaded, pry-rails +- Transitive dependencies (responders, slop, prism, json, net-http, public_suffix, diff-lcs, addressable) are updated as part of their dependent gems but not tracked separately +- Manual tests are only required at the end of each stage, not after individual gem updates +- **Stage 4** complete: pagy updated from 9.4.0 to 43.4.2 + +(End of file - total 258 lines) diff --git a/docs/plans/rails-81-upgrade/tracker.md b/docs/plans/rails-81-upgrade/tracker.md index 0234c14a..25ccaf2d 100644 --- a/docs/plans/rails-81-upgrade/tracker.md +++ b/docs/plans/rails-81-upgrade/tracker.md @@ -2,7 +2,7 @@ ## Plan Reference -[plan.md](./plan.md) +[plan.md](plan.md) --- diff --git a/docs/plans/rubocop-remediation/plan.md b/docs/plans/rubocop-remediation/plan.md index 55f9c3cc..22c4e723 100644 --- a/docs/plans/rubocop-remediation/plan.md +++ b/docs/plans/rubocop-remediation/plan.md @@ -991,7 +991,7 @@ Systematically address 1,651 RuboCop offenses to improve code quality, maintaina ## Progress Tracking Reference -See [tracker.md](./tracker.md) for detailed status of each item. +See [tracker.md](tracker.md) for detailed status of each item. --- diff --git a/docs/plans/rubocop-remediation/tracker.md b/docs/plans/rubocop-remediation/tracker.md index 1be1c46b..a257d943 100644 --- a/docs/plans/rubocop-remediation/tracker.md +++ b/docs/plans/rubocop-remediation/tracker.md @@ -2,7 +2,7 @@ ## Plan Reference -[plan.md](./plan.md) +[plan.md](plan.md) --- diff --git a/lib/tasks/json.rake b/lib/tasks/json.rake index a4f7008f..81ec4fca 100644 --- a/lib/tasks/json.rake +++ b/lib/tasks/json.rake @@ -19,9 +19,9 @@ namespace :json do task :import, [:jsonfile] => :environment do |_t, args| raise "ERROR: This rake task is supposed to be used only by developers." if Rails.env.production? - file = File.open args[:jsonfile] - data = JSON.load file # rubocop:disable Security/JSONLoad - file.close + data = File.open(args[:jsonfile]) do |file| + JSON.load file # rubocop:disable Security/JSONLoad + end # expected structure: # { 'v1': {'facilities': [ diff --git a/package-lock.json b/package-lock.json index e06a21e5..a7a1dfac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "bulma": "^1.0.2", "bulma-tooltip": "^3.0.2", "flatpickr": "^4.6.9", - "sass": "^1.77.8", + "sass": "^1.98.0", "trix": "^2.1.4" }, "devDependencies": { @@ -61,6 +61,302 @@ "@rails/actioncable": ">=7.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@rails/actioncable": { "version": "8.1.200", "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.200.tgz", @@ -94,19 +390,6 @@ "integrity": "sha512-g3//JBja1s04Zflj7IoMLQuXza9i4ZvtLmm0r0dMwh1QQUs6rL2iKUOGGyERfLsd81SnXC5ucfVV//rtsDlEEA==", "license": "MIT" }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", @@ -225,27 +508,6 @@ "to-fast-properties": "^1.0.3" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/bulma": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.2.tgz", @@ -259,30 +521,18 @@ "license": "MIT" }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/core-js": { @@ -292,6 +542,16 @@ "hasInstallScript": true, "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -301,72 +561,24 @@ "node": ">=0.10.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/flatpickr": { "version": "4.6.13", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==", "license": "MIT" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "license": "MIT" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -376,6 +588,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", + "optional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -383,15 +596,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/jquery": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", @@ -405,37 +609,37 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "optional": true, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/regenerator-runtime": { @@ -445,13 +649,13 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", + "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -459,6 +663,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/source-map-js": { @@ -485,18 +692,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/trix": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/trix/-/trix-2.1.4.tgz", diff --git a/package.json b/package.json index 40c8cd35..2b79f7a4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "linkvan-api", "private": true, "dependencies": { - "@fortawesome/fontawesome-free": "^6.5.1", + "@fortawesome/fontawesome-free": "^7.2.0", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo-rails": "^8.0.18", "@rails/actioncable": "^8.1.0", @@ -13,7 +13,7 @@ "bulma": "^1.0.2", "bulma-tooltip": "^3.0.2", "flatpickr": "^4.6.9", - "sass": "^1.77.8", + "sass": "^1.98.0", "trix": "^2.1.4" }, "version": "0.1.0", diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 08df26a0..cd35309c 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -42,8 +42,7 @@ # If you are not using ActiveRecord, you can remove these lines. begin ActiveRecord::Migration.maintain_test_schema! -rescue ActiveRecord::PendingMigrationError => e - puts e.to_s.strip +rescue ActiveRecord::PendingMigrationError exit 1 end diff --git a/spec/services/external/vancouver_api/integration_test.rb b/spec/services/external/vancouver_api/integration_test.rb index c8ce8c26..fc9986bb 100644 --- a/spec/services/external/vancouver_api/integration_test.rb +++ b/spec/services/external/vancouver_api/integration_test.rb @@ -1,7 +1,7 @@ # Final integration test for the Vancouver API Client require_relative "vancouver_api_client" -# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity, Naming/PredicateMethod +# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity, Naming/PredicateMethod, RSpec/Output def test_client client = External::VancouverCity::VancouverApiClient.new @@ -63,7 +63,6 @@ def test_client puts "\n=== All tests passed! The client is working correctly. ===" true end -# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Naming/PredicateMethod # Run the test if test_client @@ -72,3 +71,4 @@ def test_client puts "\n❌ Some tests failed. Please check the implementation." exit 1 end +# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Naming/PredicateMethod, RSpec/Output diff --git a/spec/services/locations/searcher_spec.rb b/spec/services/locations/searcher_spec.rb index 4be42cf4..ef036f69 100644 --- a/spec/services/locations/searcher_spec.rb +++ b/spec/services/locations/searcher_spec.rb @@ -149,8 +149,8 @@ expect(second_enumeration.length).to eq(2) # Both should contain Location objects - expect(first_enumeration.all? { |loc| loc.is_a?(Location) }).to be true - expect(second_enumeration.all? { |loc| loc.is_a?(Location) }).to be true + expect(first_enumeration.all?(Location)).to be true + expect(second_enumeration.all?(Location)).to be true end end end diff --git a/spec/support/pages/admin_notice_new_page_fixed.rb b/spec/support/pages/admin_notice_new_page_fixed.rb deleted file mode 100644 index 2dbd5356..00000000 --- a/spec/support/pages/admin_notice_new_page_fixed.rb +++ /dev/null @@ -1,87 +0,0 @@ -# frozen_string_literal: true - -require_relative "base_page" - -class AdminNoticeNewPageFixed < BasePage - def visit_new_notice - visit_page new_admin_notice_path - self - end - - def create_notice(attributes = {}) - fill_in "Title", with: attributes[:title] || "Test Notice" - fill_trix_editor "Content", with: attributes[:content] || "Test content" - # Handle published checkbox - default to unpublished unless specified - if attributes[:published] - check "Published" - else - uncheck "Published" - end - click_button "Create Notice" - end - - private - - def fill_trix_editor(label, with:) - # Multiple approaches to find the trix editor - trix_editor = find_trix_editor_for_label(label) - - # Use JavaScript to set the Trix editor content - execute_script("arguments[0].editor.insertHTML(arguments[1])", trix_editor, with) - end - - def find_trix_editor_for_label(label) - # Approach 1: Try to find trix-editor directly (simplest) - begin - return find("trix-editor") - rescue Capybara::ElementNotFound - puts "Approach 1 failed: Could not find trix-editor directly" - end - - # Approach 2: Try the original method - begin - field_id = find_field(label)[:id] - return find("##{field_id}_trix_editor") - rescue Capybara::ElementNotFound - puts "Approach 2 failed: Could not find field with label '#{label}'" - end - - # Approach 3: Find by hidden input pattern (most reliable for ActionText) - begin - # Look for hidden input with name containing 'content' - hidden_inputs = all("input[name*='[content]']") - hidden_inputs.each do |input| - field_id = input[:id] - # Try multiple ID patterns - trix_id_patterns = [ - "#{field_id}_trix_editor", - "#{field_id.gsub('_input', '')}_trix_editor", - field_id.gsub("_input", "") - ] - - trix_id_patterns.each do |trix_id| - return find("##{trix_id}") - rescue Capybara::ElementNotFound - next - end - end - rescue StandardError => e - puts "Approach 3 failed: #{e.message}" - end - - # Approach 4: Find by data attributes or other patterns - begin - # Look for any trix-editor elements and use the first one - trix_editors = all("trix-editor") - return trix_editors.first if trix_editors.any? - rescue StandardError => e - puts "Approach 4 failed: #{e.message}" - end - - raise "Could not find trix editor for label '#{label}' after trying all approaches" - end - - def has_form_errors? - has_content?("can't be blank") || has_css?(".field_with_errors") - end -end diff --git a/yarn.lock b/yarn.lock index 55c6098c..d51e5b42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@fortawesome/fontawesome-free@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz" - integrity sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw== +"@fortawesome/fontawesome-free@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d" + integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg== "@hotwired/stimulus@^3.2.2": version "3.2.2" @@ -25,7 +25,96 @@ resolved "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.18.tgz" integrity sha512-dG0N7khQsP8sujclodQE3DYkI4Lq7uKA04fhT0DCC/DwMgn4T4WM3aji6EC6+iCfABQeJncY0SraXqVeOq0vvQ== -"@rails/actioncable@^8.1.0", "@rails/actioncable@>=7.0": +"@parcel/watcher-android-arm64@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz#5f32e0dba356f4ac9a11068d2a5c134ca3ba6564" + integrity sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A== + +"@parcel/watcher-darwin-arm64@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz#88d3e720b59b1eceffce98dac46d7c40e8be5e8e" + integrity sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA== + +"@parcel/watcher-darwin-x64@2.5.6": + version "2.5.6" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz" + integrity sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg== + +"@parcel/watcher-freebsd-x64@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz#8bc26e9848e7303ac82922a5ae1b1ef1bdb48a53" + integrity sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng== + +"@parcel/watcher-linux-arm-glibc@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz#1328fee1deb0c2d7865079ef53a2ba4cc2f8b40a" + integrity sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ== + +"@parcel/watcher-linux-arm-musl@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz#bad0f45cb3e2157746db8b9d22db6a125711f152" + integrity sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg== + +"@parcel/watcher-linux-arm64-glibc@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz#b75913fbd501d9523c5f35d420957bf7d0204809" + integrity sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA== + +"@parcel/watcher-linux-arm64-musl@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz#da5621a6a576070c8c0de60dea8b46dc9c3827d4" + integrity sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA== + +"@parcel/watcher-linux-x64-glibc@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz#ce437accdc4b30f93a090b4a221fd95cd9b89639" + integrity sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ== + +"@parcel/watcher-linux-x64-musl@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz#02400c54b4a67efcc7e2327b249711920ac969e2" + integrity sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg== + +"@parcel/watcher-win32-arm64@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz#caae3d3c7583ca0a7171e6bd142c34d20ea1691e" + integrity sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q== + +"@parcel/watcher-win32-ia32@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz#9ac922550896dfe47bfc5ae3be4f1bcaf8155d6d" + integrity sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g== + +"@parcel/watcher-win32-x64@2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz#73fdafba2e21c448f0e456bbe13178d8fe11739d" + integrity sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw== + +"@parcel/watcher@^2.4.1": + version "2.5.6" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz" + integrity sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ== + dependencies: + detect-libc "^2.0.3" + is-glob "^4.0.3" + node-addon-api "^7.0.0" + picomatch "^4.0.3" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.6" + "@parcel/watcher-darwin-arm64" "2.5.6" + "@parcel/watcher-darwin-x64" "2.5.6" + "@parcel/watcher-freebsd-x64" "2.5.6" + "@parcel/watcher-linux-arm-glibc" "2.5.6" + "@parcel/watcher-linux-arm-musl" "2.5.6" + "@parcel/watcher-linux-arm64-glibc" "2.5.6" + "@parcel/watcher-linux-arm64-musl" "2.5.6" + "@parcel/watcher-linux-x64-glibc" "2.5.6" + "@parcel/watcher-linux-x64-musl" "2.5.6" + "@parcel/watcher-win32-arm64" "2.5.6" + "@parcel/watcher-win32-ia32" "2.5.6" + "@parcel/watcher-win32-x64" "2.5.6" + +"@rails/actioncable@>=7.0", "@rails/actioncable@^8.1.0": version "8.1.200" resolved "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.200.tgz" integrity sha512-on0DSb7AFUkq1ocxivDNQhhGW/RQpY91zvRVyyaEWP4gOOZWy33P/UyxjQk74IENWNrTqs8+zOGHwTjiiFruRw== @@ -37,7 +126,7 @@ dependencies: "@rails/activestorage" ">= 8.1.0-alpha" -"@rails/activestorage@^8.1.0", "@rails/activestorage@>= 8.1.0-alpha": +"@rails/activestorage@>= 8.1.0-alpha", "@rails/activestorage@^8.1.0": version "8.1.200" resolved "https://registry.npmjs.org/@rails/activestorage/-/activestorage-8.1.200.tgz" integrity sha512-bPZqv447REBd1NQfba//FjgUqbUd93zKh7+BWhh3vRZ7Nm+RUgm6c5GbWctmik/rMHjsruTHhusYGyoKyf60pg== @@ -49,14 +138,6 @@ resolved "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.12.tgz" integrity sha512-g3//JBja1s04Zflj7IoMLQuXza9i4ZvtLmm0r0dMwh1QQUs6rL2iKUOGGyERfLsd81SnXC5ucfVV//rtsDlEEA== -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - babel-helper-builder-react-jsx@^6.24.1: version "6.26.0" resolved "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz" @@ -153,18 +234,6 @@ babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - bulma-tooltip@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/bulma-tooltip/-/bulma-tooltip-3.0.2.tgz" @@ -175,84 +244,50 @@ bulma@^1.0.2: resolved "https://registry.npmjs.org/bulma/-/bulma-1.0.2.tgz" integrity sha512-D7GnDuF6seb6HkcnRMM9E739QpEY9chDzzeFrHMyEns/EXyDJuQ0XA0KxbBl/B2NTsKSoDomW61jFGFaAxhK5A== -"chokidar@>=3.0.0 <4.0.0": - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" + readdirp "^4.0.1" core-js@^2.4.0: version "2.6.12" resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - flatpickr@^4.6.9: version "4.6.13" resolved "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz" integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" +immutable@^5.1.5: + version "5.1.5" + resolved "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz" + integrity sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - jquery@^3.6.0: version "3.6.1" resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz" @@ -263,36 +298,36 @@ lodash@^4.17.4: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -sass@^1.77.8: - version "1.77.8" - resolved "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz" - integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== +sass@^1.98.0: + version "1.98.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz" + integrity sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.1.5" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" @@ -309,14 +344,7 @@ to-fast-properties@^1.0.3: resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -trix@^2.0.0, trix@^2.1.4: +trix@^2.1.4: version "2.1.4" resolved "https://registry.npmjs.org/trix/-/trix-2.1.4.tgz" integrity sha512-f0AGnqBV8J2qW+fCtVU71JmvzjcxnO5Xbbd6Cl2KrHVRpgXKDqNGTmDmQzNHWU7T2OgtwHwvNiN+OIf3Z3KmHQ==