diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..18ee399e7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,53 @@ + + + +Resolves # + +## Description + + + +### Motivation and Context + + + + + + +### Type of change + + + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) +- [ ] This change requires a change to the deployment process +- [ ] This change requires a documentation update +- [ ] Documentation update + +### How Has This Been Tested? + + + + + +### How Will This Be Deployed? + + + + +### Screenshots + + diff --git a/.github/workflows/test-and-deploy.yml b/.github/workflows/test-and-deploy.yml index ddf9d8a33..a13fb618a 100644 --- a/.github/workflows/test-and-deploy.yml +++ b/.github/workflows/test-and-deploy.yml @@ -61,7 +61,7 @@ jobs: - if: github.ref == 'refs/heads/main' name: Deploy to placecal-staging.org - uses: dokku/github-action@0c02c44f990eac0ed2b3ee90a9b3ca0a38d15349 # v1.5.0 + uses: dokku/github-action@036bf9c07f1b40707a16201bc7a349074c3ec554 # v1.6.1 with: branch: main ci_branch_name: main @@ -70,7 +70,7 @@ jobs: - if: github.ref == 'refs/heads/production' name: Deploy to placecal.org - uses: dokku/github-action@0c02c44f990eac0ed2b3ee90a9b3ca0a38d15349 # v1.5.0 + uses: dokku/github-action@036bf9c07f1b40707a16201bc7a349074c3ec554 # v1.6.1 with: branch: main ci_branch_name: production diff --git a/.node-version b/.node-version index 593cb75bc..f812e4592 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.16.0 \ No newline at end of file +20.18.1 \ No newline at end of file diff --git a/.rubocop.yml b/.rubocop.yml index 51a0b7630..bba9cec92 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -131,4 +131,4 @@ Lint/SelfAssignment: Enabled: false Lint/RedundantCopDisableDirective: Enabled: false - + \ No newline at end of file diff --git a/.ruby-version b/.ruby-version index a0891f563..9c25013db 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.4 +3.3.6 diff --git a/Gemfile b/Gemfile index f69a72ccf..507dc0f57 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -ruby '3.3.4' +ruby '3.3.6' source 'https://rubygems.org' git_source(:github) do |repo_name| @@ -86,7 +86,6 @@ gem 'net-pop', require: false gem 'net-smtp', require: false gem 'observer' gem 'paper_trail' -gem 'rollbar' gem 'uk_postcode' group :development, :test do @@ -104,11 +103,11 @@ group :development do gem 'letter_opener' gem 'rails-erd' gem 'rdoc' - gem 'rubocop', '1.62.0', require: false + gem 'rubocop', '1.69.1', require: false gem 'rubocop-graphql', '1.5.4', require: false gem 'rubocop-minitest', '0.35.1', require: false - gem 'rubocop-performance', '1.21.1', require: false - gem 'rubocop-rails', '2.24.1', require: false + gem 'rubocop-performance', '1.23.0', require: false + gem 'rubocop-rails', '2.27.0', require: false gem 'rubocop-rake', require: false gem 'spring' # gem 'spring-watcher-listen' diff --git a/Gemfile.lock b/Gemfile.lock index 2ad2eed09..15788014c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,7 +135,7 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crack (0.4.5) rexml @@ -179,7 +179,8 @@ GEM factory_bot_rails (6.2.0) factory_bot (~> 6.2.0) railties (>= 5.0.0) - ffi (1.15.5) + ffi (1.17.0) + ffi (1.17.0-x86_64-linux-gnu) font-awesome-rails (4.7.0.8) railties (>= 3.2, < 8.0) foreman (0.87.2) @@ -219,8 +220,8 @@ GEM invisible_captcha (2.2.0) rails (>= 5.2) io-console (0.7.2) - irb (1.11.2) - rdoc + irb (1.14.1) + rdoc (>= 4.0.0) reline (>= 0.4.2) jquery-rails (4.5.0) rails-dom-testing (>= 1, < 3) @@ -228,7 +229,7 @@ GEM thor (>= 0.14, < 2.0) jsbundling-rails (1.0.2) railties (>= 6.0.0) - json (2.7.2) + json (2.8.2) json-canonicalization (0.3.0) json-ld (3.2.3) htmlentities (~> 4.3) @@ -253,8 +254,11 @@ GEM loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.7.1) + mail (2.8.1) mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp marcel (1.0.4) matrix (0.4.2) method_source (1.0.0) @@ -265,9 +269,9 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.22.3) - minitest-rails (7.1.0) + minitest-rails (7.1.1) minitest (~> 5.20) - railties (~> 7.1.0) + railties (>= 7.1.0, < 8.0.0) minitest-rails-capybara (0.0.2) capybara minitest-rails @@ -303,8 +307,8 @@ GEM paper_trail (15.1.0) activerecord (>= 6.1) request_store (~> 1.4) - parallel (1.24.0) - parser (3.3.4.1) + parallel (1.26.3) + parser (3.3.6.0) ast (~> 2.4.1) racc pg (1.4.3) @@ -312,11 +316,11 @@ GEM psych (4.0.6) stringio public_suffix (4.0.7) - puma (5.6.8) + puma (5.6.9) nio4r (~> 2.0) pundit (2.2.0) activesupport (>= 3.0.0) - racc (1.7.3) + racc (1.8.1) rack (2.2.9) rack-cors (1.1.1) rack (>= 2.0.0) @@ -371,7 +375,7 @@ GEM link_header (~> 0.0, >= 0.0.8) rdoc (6.4.1.1) psych (>= 4.0.0) - regexp_parser (2.9.2) + regexp_parser (2.9.3) reline (0.4.3) io-console (~> 0.5) request_store (1.5.1) @@ -384,34 +388,31 @@ GEM http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) netrc (~> 0.8) - rexml (3.2.9) - strscan - rollbar (3.5.2) - rubocop (1.62.0) + rexml (3.3.7) + rubocop (1.69.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.36.2, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.3) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.36.2) parser (>= 3.3.1.0) rubocop-graphql (1.5.4) rubocop (>= 1.50, < 2) rubocop-minitest (0.35.1) rubocop (>= 1.61, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-performance (1.21.1) + rubocop-performance (1.23.0) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rails (2.24.1) + rubocop-rails (2.27.0) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 1.33.0, < 2.0) + rubocop (>= 1.52.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) rubocop-rake (0.6.0) rubocop (~> 1.0) @@ -452,7 +453,6 @@ GEM stimulus-rails (1.0.4) railties (>= 6.0.0) stringio (3.0.9) - strscan (3.1.0) thor (1.3.1) tilt (2.0.11) timecop (0.9.5) @@ -467,7 +467,7 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unicode-display_width (2.5.0) + unicode-display_width (2.6.0) vcr (6.1.0) view_component (3.9.0) activesupport (>= 5.2.0, < 8.0) @@ -558,12 +558,11 @@ DEPENDENCIES rails-controller-testing rails-erd rdoc - rollbar - rubocop (= 1.62.0) + rubocop (= 1.69.1) rubocop-graphql (= 1.5.4) rubocop-minitest (= 0.35.1) - rubocop-performance (= 1.21.1) - rubocop-rails (= 2.24.1) + rubocop-performance (= 1.23.0) + rubocop-rails (= 2.27.0) rubocop-rake sass-rails (= 6.0.0) select2-rails @@ -581,7 +580,7 @@ DEPENDENCIES yard RUBY VERSION - ruby 3.3.4p94 + ruby 3.3.6p108 BUNDLED WITH 2.5.4 diff --git a/README.md b/README.md index 7d079e85d..adbd9f1ba 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ To get an idea of the project and what we're about, check out [the handbook](htt To run PlaceCal locally you will need to install the following dependencies: - [Docker](https://docs.docker.com/get-docker/) -- [Ruby 3.3.4](https://www.ruby-lang.org/) +- [Ruby 3.3.x](https://www.ruby-lang.org/) - [Node.js 20.x](https://nodejs.org/en/download) & (optional) [nvm](https://github.com/nvm-sh/nvm) to manage it - [Yarn 1.x](https://classic.yarnpkg.com/lang/en/) - [ImageMagick](https://imagemagick.org/index.php) for image manipulation @@ -117,6 +117,101 @@ Previously this system used mountain view, and some of the components are still More info here: https://viewcomponent.org/guide/generators.html +### Folder structure + +Our project is showing it's age and migration across multiple Rails version. Here's the state of play at the moment - we are currently aiming to simplify this and remove deprecated files. + +``` +── app +│   ├── assets +│   │   ├── builds # Old javascript builds - possibly deprecated +│   │   ├── config # Unsure what this is - something PWA related? +│   │   ├── fonts +│   │   ├── images +│   │   ├── pdfs # Legacy PDFs from our early years (can be deleted) +│   │   └── stylesheets +│   ├── channels # Unused boilerplate - could be cut +│   ├── components # A mix of mountain_view and view_component components (the latter have the `_component` suffix). +│   ├── constraints # Directs to correct site based on subdomain +│   ├── controllers # Public app controllers +│   │   ├── admin # Admin area controllers +│   │   ├── concerns +│   │   └── users +│   ├── datatables # Admin area datatables +│   ├── graphql # API +│   ├── helpers +│   ├── javascript # This should be where all the js lives! +│   │   ├── controllers +│   │   └── src +│   ├── jobs # Importer logic - jobs are created by cron (`/lib/tasks`). There's a readme here with more info +│   ├── mailers # Email configuration +│   ├── models +│   ├── policies # Pundit rules for who can do and access what +│   ├── uploaders # CarrierWave rules for handling image and logo uploads +│   ├── validators # Postcode validator - should possibly live somewhere else +│   └── views +│   ├── admin # Admin area +│   ├── collections # Deprecated feature to create abritrary event collections, was previously used for our early winter festivals +│   ├── devise # Authentication +│   ├── events # Event indexes and show page +│   ├── join_mailer # Templates for creating accounts +│   ├── joins # "Join PlaceCal" form page +│   ├── layouts # Page templates +│   ├── moderation_mailer # Templates for when partners get moderated +│   ├── mountain_view # Deprecated - views for the mountain_view stylesheet page showing all the components +│   ├── news # News article templates - half implemented +│   ├── pages # Static pages mostly used on homepage. Some pages here are not linked anywhere currently +│   ├── partners # Partner indexes and show pages +│   ├── shared # Some shared elements - should probably be migrated to view_components +│   └── sites # Site homepages e.g. mysite.placecal.org +├── collections # API examples to be loaded with Bruno +├── config +│   ├── environments +│   ├── initializers +│   ├── locales +│   └── robots +├── db +│   ├── images # Some seed images - not been looked at for a while +│   │   ├── sites +│   │   └── supporters +│   ├── migrate +│   └── seeds # Seeds to make a test site - currently semi working +├── doc # Another directory that probably needs either deleting or reworking! +│   └── adr # Architectural decision records, used in the early stage of the project then dropped off +├── lib +│   ├── assets +│   ├── data # UK geography ward to district data used to create neighbourhood info +│   ├── tasks # Rake tasks that create ActiveJobs +│   └── templates +│   └── erb # Not sure what this is - some kind of template for rails scaffolds? +├── log +├── nginx.conf.d # Config files here get added to the nginx config by dokku +├── public +├── scripts +├── test +│   ├── components +│   ├── controllers +│   ├── factories +│   ├── fixtures +│   │   ├── files +│   │   └── vcr_cassettes # These record actual output from iCal/API endpoints so we can test against them +│   ├── helpers +│   ├── integration +│   │   ├── admin +│   │   └── graphql # API tests +│   ├── jobs +│   ├── mailers +│   │   └── previews +│   ├── models +│   ├── policies +│   ├── support +│   │   └── api +│   └── system # Capybara tests for things that need JavaScript +│   ├── admin +│   └── graphql +└── vendor # Currently empty - could potentially delete +``` + ## API API examples and test environment are provided using [Bruno](https://www.usebruno.com/). diff --git a/RELEASING.md b/RELEASING.md index 564532cf8..eb75299b4 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,33 +1,34 @@ # Releasing PlaceCal -## 1. Review the [draft release](https://github.com/geeksforsocialchange/PlaceCal/releases) +## 1. Validate changes since the [last release](https://github.com/geeksforsocialchange/PlaceCal/releases) -Every pull request gets added to the latest draft release automatically by robots. +Every pull request gets added to the latest draft release automatically. Validate them on the staging server before continuing. -Go through each one and test any related tickets are truly fixed on the staging site and the new behaviour works as described. If there are any issues, make a call as to whether they need resolving before the release can happen or not. If they're not blocking issues, reopen the tickets or open new tickets for them instead and continue with the release. +1. Validate that each pull request in the draft release does what it's meant to: + 1. If it's a bug fix, check the bug linked in the PR is fixed on the [staging server](https://placecal-staging.org/). If it is, add a screenshot in a comment on the bug's issue ticket so the original reporter gets notified a fix is on the way. + 2. If it's a new feature, make a screenshot or video of the feature working on the staging server and add it as a comment in the pull release. +2. In both cases, open new issues as needed if these don't resolve the issue. +3. Add the `verified` label to resolved issues if you're happy the fix is working +4. If you're happy to proceed, move to the next section of the guide. If not, merge PRs to address issues until you are. +5. Decide the next version number [by reviewing the current one](https://github.com/geeksforsocialchange/PlaceCal/releases) -Ensure that the node version specified in `package.json` matches the version specified in `.node-version`. +## 2. Deploy to production -## 2. Open a pull request +1. [Open a pull request from `main` into `production`](https://github.com/geeksforsocialchange/PlaceCal/compare/production...main) +2. Title it with the next version number. +3. Ensure you are doing a **merge commit based merge**. Do not squash or rebase, and wait for CI to pass. +4. **Do not update the branch using the automatically generated prompt**. Github will invite you to update the branch because `production` has additional merge commits that don't exist in `main`. It's no big deal if you forget, but this just creates an unneeded extra commit that needs merging back into `main` later. +5. Get someone to approve the PR, then merge into production. +6. Once the CI passes on the `production` branch, the patch is live. You can double check the git reference in the admin interface on the left sidebar to check this has happened. -If everything looks good to publish, open a pull request from `main` into `production` and give it a title reflecting the new version we're releasing. +## 3. Make a release -Github will invite you to update the branch because `production` has aditional merge commits that don't exist in `main`, you don't need to do this. +Assuming everything is working, create a new release. -## 3. Edit the release +1. [Edit the draft release](https://github.com/geeksforsocialchange/PlaceCal/releases) +2. Give it a version number and nice description of what's changed. Refer to previous releases to get an idea how to write these. +3. Match the release title to a tag with the same version number. +4. Press the "Publish" button on the release. +5. Email releases@lists.placecal.org with the patch notes. -Edit the draft release to reflect the reality of what we're releasing after reviewing for any unresolved issues. The main aim here is to avoid misleading our future selves with "Fixed X" items when we actually didn't. **Importantly, don't remove any PR links.** Even if the thing they related to didn't work, we want the reference there to know what's included. - -Set the release up to create a new tag of the head of the `main` branch on publish and set the release title to match. - -## 4. Merge the pull request - -Do a **merge commit based merge**. Do not squash or rebase! And wait for CI! - -## 5. Publish the release - -Press the "publish" button on the release. - -## 6. Check the release - -Check to make sure the release went to plan and everything works as expected. +Well done! You released a new version of PlaceCal. diff --git a/app/components/address/address.js b/app/components/address/address.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/components/address/address.scss b/app/components/address/address.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/components/address/address.yml b/app/components/address/address.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/components/address/address_component.rb b/app/components/address/address_component.rb deleted file mode 100644 index 7641d8257..000000000 --- a/app/components/address/address_component.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -# app/components/contact_details/contact_details_component.rb -class AddressComponent < MountainView::Presenter - property :address - property :raw_location - - def formatted_address - if address.present? - - address_lines = address.all_address_lines.map(&:strip) - return address_lines.join(',
').html_safe - end - - uri = URI.parse(raw_location) - "#{uri.hostname}".html_safe - - rescue URI::InvalidURIError - raw_location - end -end diff --git a/app/components/address/_address.html.erb b/app/components/address_component.html.erb similarity index 68% rename from app/components/address/_address.html.erb rename to app/components/address_component.html.erb index 6245d0a5e..656803113 100644 --- a/app/components/address/_address.html.erb +++ b/app/components/address_component.html.erb @@ -1,3 +1,3 @@

- <%= formatted_address %> + <%= sanitize formatted_address %>

diff --git a/app/components/address_component.rb b/app/components/address_component.rb new file mode 100644 index 000000000..3ea20825f --- /dev/null +++ b/app/components/address_component.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class AddressComponent < ViewComponent::Base + def initialize(address:, raw_location: nil) + super + @address = address + @raw_location = raw_location + end + + def formatted_address + if @address.present? + address_lines = @address.all_address_lines.map(&:strip) + return address_lines.join(", #{tag.br}") + end + + uri = URI.parse(@raw_location) + "#{uri.hostname}" + + rescue URI::InvalidURIError + @raw_location + end +end diff --git a/app/components/guidelines.md b/app/components/guidelines.md new file mode 100644 index 000000000..6c3b26771 --- /dev/null +++ b/app/components/guidelines.md @@ -0,0 +1,48 @@ +# Component Guidelines + +## About + +This serves as the reference documentation for components in PlaceCal (how to generate them etc). + +In case you find something unclear, inaccurate or out of date, please feel to create a new issue describing what needs doing :smile: + +## Technical Details + +PlaceCal currently uses [ViewComponent](https://viewcomponent.org/) for all new components. Previously the gem [`mountain_view`](https://github.com/devnacho/mountain_view) was used but has since been deprecated and is in the process of being removed (see [this issue](https://github.com/geeksforsocialchange/PlaceCal/issues/2270)) + +### Creating a new component + +[Follow the instructions](https://viewcomponent.org/guide/generators.html) over on the ViewComponents' documentation to generate a new component. + +### Folder structure + +For simple components, the component and its template should appear in `app/components/` as shown below: + +``` +components +├── address_component.rb # Component definition +└── address_component.html.erb # HTML template +``` + +For more complex components, they should have their own folder. Using the above as an example, the folder structure would look like so: + +``` +components +├── address_component.rb # Component definition +└── address_component +    ├── address_component.html.erb # HTML template +    ├── address_component.js # Optional: Stimulus controller +    └── address_component.scss # Optional: Component-namespaced scss +``` + +### Linting + +Components follow the same conventions as regular Ruby on Rails code. RuboCop gets run as part of our [pre-commit](https://github.com/geeksforsocialchange/PlaceCal/blob/main/package.json#L33-L36) hooks so any violations found will automatically be fixed. Whatever can't be fixed, you'll have to fix yourself :grinning: + +### Testing + +When testing components, please make sure that you write unit tests that only exercise the component's rendering logic. This means that no usage of VCR or an overly elaborate test data setup within the component test. + +### Il8n + +Localization is handled by the files in the `config/locales` directory. diff --git a/app/graphql/types/event_queries.rb b/app/graphql/types/event_queries.rb index ce5f22d13..720489f5b 100644 --- a/app/graphql/types/event_queries.rb +++ b/app/graphql/types/event_queries.rb @@ -61,7 +61,7 @@ def events_by_filter(**args) end end - query = query.where('dtstart >= ?', from_date) + query = query.where(dtstart: from_date..) if args[:to_date].present? if args[:to_date] =~ /^\s*(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})/ @@ -80,7 +80,7 @@ def events_by_filter(**args) raise GraphQL::ExecutionError, "toDate not in 'YYYY-MM-DD HH:MM' format" end - query = query.where('dtstart < ?', to_date) + query = query.where(dtstart: ...to_date) end if args[:neighbourhood_id].present? diff --git a/app/graphql/types/partner_type.rb b/app/graphql/types/partner_type.rb index 77201a698..2f5371533 100644 --- a/app/graphql/types/partner_type.rb +++ b/app/graphql/types/partner_type.rb @@ -32,11 +32,14 @@ class PartnerType < Types::BaseObject description: 'The URL provided by the partner for users to find out more info' field :twitter_url, String, - description: 'The URL to the partner\'s Twitter profile' + description: "Full URL for partner's Twitter / X profile" field :facebook_url, String, method: :facebook_link, - description: 'The URL of the partner\'s Facebook page' + description: "Full URL of partner's Facebook page" + + field :instagram_url, String, + description: "Full URL of partner's instagram page" field :areas_served, [NeighbourhoodType], method: :service_area_neighbourhoods, diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index d79663fc3..f6220e320 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -45,7 +45,7 @@ def next_url(next_event) period: @period, sort: @sort, repeating: @repeating - }.keep_if { |_key, value| value.present? } + }.compact_blank! events_by_date_path(opts) end diff --git a/app/jobs/calendar_importer/events/linked_data_event.rb b/app/jobs/calendar_importer/events/linked_data_event.rb index 174373f52..942afaa31 100644 --- a/app/jobs/calendar_importer/events/linked_data_event.rb +++ b/app/jobs/calendar_importer/events/linked_data_event.rb @@ -5,7 +5,7 @@ class LinkedDataEvent < Base attr_reader :uid, :start_time, :end_time, :summary, :description, :location def initialize(data) - super data + super @url = data['url'] @description = data['description'] diff --git a/app/jobs/calendar_importer/parsers/ld_json.rb b/app/jobs/calendar_importer/parsers/ld_json.rb index 27567a8d2..b7c3e4c73 100644 --- a/app/jobs/calendar_importer/parsers/ld_json.rb +++ b/app/jobs/calendar_importer/parsers/ld_json.rb @@ -6,7 +6,7 @@ class LdJson < Base KEY = 'ld-json' def initialize(calendar, options = {}) - super calendar, options + super end DOMAINS = ['various'].freeze diff --git a/app/jobs/calendar_importer/parsers/manchester_uni.rb b/app/jobs/calendar_importer/parsers/manchester_uni.rb index 8c1f520ce..d8efb4255 100644 --- a/app/jobs/calendar_importer/parsers/manchester_uni.rb +++ b/app/jobs/calendar_importer/parsers/manchester_uni.rb @@ -15,13 +15,9 @@ def self.allowlist_pattern end def import_events_from(data) - events = [] - - data.xpath('//ns:event').each do |event| - events << CalendarImporter::Events::ManchesterUniEvent.new(event) + events = data.xpath('//ns:event').map do |event| + CalendarImporter::Events::ManchesterUniEvent.new(event) end - - events end end end diff --git a/app/jobs/calendar_importer_job.rb b/app/jobs/calendar_importer_job.rb index 2848f91af..eee07ea10 100644 --- a/app/jobs/calendar_importer_job.rb +++ b/app/jobs/calendar_importer_job.rb @@ -59,8 +59,6 @@ def report_error(e, message) # see note in Calendar#flag_error_import_job! for details calendar.reload calendar.flag_error_import_job! full_message - # puts full_message, backtrace if Rails.env.development? - # Rollbar.error full_message, { exception_type: e.class.name, backtrace: backtrace } end def report_bad_source_error(e) diff --git a/app/models/calendar.rb b/app/models/calendar.rb index 46bf0144e..b1db1c774 100644 --- a/app/models/calendar.rb +++ b/app/models/calendar.rb @@ -83,7 +83,7 @@ def requires_default_location? # This uses PaperTrail to get historical records of the Event models, including deletes # It does this to show a "event added" / "event removed" thing def recent_activity - versions = PaperTrail::Version.with_item_keys('Event', event_ids).where('created_at >= ?', 2.weeks.ago) + versions = PaperTrail::Version.with_item_keys('Event', event_ids).where(created_at: 2.weeks.ago..) versions = versions.or(PaperTrail::Version.destroys .where("item_type = 'Event' AND object @> ? AND created_at >= ?", { calendar_id: id }.to_json, 2.weeks.ago)) diff --git a/app/models/event.rb b/app/models/event.rb index 43731cff5..5cec71e34 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -44,8 +44,7 @@ class Event < ApplicationRecord # Find by day onwards scope :future, lambda { |day| day_start = day.midnight # 2024-04-01 00:00:00 +0100 - where('dtstart >= ?', - day_start) + where(dtstart: day_start..) } # For the API eventFilter find by neighbourhood @@ -81,7 +80,7 @@ class Event < ApplicationRecord 'lower(addresses.postcode) in (:partner_postcodes))', partner_ids: partners.map(&:id), partner_names: partners.map { |p| p.name.downcase }, - partner_postcodes: partners.map(&:address).keep_if(&:present?).map { |a| a.postcode.downcase } + partner_postcodes: partners.map(&:address).compact_blank!.map { |a| a.postcode.downcase } ) else left_joins(:address) @@ -115,11 +114,11 @@ class Event < ApplicationRecord scope :one_off_events_only, -> { where(rrule: false) } scope :one_off_events_first, -> { order(rrule: :asc) } - scope :upcoming, -> { where('dtstart >= ?', DateTime.current.beginning_of_day) } - scope :past, -> { where('dtstart <= ?', DateTime.current.beginning_of_day) } + scope :upcoming, -> { where(dtstart: DateTime.current.beginning_of_day..) } + scope :past, -> { where(dtstart: ..DateTime.current.beginning_of_day) } # Global feed - scope :ical_feed, -> { where('dtstart >= ?', Time.now - 1.week).where('dtend < ?', Time.now + 1.month) } + scope :ical_feed, -> { where(dtstart: (Time.now - 1.week)..).where(dtend: ...(Time.now + 1.month)) } def repeat_frequency rrule[0]['table']['frequency'].titleize if rrule diff --git a/app/models/partner.rb b/app/models/partner.rb index 361231195..a77d6ac9a 100644 --- a/app/models/partner.rb +++ b/app/models/partner.rb @@ -288,6 +288,10 @@ def twitter_url "https://twitter.com/#{twitter_handle}" if twitter_handle.present? end + def instagram_url + "https://instagram.com/#{instagram_handle}" if instagram_handle.present? + end + def logo_url image&.url end diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index 431586a57..d502dbd87 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -29,10 +29,7 @@

Event address

- <%= render_component "address", - address: @event.address, - raw_location: @event.raw_location_from_source - %> + <%= render AddressComponent.new(address: @event.address, raw_location: @event.raw_location_from_source) %>
diff --git a/app/views/pages/privacy.html.erb b/app/views/pages/privacy.html.erb index 1eb2fbc1a..0f3193a13 100644 --- a/app/views/pages/privacy.html.erb +++ b/app/views/pages/privacy.html.erb @@ -72,7 +72,7 @@

Log Files

PlaceCal.org's hosting server follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this as a part of hosting services’ analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp. These are not linked to any information that is personally identifiable.

-

PlaceCal uses an error logging service called Rollbar. This service logs errors that may occur while you are browsing the site. These are not linked to any information that is personally identifiable. The purpose of these logs is to ensure the security and operation of the website is as expected and alert us when it is not.

+

PlaceCal uses an error logging service called [Appsignal](https://www.appsignal.com/). This service logs errors that may occur while you are browsing the site. These are not linked to any information that is personally identifiable. The purpose of these logs is to ensure the security and operation of the website is as expected and alert us when it is not.

Cookies, Web Beacons, Analytics Data and Third Party Privacy Policies

diff --git a/app/views/partners/show.html.erb b/app/views/partners/show.html.erb index b6f70fdc2..e5c255138 100644 --- a/app/views/partners/show.html.erb +++ b/app/views/partners/show.html.erb @@ -46,9 +46,8 @@ <% if @partner.has_service_areas? %>

We operate in <%= partner_service_area_text(@partner) %>.

<% end %> - <%= render_component "address", - address: @partner.address - %> + + <%= render AddressComponent.new(address: @partner.address) %> <% unless @partner.accessibility_info_html.blank? %>
@@ -97,9 +96,7 @@

Address

- <%= render_component "address", - address: place.address - %> + <%= render AddressComponent.new(address: place.address) %>

Contact

diff --git a/collections/All Partners.bru b/collections/All Partners.bru index bb23aaaf7..b192f3593 100644 --- a/collections/All Partners.bru +++ b/collections/All Partners.bru @@ -23,6 +23,7 @@ body:graphql { url twitterUrl facebookUrl + instagramUrl } } } diff --git a/collections/Partner by ID.bru b/collections/Partner by ID.bru index 65d5c4120..d56b3f591 100644 --- a/collections/Partner by ID.bru +++ b/collections/Partner by ID.bru @@ -22,6 +22,7 @@ body:graphql { url twitterUrl facebookUrl + instagramUrl } } diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb index f4556db39..6d56e4390 100644 --- a/config/initializers/application_controller_renderer.rb +++ b/config/initializers/application_controller_renderer.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # ActiveSupport::Reloader.to_prepare do diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index d0f0d3b5d..4b63f2893 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 98230c980..87fd451f0 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # Define an application-wide content security policy diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index a48d4eb00..0c410fe9e 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # # This file contains migration options to ease your Rails 6.0 upgrade. diff --git a/config/initializers/rollbar.rb b/config/initializers/rollbar.rb deleted file mode 100644 index e02425cd1..000000000 --- a/config/initializers/rollbar.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -Rollbar.configure do |config| - # Without configuration, Rollbar is enabled in all environments. - # To disable in specific environments, set config.enabled=false. - - config.access_token = ENV.fetch('ROLLBAR_ACCESS_TOKEN', nil) - - # Here we'll disable in 'test': - config.enabled = false if Rails.env.development? || Rails.env.test? - - # By default, Rollbar will try to call the `current_user` controller method - # to fetch the logged-in user object, and then call that object's `id`, - # `username`, and `email` methods to fetch those properties. To customize: - # config.person_method = "my_current_user" - # config.person_id_method = "my_id" - # config.person_username_method = "my_username" - # config.person_email_method = "my_email" - - # If you want to attach custom data to all exception and message reports, - # provide a lambda like the following. It should return a hash. - # config.custom_data_method = lambda { {:some_key => "some_value" } } - - # Add exception class names to the exception_level_filters hash to - # change the level that exception is reported at. Note that if an exception - # has already been reported and logged the level will need to be changed - # via the rollbar interface. - # Valid levels: 'critical', 'error', 'warning', 'info', 'debug', 'ignore' - # 'ignore' will cause the exception to not be reported at all. - # config.exception_level_filters.merge!('MyCriticalException' => 'critical') - # - # You can also specify a callable, which will be called with the exception instance. - # config.exception_level_filters.merge!('MyCriticalException' => lambda { |e| 'critical' }) - - # Enable asynchronous reporting (uses girl_friday or Threading if girl_friday - # is not installed) - # config.use_async = true - # Supply your own async handler: - # config.async_handler = Proc.new { |payload| - # Thread.new { Rollbar.process_from_async_handler(payload) } - # } - - # Enable asynchronous reporting (using sucker_punch) - # config.use_sucker_punch - - # Enable delayed reporting (using Sidekiq) - # config.use_sidekiq - # You can supply custom Sidekiq options: - # config.use_sidekiq 'queue' => 'default' - - # If you run your staging application instance in production environment then - # you'll want to override the environment reported by `Rails.env` with an - # environment variable like this: `ROLLBAR_ENV=staging`. This is a recommended - # setup for Heroku. See: - # https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment - config.environment = ENV['ROLLBAR_ENV'].presence || Rails.env - - # https://docs.rollbar.com/docs/ruby#exception-level-filters - config.exception_level_filters.merge!('ActionController::RoutingError' => 'ignore') -end diff --git a/config/routes.rb b/config/routes.rb index a2230628c..8a73ec8b9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -95,6 +95,7 @@ get '/robots.txt' => 'pages#robots' + get '/api/v1/graphql', to: 'graphql#execute' post '/api/v1/graphql', to: 'graphql#execute' mount GraphiQL::Rails::Engine, at: '/graphiql', graphql_path: '/api/v1/graphql' if Rails.env.development? diff --git a/package.json b/package.json index d8202741b..69de93eea 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,16 @@ "@hotwired/stimulus": "3.2.2", "@hotwired/turbo-rails": "7.3.0", "@nathanvda/cocoon": "1.2.14", - "@rails/ujs": "6.1.7", + "@rails/ujs": "6.1.710", "bootstrap": "4.6.2", "datatables.net-bs4": "1.13.11", - "esbuild": "0.23.1", + "esbuild": "0.24.0", "esbuild-rails": "1.0.7", "jquery": "3.7.1", "leaflet": "1.9.4", "lodash": "4.17.21", "popper.js": "1.16.1", - "sass": "1.77.8", + "sass": "1.82.0", "select2": "4.0.13" }, "devDependencies": { @@ -35,6 +35,6 @@ "{*.{rb,jbuilder,rake,ru},.simplecov,Gemfile,Rakefile}": "bundle exec rubocop --force-exclusion --autocorrect" }, "engines": { - "node": "20.16.0" + "node": "20.18.1" } } diff --git a/test/components/address_component_test.rb b/test/components/address_component_test.rb new file mode 100644 index 000000000..51d3dd04f --- /dev/null +++ b/test/components/address_component_test.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'test_helper' +require 'view_component/test_case' + +class AddressComponentTest < ViewComponent::TestCase + setup do + # TODO: once we can make the event factory use a local calendar + # instead of one that makes outgoing HTTP calls, switch to using + # the event factory here. Or remove this TODO once + # we have an integration test + @address = create(:address) + @raw_location = 'Unformatted Address, Ungeolocated Lane, Manchester' + end + + def test_component_renders_address + render_inline(AddressComponent.new(address: @address, raw_location: @raw_location)) + assert_text '123 Moss Ln E, Manchester, Manchester, M15 5DD' + end +end diff --git a/test/integration/graphql/partners_integration_test.rb b/test/integration/graphql/partners_integration_test.rb index 909c1987c..6e7a6238b 100644 --- a/test/integration/graphql/partners_integration_test.rb +++ b/test/integration/graphql/partners_integration_test.rb @@ -127,8 +127,9 @@ def check_basic_fields(data, partner) assert_field_equals data, 'description', value: partner.description assert_field_equals data, 'accessibilitySummary', value: partner.accessibility_info assert_field_equals data, 'url', value: partner.url - assert_field_equals data, 'twitterUrl', value: "https://twitter.com/#{partner.twitter_handle}" + assert_field_equals data, 'twitterUrl', value: partner.twitter_url assert_field_equals data, 'facebookUrl', value: partner.facebook_link + assert_field_equals data, 'instagramUrl', value: partner.instagram_url # see note below # assert_field_equals data, 'logo', value: partner.image.url @@ -155,6 +156,7 @@ def check_basic_fields(data, partner) url twitterUrl facebookUrl + instagramUrl address { streetAddress diff --git a/test/integration/robots_integration_test.rb b/test/integration/robots_integration_test.rb index 2e9dfd646..b3dc0c932 100644 --- a/test/integration/robots_integration_test.rb +++ b/test/integration/robots_integration_test.rb @@ -10,13 +10,13 @@ class RobotsIntegrationTest < ActionDispatch::IntegrationTest test 'robots.txt blocks site if site is unpublished' do get "http://#{@unpublished_site.slug}.lvh.me:3000/robots.txt" - assert_response 200 + assert_response :ok assert_equal forbid_string, response.body end test 'robots.txt has default comment if site is published' do get "http://#{@published_site.slug}.lvh.me:3000/robots.txt" - assert_response 200 + assert_response :ok assert_equal '# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file', response.body end diff --git a/test/system/collections_test.rb b/test/system/collections_test.rb index 45232f817..b7eecd99a 100644 --- a/test/system/collections_test.rb +++ b/test/system/collections_test.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + ## frozen_string_literal: true # # require 'application_system_test_case' diff --git a/yarn.lock b/yarn.lock index 6c3b7ed0c..a7f6bad00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,125 +2,125 @@ # yarn lockfile v1 -"@esbuild/aix-ppc64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" - integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== - -"@esbuild/android-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" - integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== - -"@esbuild/android-arm@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" - integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== - -"@esbuild/android-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" - integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== - -"@esbuild/darwin-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" - integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== - -"@esbuild/darwin-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" - integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== - -"@esbuild/freebsd-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" - integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== - -"@esbuild/freebsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" - integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== - -"@esbuild/linux-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" - integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== - -"@esbuild/linux-arm@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" - integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== - -"@esbuild/linux-ia32@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" - integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== - -"@esbuild/linux-loong64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" - integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== - -"@esbuild/linux-mips64el@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" - integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== - -"@esbuild/linux-ppc64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" - integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== - -"@esbuild/linux-riscv64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" - integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== - -"@esbuild/linux-s390x@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" - integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== - -"@esbuild/linux-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" - integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== - -"@esbuild/netbsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" - integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== - -"@esbuild/openbsd-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" - integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== - -"@esbuild/openbsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" - integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== - -"@esbuild/sunos-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" - integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== - -"@esbuild/win32-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" - integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== - -"@esbuild/win32-ia32@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" - integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== - -"@esbuild/win32-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" - integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== +"@esbuild/aix-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" + integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== + +"@esbuild/android-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" + integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== + +"@esbuild/android-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" + integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== + +"@esbuild/android-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" + integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== + +"@esbuild/darwin-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" + integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== + +"@esbuild/darwin-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" + integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== + +"@esbuild/freebsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" + integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== + +"@esbuild/freebsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" + integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== + +"@esbuild/linux-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" + integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== + +"@esbuild/linux-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" + integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== + +"@esbuild/linux-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" + integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== + +"@esbuild/linux-loong64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" + integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== + +"@esbuild/linux-mips64el@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" + integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== + +"@esbuild/linux-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" + integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== + +"@esbuild/linux-riscv64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" + integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== + +"@esbuild/linux-s390x@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" + integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== + +"@esbuild/linux-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" + integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== + +"@esbuild/netbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" + integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== + +"@esbuild/openbsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" + integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== + +"@esbuild/openbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" + integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== + +"@esbuild/sunos-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" + integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== + +"@esbuild/win32-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" + integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== + +"@esbuild/win32-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" + integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== + +"@esbuild/win32-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" + integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== "@hotwired/stimulus@3.2.2": version "3.2.2" @@ -168,15 +168,98 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + "@rails/actioncable@^7.0": version "7.0.4" resolved "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.0.4.tgz" integrity sha512-tz4oM+Zn9CYsvtyicsa/AwzKZKL+ITHWkhiu7x+xF77clh2b4Rm+s6xnOgY/sGDWoFWZmtKsE95hxBPkgQQNnQ== -"@rails/ujs@6.1.7": - version "6.1.7" - resolved "https://registry.npmjs.org/@rails/ujs/-/ujs-6.1.7.tgz" - integrity sha512-0e7WQ4LE/+LEfW2zfAw9ppsB6A8RmxbdAUPAF++UT80epY+7emuQDkKXmaK0a9lp6An50RvzezI0cIQjp1A58w== +"@rails/ujs@6.1.710": + version "6.1.710" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.710.tgz#14cbf938c49985af51cca52d117f9c358ea4a579" + integrity sha512-NUS8nUkYHGSn/EDg3oJCkpMweSKeFxA4ef6pcnW2fJEZ7RcoWdJa1rr9vamUoqzNR+Ctd8ezsgBMAjxUahVB1w== ansi-escapes@^5.0.0: version "5.0.0" @@ -195,25 +278,12 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -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== - bootstrap@4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -225,20 +295,12 @@ chalk@5.3.0: resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== -"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== - 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" +chokidar@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.0.tgz#4d603963e5dd762dc5c7bb1cb5664e53a3002225" + integrity sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA== + dependencies: + readdirp "^4.0.1" cli-cursor@^4.0.0: version "4.0.0" @@ -296,6 +358,11 @@ debug@4.3.4: dependencies: ms "2.1.2" +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -313,35 +380,35 @@ esbuild-rails@1.0.7: dependencies: fast-glob "^3.2.12" -esbuild@0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" - integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== +esbuild@0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" + integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== optionalDependencies: - "@esbuild/aix-ppc64" "0.23.1" - "@esbuild/android-arm" "0.23.1" - "@esbuild/android-arm64" "0.23.1" - "@esbuild/android-x64" "0.23.1" - "@esbuild/darwin-arm64" "0.23.1" - "@esbuild/darwin-x64" "0.23.1" - "@esbuild/freebsd-arm64" "0.23.1" - "@esbuild/freebsd-x64" "0.23.1" - "@esbuild/linux-arm" "0.23.1" - "@esbuild/linux-arm64" "0.23.1" - "@esbuild/linux-ia32" "0.23.1" - "@esbuild/linux-loong64" "0.23.1" - "@esbuild/linux-mips64el" "0.23.1" - "@esbuild/linux-ppc64" "0.23.1" - "@esbuild/linux-riscv64" "0.23.1" - "@esbuild/linux-s390x" "0.23.1" - "@esbuild/linux-x64" "0.23.1" - "@esbuild/netbsd-x64" "0.23.1" - "@esbuild/openbsd-arm64" "0.23.1" - "@esbuild/openbsd-x64" "0.23.1" - "@esbuild/sunos-x64" "0.23.1" - "@esbuild/win32-arm64" "0.23.1" - "@esbuild/win32-ia32" "0.23.1" - "@esbuild/win32-x64" "0.23.1" + "@esbuild/aix-ppc64" "0.24.0" + "@esbuild/android-arm" "0.24.0" + "@esbuild/android-arm64" "0.24.0" + "@esbuild/android-x64" "0.24.0" + "@esbuild/darwin-arm64" "0.24.0" + "@esbuild/darwin-x64" "0.24.0" + "@esbuild/freebsd-arm64" "0.24.0" + "@esbuild/freebsd-x64" "0.24.0" + "@esbuild/linux-arm" "0.24.0" + "@esbuild/linux-arm64" "0.24.0" + "@esbuild/linux-ia32" "0.24.0" + "@esbuild/linux-loong64" "0.24.0" + "@esbuild/linux-mips64el" "0.24.0" + "@esbuild/linux-ppc64" "0.24.0" + "@esbuild/linux-riscv64" "0.24.0" + "@esbuild/linux-s390x" "0.24.0" + "@esbuild/linux-x64" "0.24.0" + "@esbuild/netbsd-x64" "0.24.0" + "@esbuild/openbsd-arm64" "0.24.0" + "@esbuild/openbsd-x64" "0.24.0" + "@esbuild/sunos-x64" "0.24.0" + "@esbuild/win32-arm64" "0.24.0" + "@esbuild/win32-ia32" "0.24.0" + "@esbuild/win32-x64" "0.24.0" eventemitter3@^5.0.1: version "5.0.1" @@ -388,17 +455,12 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -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== - get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@^5.1.2, glob-parent@~5.1.2: +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== @@ -415,17 +477,10 @@ husky@8.0.3: resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -immutable@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== - -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.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.2.tgz#bb8a987349a73efbe6b3b292a9cbaf1b530d296b" + integrity sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw== is-extglob@^2.1.1: version "2.1.1" @@ -437,7 +492,7 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-glob@^4.0.1, 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== @@ -541,6 +596,14 @@ micromatch@4.0.5, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +micromatch@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -556,10 +619,10 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -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.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== npm-run-path@^5.1.0: version "5.1.0" @@ -592,7 +655,7 @@ path-key@^4.0.0: resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -617,12 +680,10 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -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.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" + integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== restore-cursor@^4.0.0: version "4.0.0" @@ -649,14 +710,16 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -sass@1.77.8: - version "1.77.8" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd" - integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== +sass@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" + integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" select2@4.0.13: version "4.0.13"