From 86c75c49fc5d4e0270bab23539515cca08e4e127 Mon Sep 17 00:00:00 2001 From: Jens Ravens Date: Wed, 26 Jun 2024 13:26:38 +0200 Subject: [PATCH] Devcontainers (#103) * initial commit for Devcontainers * switch to devcontainers * update bundler * update dependencies * switch to vite rails * externalize solid queue for debugging * rubocop * adapt CI * switch cuprite to playwright * fix leave spec * fix playwright step --- .devcontainer/devcontainer.json | 42 ++ .devcontainer/docker-compose.yml | 36 ++ .github/workflows/ci.yml | 27 +- .gitignore | 2 + .rubocop.yml | 2 +- .ruby-version | 2 +- .vscode/launch.json | 47 +- .vscode/settings.json | 6 - .vscode/tasks.json | 21 + Gemfile | 16 +- Gemfile.lock | 400 ++++++------- Guardfile | 12 - Procfile.dev | 2 - app/assets/config/manifest.js | 5 - app/assets/javascripts/serviceworker.js.erb | 61 -- app/assets/stylesheets/application.scss | 9 +- app/controllers/manifests_controller.rb | 7 +- app/frontend/entrypoints/application.ts | 2 + app/{assets => frontend}/images/app-icon.png | Bin app/{assets => frontend}/images/logo.svg | 0 app/javascript/application.ts | 14 +- app/javascript/controllers/application.ts | 7 - app/javascript/controllers/index.js | 14 - app/models/harvest_api.rb | 4 +- app/models/user.rb | 4 +- app/views/components/_head.html.slim | 9 +- app/views/components/_sidebar.html.slim | 2 +- app/views/leaves/_leave.html.slim | 2 +- bin/dev | 15 - bin/setup | 16 +- bin/vite | 27 + config/application.rb | 1 - config/database.yml | 2 +- config/initializers/assets.rb | 2 +- config/initializers/serviceworker.rb | 7 - config/puma.rb | 2 +- config/vite.json | 17 + package.json | 7 +- spec/support/system/cuprite_helper.rb | 29 - spec/support/system/cuprite_setup.rb | 24 - spec/support/system/playwright_helper.rb | 38 ++ spec/support/system/playwright_setup.rb | 12 + spec/system/leaves_spec.rb | 9 +- tsconfig.json | 27 +- typings.d.ts | 1 + vite.config.ts | 7 + yarn.lock | 595 +++++++++++++++---- 47 files changed, 997 insertions(+), 596 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml delete mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json delete mode 100644 Guardfile delete mode 100644 Procfile.dev delete mode 100644 app/assets/javascripts/serviceworker.js.erb create mode 100644 app/frontend/entrypoints/application.ts rename app/{assets => frontend}/images/app-icon.png (100%) rename app/{assets => frontend}/images/logo.svg (100%) delete mode 100644 app/javascript/controllers/application.ts delete mode 100644 app/javascript/controllers/index.js delete mode 100755 bin/dev create mode 100755 bin/vite delete mode 100644 config/initializers/serviceworker.rb create mode 100644 config/vite.json delete mode 100644 spec/support/system/cuprite_helper.rb delete mode 100644 spec/support/system/cuprite_setup.rb create mode 100644 spec/support/system/playwright_helper.rb create mode 100644 spec/support/system/playwright_setup.rb create mode 100644 typings.d.ts create mode 100644 vite.config.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..e51a4863 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,42 @@ +{ + "name": "nerdgeschoss", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "postCreateCommand": "bin/setup", + "remoteUser": "root", + "customizations": { + "vscode": { + "extensions": [ + "dbaeumer.vscode-eslint", + "GitHub.copilot", + "esbenp.prettier-vscode", + "sianglim.slim", + "Shopify.ruby-lsp", + "EditorConfig.EditorConfig", + "eamodio.gitlens", + "GraphQL.vscode-graphql", + "bierner.markdown-mermaid" + ], + "settings": { + "typescript.tsdk": "node_modules/typescript/lib", + "rubyLsp.rubyVersionManager": "none", + "[ruby]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "Shopify.ruby-lsp" + } + } + } + }, + "features": { + "ghcr.io/devcontainers/features/desktop-lite:1": {} + }, + "forwardPorts": [ + 6080 + ], + "portsAttributes": { + "6080": { + "label": "playwright" + } + } +} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 00000000..40f3c8aa --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,36 @@ +version: '3' + +services: + app: + image: ghcr.io/nerdgeschoss/nerdgeschoss/development-environment:3.3-18 + volumes: + - ../..:/workspaces:cached + - nerdgeschoss_app-node_modules:/workspaces/nerdgeschoss_app/node_modules + + # Overrides default command so things don't shut down after the process ends. + command: sleep infinity + + # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. + network_mode: service:db + + environment: + REDIS_URL: redis://redis:6379 + TZ: Europe/Berlin + + db: + image: postgres:15.1 + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_HOST_AUTH_METHOD: trust + redis: + image: redis + restart: unless-stopped + volumes: + - redis-data:/data + +volumes: + postgres-data: + redis-data: + nerdgeschoss_app-node_modules: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84680812..9afb4a6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,10 @@ on: [push] env: RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} + RAILS_ENV: test + DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/app + RSPEC_RETRY_RETRY_COUNT: 3 + SCREENSHOTS: '1' jobs: ruby: @@ -11,7 +15,7 @@ jobs: services: postgres: - image: postgres:12 + image: postgres:15 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -25,7 +29,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16.x' + node-version: '18.x' cache: yarn - name: Install yarn run: yarn install @@ -39,25 +43,16 @@ jobs: run: bundle exec i18n-tasks health - name: Check Model Annotations run: bundle exec annotate --models && bin/git_tracked_are_unmodified - env: - DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/app - RAILS_ENV: test - name: JS Lint run: yarn lint - - name: Build Assets - run: yarn build + - name: Install Playwright Browsers + run: npx --yes playwright install --with-deps chromium + - name: Build + run: bundle exec rails assets:precompile - name: Create PG Database run: bundle exec rake db:create db:migrate - env: - DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/app - RAILS_ENV: test - - name: Build and test with Rake + - name: Build and test with RSpec run: bundle exec rspec --format documentation - env: - DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/app - RAILS_ENV: test - RSPEC_RETRY_RETRY_COUNT: 3 - SCREENSHOTS: '1' - name: Upload Screenshots if: always() run: | diff --git a/.gitignore b/.gitignore index 15e1f572..4413cf89 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ node_modules .DS_Store *.env +/public/vite-dev +/public/vite-test diff --git a/.rubocop.yml b/.rubocop.yml index 09de17d3..437ecd6c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,5 +1,5 @@ AllCops: - TargetRubyVersion: 3.1 + SuggestExtensions: false inherit_gem: shimmer: config/rubocop_base.yml diff --git a/.ruby-version b/.ruby-version index 0aec50e6..bea438e9 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.1.4 +3.3.1 diff --git a/.vscode/launch.json b/.vscode/launch.json index ff3302cc..f1c52140 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,14 +5,47 @@ "version": "0.2.0", "configurations": [ { - "type": "rdbg", - "name": "Rails Server", + "name": "UI", + "type": "chrome", "request": "launch", - "command": "bin/rails", - "script": "server", - "args": [], - "askParameters": false, - "useBundler": true + "url": "http://localhost:3000/", + "webRoot": "${workspaceFolder}", + "preLaunchTask": "Sleepdelay" + }, + { + "name": "Rails", + "type": "ruby_lsp", + "request": "launch", + "program": "bin/rails server" + }, + { + "name": "Solid Queue", + "type": "ruby_lsp", + "request": "launch", + "program": "bin/rails solid_queue:start", + "preLaunchTask": "Sleepdelay" + }, + { + "name": "Vite", + "type": "node-terminal", + "request": "launch", + "command": "yarn build --watch" + } + ], + "compounds": [ + { + "name": "Run App", + "configurations": [ + "Vite", + "Rails", + "UI", + "Solid Queue" + ], + "stopAll": true, + "presentation": { + "group": "1_dev", + "order": 1 + } } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 94a6cb6a..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.formatOnSave": true, - "typescript.tsdk": "node_modules/typescript/lib", - "rubyTestExplorer.rspecCommand": "bin/rspec", - "rubyTestExplorer.testFramework": "rspec" -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..5cc191e1 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,21 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Sleepdelay", + "type": "shell", + "command": "sleep 4", + "windows": { + "command": "ping 127.0.0.1 -n 4 > nul" + }, + "group": "none", + "presentation": { + "reveal": "silent", + "panel": "new", + "close": true + } + } + ] +} diff --git a/Gemfile b/Gemfile index b3c2806d..5babdd09 100644 --- a/Gemfile +++ b/Gemfile @@ -1,11 +1,11 @@ # frozen_string_literal: true source "https://rubygems.org" -ruby File.read(File.join(__dir__, ".ruby-version")).strip +ruby "~> #{File.read(File.join(__dir__, ".ruby-version")).strip}" # Core gem "puma" -gem "rails", "7.1.3" +gem "rails", "~> 7.1.3" # Database gem "pg" @@ -41,11 +41,8 @@ gem "yael" gem "faker" # Assets -gem "autoprefixer-rails" -gem "jsbundling-rails" -gem "sassc-rails" -gem "serviceworker-rails" -gem "sprockets" +gem "sprockets-rails" +gem "vite_rails" gem "stimulus-rails" gem "turbo-rails" @@ -59,7 +56,7 @@ gem "sentry-ruby" group :development, :test do gem "capybara" gem "capybara-screenshot-diff" - gem "cuprite" + gem "capybara-playwright-driver" gem "i18n-tasks" gem "rack_session_access" gem "rspec-rails" @@ -76,10 +73,9 @@ end group :development do gem "annotate" gem "debug" - gem "guard" - gem "guard-rspec" gem "letter_opener" gem "listen" gem "rb-fsevent" gem "web-console" + gem "ruby-lsp-rspec", require: false end diff --git a/Gemfile.lock b/Gemfile.lock index 2e3d7549..00fcc371 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,35 +1,35 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3) - actionpack (= 7.1.3) - activesupport (= 7.1.3) + actioncable (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3) - actionpack (= 7.1.3) - activejob (= 7.1.3) - activerecord (= 7.1.3) - activestorage (= 7.1.3) - activesupport (= 7.1.3) + actionmailbox (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.3) - actionpack (= 7.1.3) - actionview (= 7.1.3) - activejob (= 7.1.3) - activesupport (= 7.1.3) + actionmailer (7.1.3.4) + actionpack (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3) - actionview (= 7.1.3) - activesupport (= 7.1.3) + actionpack (7.1.3.4) + actionview (= 7.1.3.4) + activesupport (= 7.1.3.4) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -37,35 +37,35 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3) - actionpack (= 7.1.3) - activerecord (= 7.1.3) - activestorage (= 7.1.3) - activesupport (= 7.1.3) + actiontext (7.1.3.4) + actionpack (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3) - activesupport (= 7.1.3) + actionview (7.1.3.4) + activesupport (= 7.1.3.4) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3) - activesupport (= 7.1.3) + activejob (7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.3.6) - activemodel (7.1.3) - activesupport (= 7.1.3) - activerecord (7.1.3) - activemodel (= 7.1.3) - activesupport (= 7.1.3) + activemodel (7.1.3.4) + activesupport (= 7.1.3.4) + activerecord (7.1.3.4) + activemodel (= 7.1.3.4) + activesupport (= 7.1.3.4) timeout (>= 0.4.0) - activestorage (7.1.3) - actionpack (= 7.1.3) - activejob (= 7.1.3) - activerecord (= 7.1.3) - activesupport (= 7.1.3) + activestorage (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activesupport (= 7.1.3.4) marcel (~> 1.0) - activesupport (7.1.3) + activesupport (7.1.3.4) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -75,26 +75,24 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) annotate (3.2.0) activerecord (>= 3.2, < 8.0) rake (>= 10.4, < 14.0) ast (2.4.2) - autoprefixer-rails (10.4.16.0) - execjs (~> 2) aws-eventstream (1.3.0) - aws-partitions (1.917.0) - aws-sdk-core (3.192.1) + aws-partitions (1.947.0) + aws-sdk-core (3.198.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (1.86.0) + aws-sdk-core (~> 3, >= 3.198.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-s3 (1.153.0) + aws-sdk-core (~> 3, >= 3.198.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -108,18 +106,11 @@ GEM statsd-ruby (~> 1.1) base64 (0.2.0) bcrypt (3.1.20) - better_html (2.1.1) - actionview (>= 6.0) - activesupport (>= 6.0) - ast (~> 2.0) - erubi (~> 1.4) - parser (>= 2.4) - smart_properties - bigdecimal (3.1.7) + bigdecimal (3.1.8) bindex (0.8.1) bootsnap (1.18.3) msgpack (~> 1.2) - builder (3.2.4) + builder (3.3.0) capybara (3.40.0) addressable matrix @@ -129,27 +120,28 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + capybara-playwright-driver (0.5.1) + addressable + capybara + playwright-ruby-client (>= 1.16.0) capybara-screenshot-diff (1.8.3) actionpack (>= 6.1, < 8) capybara (>= 2, < 4) chunky_png (~> 1.3) - chartkick (5.0.6) + chartkick (5.0.7) childprocess (5.0.0) chunky_png (1.4.0) - coderay (1.1.3) coercible (1.0.0) descendants_tracker (~> 0.0.1) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.3) connection_pool (2.4.1) - countries (6.0.0) + countries (6.0.1) unaccent (~> 0.3) crack (1.0.0) bigdecimal rexml crass (1.0.6) - cuprite (0.15) - capybara (~> 3.0) - ferrum (~> 0.14.0) + csv (3.3.0) date (3.3.4) debug (1.9.2) irb (~> 1.10) @@ -166,64 +158,47 @@ GEM document_serializable (0.1.0) activesupport virtus - dotenv (3.1.0) - dotenv-rails (3.1.0) - dotenv (= 3.1.0) + dotenv (3.1.2) + dotenv-rails (3.1.2) + dotenv (= 3.1.2) railties (>= 6.1) drb (2.2.1) - erubi (1.12.0) + dry-cli (1.0.0) + erubi (1.13.0) et-orbi (1.2.11) tzinfo - execjs (2.9.1) - faker (3.3.1) + faker (3.4.1) i18n (>= 1.8.11, < 2) - faraday (2.9.0) + faraday (2.9.2) faraday-net_http (>= 2.0, < 3.2) faraday-multipart (1.0.4) multipart-post (~> 2) faraday-net_http (3.1.0) net-http - ferrum (0.14) - addressable (~> 2.5) - concurrent-ruby (~> 1.1) - webrick (~> 1.7) - websocket-driver (>= 0.6, < 0.8) - ffi (1.16.3) - formatador (1.1.0) + ffi (1.17.0-aarch64-linux-gnu) + ffi (1.17.0-arm64-darwin) + ffi (1.17.0-x86_64-darwin) + ffi (1.17.0-x86_64-linux-gnu) friendly_id (5.5.1) activerecord (>= 4.0.0) - fugit (1.10.1) - et-orbi (~> 1, >= 1.2.7) + fugit (1.11.0) + et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) groupdate (6.4.0) activesupport (>= 6.1) - guard (2.18.1) - formatador (>= 0.2.4) - listen (>= 2.7, < 4.0) - lumberjack (>= 1.0.12, < 2.0) - nenv (~> 0.1) - notiffany (~> 0.0) - pry (>= 0.13.0) - shellany (~> 0.0) - thor (>= 0.18.1) - guard-compat (1.2.1) - guard-rspec (4.7.3) - guard (~> 2.1) - guard-compat (~> 1.1) - rspec (>= 2.99.0, < 4.0) hashdiff (1.1.0) highline (3.0.1) - httparty (0.21.0) + httparty (0.22.0) + csv mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) - i18n (1.14.4) + i18n (1.14.5) concurrent-ruby (~> 1.0) - i18n-tasks (1.0.13) + i18n-tasks (1.0.14) activesupport (>= 4.0.2) ast (>= 2.1.0) - better_html (>= 1.0, < 3.0) erubi highline (>= 2.0.0) i18n @@ -243,12 +218,10 @@ GEM activesupport (>= 6.0.0) railties (>= 6.0.0) io-console (0.7.2) - irb (1.12.0) - rdoc + irb (1.13.2) + rdoc (>= 4.0.0) reline (>= 0.4.2) jmespath (1.6.2) - jsbundling-rails (1.3.0) - railties (>= 6.0.0) json (2.7.2) kaminari (1.2.2) activesupport (>= 4.1.0) @@ -263,7 +236,7 @@ GEM kaminari-core (= 1.2.2) kaminari-core (1.2.2) language_server-protocol (3.17.0.3) - launchy (3.0.0) + launchy (3.0.1) addressable (~> 2.8) childprocess (~> 5.0) letter_opener (1.10.0) @@ -272,10 +245,10 @@ GEM listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) + logger (1.6.0) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - lumberjack (1.2.10) mail (2.8.1) mini_mime (>= 0.1.1) net-imap @@ -283,10 +256,12 @@ GEM net-smtp marcel (1.0.4) matrix (0.4.2) - method_source (1.1.0) - mini_magick (4.12.0) + mime-types (3.5.2) + mime-types-data (~> 3.2015) + mime-types-data (3.2024.0604) + mini_magick (4.13.1) mini_mime (1.1.5) - minitest (5.22.3) + minitest (5.24.0) mission_control-jobs (0.2.1) importmap-rails rails (~> 7.1) @@ -294,13 +269,13 @@ GEM turbo-rails msgpack (1.7.2) multi_json (1.15.0) - multi_xml (0.6.0) - multipart-post (2.4.0) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + multipart-post (2.4.1) mutex_m (0.2.0) - nenv (0.3.0) net-http (0.4.1) uri - net-imap (0.4.11) + net-imap (0.4.14) date net-protocol net-pop (0.1.2) @@ -310,34 +285,34 @@ GEM net-smtp (0.5.0) net-protocol netrc (0.11.0) - newrelic_rpm (9.9.0) - nio4r (2.7.1) - nokogiri (1.16.4-arm64-darwin) + newrelic_rpm (9.11.0) + nio4r (2.7.3) + nokogiri (1.16.6-aarch64-linux) racc (~> 1.4) - nokogiri (1.16.4-x86_64-darwin) + nokogiri (1.16.6-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.4-x86_64-linux) + nokogiri (1.16.6-x86_64-darwin) racc (~> 1.4) - notiffany (0.1.3) - nenv (~> 0.1) - shellany (~> 0.0) - oj (3.16.3) + nokogiri (1.16.6-x86_64-linux) + racc (~> 1.4) + oj (3.16.4) bigdecimal (>= 3.0) orm_adapter (0.5.0) - parallel (1.24.0) - parser (3.3.0.5) + parallel (1.25.1) + parser (3.3.3.0) ast (~> 2.4.1) racc pg (1.5.6) - pry (0.14.2) - coderay (~> 1.1) - method_source (~> 1.0) + playwright-ruby-client (1.44.0) + concurrent-ruby (>= 1.1.6) + mime-types (>= 3.0) + prism (0.30.0) psych (5.1.2) stringio - public_suffix (5.0.5) + public_suffix (6.0.0) puma (6.4.2) nio4r (~> 2.0) - pundit (2.3.1) + pundit (2.3.2) activesupport (>= 3.0.0) pundit-matchers (3.1.2) rspec-core (~> 3.12) @@ -345,32 +320,34 @@ GEM rspec-mocks (~> 3.12) rspec-support (~> 3.12) raabro (1.4.0) - racc (1.7.3) - rack (2.2.9) - rack-session (1.0.2) - rack (< 3) + racc (1.8.0) + rack (3.1.4) + rack-proxy (0.7.7) + rack + rack-session (2.0.0) + rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) rack_session_access (0.2.0) builder (>= 2.0.0) rack (>= 1.0.0) - rackup (1.0.0) - rack (< 3) - webrick - rails (7.1.3) - actioncable (= 7.1.3) - actionmailbox (= 7.1.3) - actionmailer (= 7.1.3) - actionpack (= 7.1.3) - actiontext (= 7.1.3) - actionview (= 7.1.3) - activejob (= 7.1.3) - activemodel (= 7.1.3) - activerecord (= 7.1.3) - activestorage (= 7.1.3) - activesupport (= 7.1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.1.3.4) + actioncable (= 7.1.3.4) + actionmailbox (= 7.1.3.4) + actionmailer (= 7.1.3.4) + actionpack (= 7.1.3.4) + actiontext (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activemodel (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) bundler (>= 1.15.0) - railties (= 7.1.3) + railties (= 7.1.3.4) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -381,9 +358,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.3) - actionpack (= 7.1.3) - activesupport (= 7.1.3) + railties (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -392,30 +369,29 @@ GEM rainbow (3.1.1) rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rdoc (6.6.3.1) + rbs (3.5.1) + logger + rdoc (6.7.0) psych (>= 4.0.0) - regexp_parser (2.9.0) - reline (0.5.2) + regexp_parser (2.9.2) + reline (0.5.9) io-console (~> 0.5) responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.2.6) - rspec (3.13.0) - rspec-core (~> 3.13.0) - rspec-expectations (~> 3.13.0) - rspec-mocks (~> 3.13.0) + rexml (3.3.1) + strscan rspec-core (3.13.0) rspec-support (~> 3.13.0) - rspec-expectations (3.13.0) + rspec-expectations (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.0) + rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.2) + rspec-rails (6.1.3) actionpack (>= 6.1) activesupport (>= 6.1) railties (>= 6.1) @@ -426,7 +402,7 @@ GEM rspec-retry (0.6.2) rspec-core (> 3.3) rspec-support (3.13.1) - rubocop (1.62.1) + rubocop (1.64.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -437,50 +413,37 @@ GEM rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.2) - parser (>= 3.3.0.4) - rubocop-capybara (2.20.0) - rubocop (~> 1.41) - rubocop-factory_bot (2.25.1) - rubocop (~> 1.41) - rubocop-performance (1.20.2) + rubocop-ast (1.31.3) + parser (>= 3.3.1.0) + rubocop-performance (1.21.1) rubocop (>= 1.48.1, < 2.0) - rubocop-ast (>= 1.30.0, < 2.0) - rubocop-rails (2.24.1) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-rails (2.25.0) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) rubocop-rake (0.6.0) rubocop (~> 1.0) - rubocop-rspec (2.29.1) - rubocop (~> 1.40) - rubocop-capybara (~> 2.17) - rubocop-factory_bot (~> 2.22) - rubocop-rspec_rails (~> 2.28) - rubocop-rspec_rails (2.28.3) - rubocop (~> 1.40) + rubocop-rspec (3.0.1) + rubocop (~> 1.61) + ruby-lsp (0.17.4) + language_server-protocol (~> 3.17.0) + prism (>= 0.29.0, < 0.31) + rbs (>= 3, < 4) + sorbet-runtime (>= 0.5.10782) + ruby-lsp-rspec (0.1.12) + ruby-lsp (~> 0.17.0) ruby-progressbar (1.13.0) ruby-vips (2.2.1) ffi (~> 1.12) - sassc (2.4.0) - ffi (~> 1.9) - sassc-rails (2.1.2) - railties (>= 4.0.0) - sassc (>= 2.0) - sprockets (> 3.0) - sprockets-rails - tilt sentry-rails (5.17.3) railties (>= 5.0) sentry-ruby (~> 5.17.3) sentry-ruby (5.17.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - serviceworker-rails (0.6.0) - railties (>= 3.1) - shellany (0.0.1) - shimmer (0.0.34) + shimmer (0.0.35) sitemap_generator (6.3.0) builder (~> 3.0) slim (5.2.1) @@ -490,36 +453,37 @@ GEM actionpack (>= 3.1) railties (>= 3.1) slim (>= 3.0, < 6.0, != 5.0.0) - smart_properties (1.17.0) - solid_queue (0.3.1) + solid_queue (0.3.3) activejob (>= 7.1) activerecord (>= 7.1) - concurrent-ruby (~> 1.2.2) - fugit (~> 1.10.1) + concurrent-ruby (>= 1.3.1) + fugit (~> 1.11.0) railties (>= 7.1) + sorbet-runtime (0.5.11444) sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + sprockets-rails (3.5.1) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) - standard (1.35.1) + standard (1.39.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) - rubocop (~> 1.62.0) + rubocop (~> 1.64.0) standard-custom (~> 1.0.0) - standard-performance (~> 1.3) + standard-performance (~> 1.4) standard-custom (1.0.2) lint_roller (~> 1.0) rubocop (~> 1.50) - standard-performance (1.3.1) + standard-performance (1.4.0) lint_roller (~> 1.1) - rubocop-performance (~> 1.20.2) + rubocop-performance (~> 1.21.0) statsd-ruby (1.5.0) stimulus-rails (1.3.3) railties (>= 6.0.0) - stringio (3.1.0) + stringio (3.1.1) + strscan (3.1.0) temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -549,6 +513,13 @@ GEM axiom-types (~> 0.1) coercible (~> 1.0) descendants_tracker (~> 0.0, >= 0.0.3) + vite_rails (3.0.17) + railties (>= 5.1, < 8) + vite_ruby (~> 3.0, >= 3.2.2) + vite_ruby (3.6.0) + dry-cli (>= 0.7, < 2) + rack-proxy (~> 0.6, >= 0.6.1) + zeitwerk (~> 2.2) warden (1.2.9) rack (>= 2.0.9) web-console (4.2.1) @@ -556,7 +527,7 @@ GEM activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webmock (3.23.0) + webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -567,9 +538,10 @@ GEM xpath (3.2.0) nokogiri (~> 1.8) yael (0.0.3) - zeitwerk (2.6.13) + zeitwerk (2.6.16) PLATFORMS + aarch64-linux arm64-darwin-22 arm64-darwin-23 x86_64-darwin-21 @@ -578,16 +550,15 @@ PLATFORMS DEPENDENCIES annotate - autoprefixer-rails aws-sdk-s3 barnes bcrypt bootsnap capybara + capybara-playwright-driver capybara-screenshot-diff chartkick countries - cuprite debug devise document_serializable @@ -595,13 +566,10 @@ DEPENDENCIES faker friendly_id groupdate - guard - guard-rspec httparty i18n-tasks icalendar (~> 2.4) image_processing - jsbundling-rails kaminari letter_opener listen @@ -614,7 +582,7 @@ DEPENDENCIES pundit pundit-matchers rack_session_access - rails (= 7.1.3) + rails (~> 7.1.3) rails-i18n rb-fsevent rspec-rails @@ -623,26 +591,26 @@ DEPENDENCIES rubocop-rails rubocop-rake rubocop-rspec - sassc-rails + ruby-lsp-rspec sentry-rails sentry-ruby - serviceworker-rails shimmer sitemap_generator slim-rails solid_queue - sprockets + sprockets-rails standard stimulus-rails time_will_tell translate_client turbo-rails + vite_rails web-console webmock yael RUBY VERSION - ruby 3.1.4p223 + ruby 3.3.1p55 BUNDLED WITH - 2.4.7 + 2.5.14 diff --git a/Guardfile b/Guardfile deleted file mode 100644 index c930b627..00000000 --- a/Guardfile +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -clearing :on - -guard :rspec, cmd: "bin/rspec" do - require "guard/rspec/dsl" - dsl = Guard::RSpec::Dsl.new(self) - - # RSpec files - rspec = dsl.rspec - watch(rspec.spec_files) -end diff --git a/Procfile.dev b/Procfile.dev deleted file mode 100644 index 9570c942..00000000 --- a/Procfile.dev +++ /dev/null @@ -1,2 +0,0 @@ -web: bundle exec rails s -p ${PORT:-3000} -js: yarn build --watch diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index d55ec844..e69de29b 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -1,5 +0,0 @@ -//= link_tree ../images -//= link_tree ../fonts -//= link_directory ../stylesheets .css -//= link_directory ../javascripts .js -//= link_tree ../builds .js diff --git a/app/assets/javascripts/serviceworker.js.erb b/app/assets/javascripts/serviceworker.js.erb deleted file mode 100644 index edf1f04a..00000000 --- a/app/assets/javascripts/serviceworker.js.erb +++ /dev/null @@ -1,61 +0,0 @@ -var CACHE_VERSION = 'v1'; -var CACHE_NAME = CACHE_VERSION + ':sw-cache-'; -var CACHE_FILES = ['<%= asset_path "application.css" %>', '/offline.html']; - -function onInstall(event) { - console.debug('[Serviceworker]', 'Installing!', event); - event.waitUntil( - caches - .open(CACHE_NAME) - .then(function prefill(cache) { - console.debug('caching', CACHE_FILES); - return cache.addAll(CACHE_FILES); - }) - .then(self.skipWaiting) - ); -} - -function onActivate(event) { - console.debug('[Serviceworker]', 'Activating!', event); - event.waitUntil( - caches.keys().then(function (cacheNames) { - return Promise.all( - cacheNames - .filter(function (cacheName) { - return cacheName.indexOf(CACHE_VERSION) !== 0; - }) - .map(function (cacheName) { - return caches.delete(cacheName); - }) - ); - }) - ); -} - -// Borrowed from https://github.com/TalAter/UpUp -function onFetch(event) { - event.respondWith( - // try to return untouched request from network first - fetch(event.request).catch(function () { - // if it fails, try to return request from the cache - return caches.match(event.request).then(function (response) { - if (response) { - return response; - } - // if not found in cache, return default offline content for navigate requests - if ( - event.request.mode === 'navigate' || - (event.request.method === 'GET' && - event.request.headers.get('accept').includes('text/html')) - ) { - console.log('[Serviceworker]', 'Fetching offline content', event); - return caches.match('/offline.html'); - } - }); - }) - ); -} - -self.addEventListener('install', onInstall); -self.addEventListener('activate', onActivate); -self.addEventListener('fetch', onFetch); diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 53888dd1..6083c780 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,6 +1,5 @@ -//= require 'application/variables.css' -//= require 'flatpickr/dist/flatpickr.min.css' -//= require_self +@import './application/variables.css'; +@import 'flatpickr/dist/flatpickr.min.css'; // breakpoints $phablet: 600px; @@ -19,5 +18,5 @@ $widescreen-xlarge: 2200px; --widescreen-xlarge: $widescreen-xlarge; } -@import 'application/util/reset'; -@import 'application/components/*'; +@import './application/util/reset'; +@import './application/components/*'; diff --git a/app/controllers/manifests_controller.rb b/app/controllers/manifests_controller.rb index 0b641d6d..92b15948 100644 --- a/app/controllers/manifests_controller.rb +++ b/app/controllers/manifests_controller.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true class ManifestsController < ApplicationController + include ViteRails::TagHelpers + include ActionView::Helpers::AssetUrlHelper + def show render json: { id: "/", @@ -12,13 +15,13 @@ def show background_color: "#ffffff", icons: [ { - src: asset_path("app-icon.png"), + src: vite_asset_path("images/app-icon.png"), sizes: "144x144", type: "image/png", purpose: "any" }, { - src: asset_path("app-icon.png"), + src: vite_asset_path("images/app-icon.png"), sizes: "144x144", type: "image/png", purpose: "maskable" diff --git a/app/frontend/entrypoints/application.ts b/app/frontend/entrypoints/application.ts new file mode 100644 index 00000000..db1e93e6 --- /dev/null +++ b/app/frontend/entrypoints/application.ts @@ -0,0 +1,2 @@ +import '../../javascript/application'; +import '../../assets/stylesheets/application.scss'; diff --git a/app/assets/images/app-icon.png b/app/frontend/images/app-icon.png similarity index 100% rename from app/assets/images/app-icon.png rename to app/frontend/images/app-icon.png diff --git a/app/assets/images/logo.svg b/app/frontend/images/logo.svg similarity index 100% rename from app/assets/images/logo.svg rename to app/frontend/images/logo.svg diff --git a/app/javascript/application.ts b/app/javascript/application.ts index 6bf458cd..854cfcb8 100644 --- a/app/javascript/application.ts +++ b/app/javascript/application.ts @@ -1,9 +1,13 @@ import '@hotwired/turbo-rails'; -import { start, registerServiceWorker } from '@nerdgeschoss/shimmer'; -import { application } from 'controllers/application'; -import './controllers'; +import { start } from '@nerdgeschoss/shimmer'; +import { Application } from '@hotwired/stimulus'; +import { registerControllers } from 'stimulus-vite-helpers'; import 'chartkick/chart.js'; -start({ application }); +const application = Application.start(); +const controllers = import.meta.glob('./controllers/**/*_controller.ts', { + eager: true, +}); +registerControllers(application, controllers); -registerServiceWorker(); +start({ application }); diff --git a/app/javascript/controllers/application.ts b/app/javascript/controllers/application.ts deleted file mode 100644 index 96a3bd08..00000000 --- a/app/javascript/controllers/application.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Application } from '@hotwired/stimulus'; - -const application = Application.start(); - -application.debug = false; - -export { application }; diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js deleted file mode 100644 index 00e35962..00000000 --- a/app/javascript/controllers/index.js +++ /dev/null @@ -1,14 +0,0 @@ -// This file is auto-generated by ./bin/rails stimulus:manifest:update -// Run that command whenever you add a new controller or create them with -// ./bin/rails generate stimulus controllerName - -import { application } from "./application" - -import AutoResizeController from "./auto_resize_controller.ts" -application.register("auto-resize", AutoResizeController) - -import AutosubmittingController from "./autosubmitting_controller.ts" -application.register("autosubmitting", AutosubmittingController) - -import CalendarController from "./calendar_controller.ts" -application.register("calendar", CalendarController) diff --git a/app/models/harvest_api.rb b/app/models/harvest_api.rb index e234da0e..dd898f51 100644 --- a/app/models/harvest_api.rb +++ b/app/models/harvest_api.rb @@ -46,8 +46,8 @@ def api(path) "https://api.harvestapp.com/v2/#{path}" end - def get(path, **options) - response = HTTParty.get(api(path), headers:, **options) + def get(path, **) + response = HTTParty.get(api(path), headers:, **) raise StandardError, "wrong response from Harvest: #{response.code} #{response.message}" unless response.ok? response diff --git a/app/models/user.rb b/app/models/user.rb index a4a4ce09..a26c48bd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,8 +82,8 @@ def used_holidays leaves_this_year.reject(&:rejected?).select(&:paid?).flat_map(&:days).count end - def send_devise_notification(notification, *args) - devise_mailer.send(notification, self, *args).deliver_later + def send_devise_notification(notification, *) + devise_mailer.send(notification, self, *).deliver_later end def notify!(message) diff --git a/app/views/components/_head.html.slim b/app/views/components/_head.html.slim index fc4368c3..aa53f4a0 100644 --- a/app/views/components/_head.html.slim +++ b/app/views/components/_head.html.slim @@ -4,18 +4,17 @@ head / WebApp meta name="viewport" content="width=device-width, initial-scale = 1.0, viewport-fit=cover" link rel="manifest" href=manifest_path - link rel="apple-touch-icon" href=asset_path("app-icon.png") + link rel="apple-touch-icon" href=vite_asset_path("images/app-icon.png") meta name="theme-color" content="#ffffff" / SEO - = favicon_link_tag asset_path('app-icon.png') + = favicon_link_tag vite_asset_path('images/app-icon.png') / Security = csrf_meta_tags = csp_meta_tag / Assets - - css_path = Rails.env.development? ? "application?v=#{request.request_id}" : "application" # force refresh in safari - = stylesheet_link_tag css_path, media: "all", "data-turbo-track": "reload" - = javascript_include_tag "application", "data-turbo-track": "reload", defer: true + = vite_client_tag + = vite_typescript_tag "application" = yield :additional_head_tags if content_for? :additional_head_tags diff --git a/app/views/components/_sidebar.html.slim b/app/views/components/_sidebar.html.slim index 8417fb2b..1d44c5b9 100644 --- a/app/views/components/_sidebar.html.slim +++ b/app/views/components/_sidebar.html.slim @@ -1,6 +1,6 @@ nav.sidebar a.sidebar__header href=root_path - img.sidebar__logo src=asset_url("logo.svg") + img.sidebar__logo src=vite_asset_url("images/logo.svg") .sidebar__links a.sidebar__link href=sprints_path = Sprint.model_name.human(count: 3) a.sidebar__link href=leaves_path = Leave.model_name.human(count: 3) diff --git a/app/views/leaves/_leave.html.slim b/app/views/leaves/_leave.html.slim index 8c824f4c..c8fdac91 100644 --- a/app/views/leaves/_leave.html.slim +++ b/app/views/leaves/_leave.html.slim @@ -1,4 +1,4 @@ -.card +.card id="leave_#{leave.id}" - leave = Leave::Presenter.new(leave) .card__header diff --git a/bin/dev b/bin/dev deleted file mode 100755 index 6e06b14a..00000000 --- a/bin/dev +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -if command -v overmind &> /dev/null -then - overmind s -f Procfile.dev -p ${PORT:-3000} -P 10 - exit -fi - -if ! gem list --silent --installed foreman -then - echo "Installing foreman..." - gem install foreman -fi - -foreman start -f Procfile.dev "$@" diff --git a/bin/setup b/bin/setup index aaf9aa02..b5f905f1 100755 --- a/bin/setup +++ b/bin/setup @@ -20,21 +20,11 @@ FileUtils.chdir APP_ROOT do system("bundle check") || system!("bundle install") puts "\n== Installing node modules ==" - system! "yarn install" - - # puts "\n== Copying sample files ==" - # unless File.exist?("config/database.yml") - # FileUtils.cp "config/database.yml.sample", "config/database.yml" - # end + system! "yarn install && npx -y playwright install chromium" puts "\n== Preparing database ==" system! "bin/rails db:prepare" - puts "\n== Removing old logs and tempfiles ==" - system! "bin/rails log:clear tmp:clear" - - if system("overmind status") - puts "\n== Restarting running processes ==" - system! "overmind restart" - end + puts "\n== Loading Data ==" + system! "bin/rails db:seed:replant" end diff --git a/bin/vite b/bin/vite new file mode 100755 index 00000000..5da3388e --- /dev/null +++ b/bin/vite @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'vite' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("vite_ruby", "vite") diff --git a/config/application.rb b/config/application.rb index 3785b906..e924bcf6 100644 --- a/config/application.rb +++ b/config/application.rb @@ -43,7 +43,6 @@ class Application < Rails::Application Rails.application.routes.default_url_options[:host] = host config.active_job.queue_adapter = :solid_queue - config.assets.paths << Rails.root.join("node_modules") ActiveRecord::Tasks::DatabaseTasks.fixtures_path = Rails.root.join("spec/fixtures").to_s end end diff --git a/config/database.yml b/config/database.yml index e59413aa..fc32a75a 100644 --- a/config/database.yml +++ b/config/database.yml @@ -2,7 +2,7 @@ default: &default adapter: postgresql encoding: unicode host: 127.0.0.1 - port: 54313 + port: 5432 pool: <%= ENV["DB_POOL"] || ENV["RAILS_MAX_THREADS"] || 5 %> username: <%= ENV["PG_USER"] || "postgres" %> variables: diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 93ba9690..a7977fb3 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -11,4 +11,4 @@ # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. -Rails.application.config.assets.precompile += ["application.js"] +Rails.application.config.assets.precompile = [] diff --git a/config/initializers/serviceworker.rb b/config/initializers/serviceworker.rb deleted file mode 100644 index 5e89b9d7..00000000 --- a/config/initializers/serviceworker.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -Rails.application.configure do - config.serviceworker.routes.draw do - match "/serviceworker.js" - end -end diff --git a/config/puma.rb b/config/puma.rb index 0f418965..a27b43f1 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -43,4 +43,4 @@ # Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart -plugin :solid_queue +plugin :solid_queue if ENV["RAILS_ENV"] == "production" diff --git a/config/vite.json b/config/vite.json new file mode 100644 index 00000000..d7b1ec64 --- /dev/null +++ b/config/vite.json @@ -0,0 +1,17 @@ +{ + "all": { + "sourceCodeDir": "app/frontend", + "watchAdditionalPaths": ["app/assets/scripts"], + "host": "127.0.0.1" + }, + "development": { + "autoBuild": true, + "publicOutputDir": "vite-dev", + "port": 3036 + }, + "test": { + "autoBuild": true, + "publicOutputDir": "vite-test", + "port": 3037 + } +} diff --git a/package.json b/package.json index 667ecc04..2dd39ed7 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,12 @@ "@nerdgeschoss/shimmer": "^0.0.10", "chart.js": "^3.7.0", "chartkick": "^4.1.1", - "esbuild": "^0.14.8", "flatpickr": "^4.6.9", - "typescript": "^4.5.4" + "sass": "^1.77.6", + "typescript": "^4.5.4", + "vite": "^5.3.1", + "vite-plugin-rails": "^0.5.0", + "vite-plugin-sass-glob-import": "^3.0.2" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.8.1", diff --git a/spec/support/system/cuprite_helper.rb b/spec/support/system/cuprite_helper.rb deleted file mode 100644 index d7a64b9b..00000000 --- a/spec/support/system/cuprite_helper.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -module CupriteHelper - def pause - page.driver.pause - end - - def debug - page.driver.debug(binding) - end - - def screenshot(name) - return unless Config.screenshots? - - width = page.current_window.size[0] - height = page.current_window.size[1] - super("#{name}--desktop") - page.current_window.resize_to(375, height) - super("#{name}--mobile") - page.current_window.resize_to(744, height) - super("#{name}--tablet") - page.current_window.resize_to(width, height) - end -end - -RSpec.configure do |config| - config.include Capybara::Screenshot::Diff::TestMethods, type: :system - config.include CupriteHelper, type: :system -end diff --git a/spec/support/system/cuprite_setup.rb b/spec/support/system/cuprite_setup.rb deleted file mode 100644 index 1448fbab..00000000 --- a/spec/support/system/cuprite_setup.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require "capybara/cuprite" - -# Then, we need to register our driver to be able to use it later -# with #driven_by method. -Capybara.register_driver(:chrome) do |app| - Capybara::Cuprite::Driver.new( - app, - window_size: [1200, 1400], - # See additional options for Dockerized environment in the respective section of this article - browser_options: {}, - # Increase Chrome startup wait time (required for stable CI builds) - process_timeout: 10, - # Enable debugging capabilities - inspector: true, - # Allow running Chrome in a headful mode by setting HEADLESS env - # var to a falsey value - headless: Config.headless? - ) -end - -# Configure Capybara to use :chrome driver by default -Capybara.default_driver = Capybara.javascript_driver = :chrome diff --git a/spec/support/system/playwright_helper.rb b/spec/support/system/playwright_helper.rb new file mode 100644 index 00000000..7d644a6b --- /dev/null +++ b/spec/support/system/playwright_helper.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module PlaywrightHelper + def pause + Capybara.current_session.driver.with_playwright_page do |page| + page.context.enable_debug_console! + page.pause + end + end + + def screenshot(name) + return unless Config.screenshots? + + width = page.current_window.size[0] + height = page.current_window.size[1] + super("#{name}--desktop") + page.current_window.resize_to(375, height) + super("#{name}--mobile") + page.current_window.resize_to(width, height) + end +end + +RSpec.configure do |config| + config.include Capybara::Screenshot::Diff::TestMethods, type: :system + config.include PlaywrightHelper, type: :system + config.before(:each, type: :system) do |example| + page.driver.start_tracing(title: example.metadata[:full_description], screenshots: true, snapshots: true) + end + config.after(:each, type: :system) do |example| + if example.exception + path = Rails.root.join("tmp/playwright/traces/#{example.metadata[:full_description].parameterize}.zip") + page.driver.stop_tracing(path:) + puts "View failed trace: npx playwright show-trace #{path}" + else + page.driver.stop_tracing + end + end +end diff --git a/spec/support/system/playwright_setup.rb b/spec/support/system/playwright_setup.rb new file mode 100644 index 00000000..15e2438e --- /dev/null +++ b/spec/support/system/playwright_setup.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +# Then, we need to register our driver to be able to use it later +# with #driven_by method. +Capybara.register_driver(:custom_playwright) do |app| + Capybara::Playwright::Driver.new(app, + browser_type: :chromium, + headless: !!Config.ci?) +end + +Capybara.default_driver = Capybara.javascript_driver = :custom_playwright +Capybara.enable_aria_label = true diff --git a/spec/system/leaves_spec.rb b/spec/system/leaves_spec.rb index 2156cc06..5d701c0c 100644 --- a/spec/system/leaves_spec.rb +++ b/spec/system/leaves_spec.rb @@ -12,6 +12,8 @@ click_on "Request leave" within ".modal" do select("February") + expect(page).to have_selector ".cur-year" + find("input", class: "cur-year").set "" find("input", class: "cur-year").send_keys "2", "0", "2", "2" find("span", text: "18").click find("span", text: "21").click @@ -35,13 +37,16 @@ end it "approves a requested leave" do - users(:john).leaves.create! title: "Holiday", type: :paid, days: ["2025-01-01"] + leave = users(:john).leaves.create! title: "Holiday", type: :paid, days: ["2025-01-01"] login :admin visit leaves_path expect(page).to have_content "John / Holiday" expect(page).to have_content "pending approval" screenshot "leave approval" - click_on "👍", match: :first + within "#leave_#{leave.id}" do + click_on "👍" + expect(page).not_to have_content "👍" + end message = Slack.instance.last_message expect(message.channel).to eq "slack-john" expect(message.text).to include "approved" diff --git a/tsconfig.json b/tsconfig.json index 371e5277..89a1eb1d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,18 +3,35 @@ "declaration": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "lib": ["ES2019", "dom"], - "module": "es6", + "lib": [ + "es2020", + "dom" + ], + "module": "es2020", "moduleResolution": "node", "baseUrl": ".", "paths": { - "*": ["node_modules/*", "app/javascript/*"] + "*": [ + "node_modules/*", + "app/javascript/*" + ] }, "sourceMap": true, - "target": "ES2017", + "target": "es2020", "noEmit": true, "strict": true }, - "exclude": ["**/*.spec.ts", "node_modules", "vendor", "public"], + "files": [ + "typings.d.ts" + ], + "include": [ + "app/javascript/**/*" + ], + "exclude": [ + "**/*.spec.ts", + "node_modules", + "vendor", + "public" + ], "compileOnSave": false } diff --git a/typings.d.ts b/typings.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/typings.d.ts @@ -0,0 +1 @@ +/// diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..01d33a50 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import Rails from 'vite-plugin-rails'; +import sassGlobImports from 'vite-plugin-sass-glob-import'; + +export default defineConfig({ + plugins: [Rails(), sassGlobImports()], +}); diff --git a/yarn.lock b/yarn.lock index 0963dd6f..d54c441a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,121 @@ # yarn lockfile v1 +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@eslint/eslintrc@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" @@ -94,6 +209,91 @@ resolved "https://registry.yarnpkg.com/@rails/request.js/-/request.js-0.0.6.tgz#5f0347a9f363e50ec45118c7134080490cda81d8" integrity sha512-dfFWaQXitYJ4kxrgGJNhDNXX54/v10YgoJqBMVe6lhqs6a4N9WD7goZJEvwin82TtK8MqUNhwfyisgKwM6dMdg== +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -194,6 +394,11 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -206,6 +411,14 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -221,6 +434,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -236,6 +454,13 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -268,6 +493,21 @@ chartkick@^4.1.1: chartjs-adapter-date-fns ">=2.0.0" date-fns ">=2.0.0" +"chokidar@>=3.0.0 <4.0.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -306,6 +546,13 @@ debug@^4.1.1, debug@^4.3.2: dependencies: ms "2.1.2" +debug@^4.3, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -332,119 +579,34 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -esbuild-android-arm64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.8.tgz#69324e08ba68c7d9a541e7b825d7235b83e17bd6" - integrity sha512-tAEoSHnPBSH0cCAFa/aYs3LPsoTY4SwsP6wDKi4PaelbQYNJjqNpAeweyJ8l98g1D6ZkLyqsHbkYj+209sezkA== - -esbuild-darwin-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.8.tgz#7176b692b9de746ba2f9dd4dd81dc4f1b7670786" - integrity sha512-t7p7WzTb+ybiD/irkMt5j/NzB+jY+8yPTsrXk5zCOH1O7DdthRnAUJ7pJPwImdL7jAGRbLtYRxUPgCHs/0qUPw== - -esbuild-darwin-arm64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.8.tgz#59167584e58428877e48e05c4cca58755f843327" - integrity sha512-5FeaT2zMUajKnBwUMSsjZev5iA38YHrDmXhkOCwZQIFUvhqojinqCrvv/X7dyxb1987bcY9KGwJ+EwDwd922HQ== - -esbuild-freebsd-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.8.tgz#00b7d6e00abba9c2eccc9acd576c796333671e9c" - integrity sha512-pGHBLSf7ynfyDZXUtbq/GsA2VIwQlWXrUj1AMcE0id47mRdEUM8/1ZuqMGZx63hRnNgtK9zNJ8OIu2c7qq76Qw== - -esbuild-freebsd-arm64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.8.tgz#57f0cd5a1cb37fa2c0e84e780677fe62f1e8c894" - integrity sha512-g4GgAnrx6Gh1BjKJjJWgPnOR4tW2FcAx9wFvyUjRsIjB35gT+aAFR+P/zStu5OG9LnbS8Pvjd4wS68QIXk+2dA== - -esbuild-linux-32@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.8.tgz#bbf3e5d3fb30f949030d0c2241ac93a172917d56" - integrity sha512-wPfQJadF5vTzriw/B8Ide74PeAJlZW7czNx3NIUHkHlXb+En1SeIqNzl6jG9DuJUl57xD9Ucl9YJFEkFeX8eLg== - -esbuild-linux-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.8.tgz#08631e9e0da613603bcec782f29fecbc6f4596de" - integrity sha512-+RNuLk9RhRDL2kG+KTEYl5cIgF6AGLkRnKKWEu9DpCZaickONEqrKyQSVn410Hj105DLdW6qvIXQQHPycJhExg== - -esbuild-linux-arm64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.8.tgz#206d39c8dfbb7c72aa2f5fc52f7402b5b8a77366" - integrity sha512-BtWoKNYul9UoxUvQUSdSrvSmJyFL1sGnNPTSqWCg1wMe4kmc8UY2yVsXSSkKO8N2jtHxlgFyz/XhvNBzEwGVcw== - -esbuild-linux-arm@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.8.tgz#e28e70420d187f5e403bfa4a72df676d53d707fd" - integrity sha512-HIct38SvUAIJbiTwV/PVQroimQo96TGtzRDAEZxTorB4vsAj1r8bd0keXExPU4RH7G0zIqC4loQQpWYL+nH4Vg== - -esbuild-linux-mips64le@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.8.tgz#04997ac1a0df794a4d5e04d78015863d48490590" - integrity sha512-0DxnCl9XTvaQtsX6Qa+Phr5i9b04INwwSv2RbQ2UWRLoQ/037iaFzbmuhgrcmaGOcRwPkCa+4Qo5EgI01MUgsQ== - -esbuild-linux-ppc64le@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.8.tgz#1827378feff9702c156047ba118c1f3bd74da67e" - integrity sha512-Uzr/OMj97Q0qoWLXCvXCKUY/z1SNI4iSZEuYylM5Nd71HGStL32XWq/MReJ0PYMvUMKKJicKSKw2jWM1uBQ84Q== - -esbuild-linux-s390x@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.8.tgz#200ac44cda59b81135b325c3a29d016969650876" - integrity sha512-vURka7aCA5DrRoOqOn6pXYwFlDSoQ4qnqam8AC0Ikn6tibutuhgar6M3Ek2DCuz9yqd396mngdYr5A8x2TPkww== - -esbuild-netbsd-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.8.tgz#8159d8eae111f80ea6e4cbfa5d4cf658388a72d4" - integrity sha512-tjyDak2/pp0VUAhBW6/ueuReMd5qLHNlisXl5pq0Xn0z+kH9urA/t1igm0JassWbdMz123td5ZEQWoD9KbtOAw== - -esbuild-openbsd-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.8.tgz#2a9498d881a3ab94927c724f34dd1160eef1f3b8" - integrity sha512-zAKKV15fIyAuDDga5rQv0lW2ufBWj/OCjqjDBb3dJf5SfoAi/DMIHuzmkKQeDQ+oxt9Rp1D7ZOlOBVflutFTqQ== - -esbuild-sunos-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.8.tgz#2447de7d79848ad528c7d44caab4938eb8f5a0cc" - integrity sha512-xV41Wa8imziM/2dbWZjLKQbIETRgo5dE0oc/uPsgaecJhsrdA0VkGa/V432LJSUYv967xHDQdoRRl5tr80+NnQ== - -esbuild-windows-32@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.8.tgz#3287281552d7e4c851b3106940ff5826f518043e" - integrity sha512-AxpdeLKQSyCZo7MzdOyV4OgEbEJcjnrS/2niAjbHESbjuS5P1DN/5vZoJ/JSWDVa/40OkBuHBhAXMx1HK3UDsg== - -esbuild-windows-64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.8.tgz#b4052868438b4f17b5c2a908cf344ed2bd267c38" - integrity sha512-/3pllNoy8mrz/E1rYalwiwwhzJBrYQhEapwAteHZbFVhGzYuB8F80e8x5eA8dhFHxDiZh1VzK+hREwwSt8UTQA== - -esbuild-windows-arm64@0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.8.tgz#512d06097cb4b848526a37c48a47223f1c6cc667" - integrity sha512-lTm5naoNgaUvzIiax3XYIEebqwr3bIIEEtqUhzQ2UQ+JMBmvhr02w3sJIJqF3axTX6TgWrC1OtM7DYNvFG+aXA== - -esbuild@^0.14.8: - version "0.14.8" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.8.tgz#f60a07ca9400d61d09a98f96d666c50613972550" - integrity sha512-stMsCBmxwaMpeK8GC/49L/cRGIwsHwoEN7Twk5zDTHlm/63c0KXFKzDC8iM2Mi3fyCKwS002TAH6IlAvqR6t3g== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - esbuild-android-arm64 "0.14.8" - esbuild-darwin-64 "0.14.8" - esbuild-darwin-arm64 "0.14.8" - esbuild-freebsd-64 "0.14.8" - esbuild-freebsd-arm64 "0.14.8" - esbuild-linux-32 "0.14.8" - esbuild-linux-64 "0.14.8" - esbuild-linux-arm "0.14.8" - esbuild-linux-arm64 "0.14.8" - esbuild-linux-mips64le "0.14.8" - esbuild-linux-ppc64le "0.14.8" - esbuild-linux-s390x "0.14.8" - esbuild-netbsd-64 "0.14.8" - esbuild-openbsd-64 "0.14.8" - esbuild-sunos-64 "0.14.8" - esbuild-windows-32 "0.14.8" - esbuild-windows-64 "0.14.8" - esbuild-windows-arm64 "0.14.8" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" escape-string-regexp@^4.0.0: version "4.0.0" @@ -599,6 +761,17 @@ fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -630,6 +803,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -653,12 +833,17 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -684,6 +869,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^13.6.0, globals@^13.9.0: version "13.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" @@ -718,6 +915,11 @@ ignore@^5.1.4, ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +immutable@^4.0.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -744,12 +946,19 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -823,16 +1032,33 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -874,11 +1100,30 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +picocolors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -911,6 +1156,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -933,6 +1185,36 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-gzip@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-gzip/-/rollup-plugin-gzip-3.1.2.tgz#248267c09b23a7a48291625cf668d5511c517c36" + integrity sha512-9xemMyvCjkklgNpu6jCYqQAbvCLJzA2nilkiOGzFuXTUX3cXEFMwIhsIBRF7kTKD/SnZ1tNPcxFm4m4zJ3VfNQ== + +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -940,6 +1222,15 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +sass@^1.77.6: + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -964,6 +1255,16 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +stimulus-vite-helpers@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stimulus-vite-helpers/-/stimulus-vite-helpers-3.1.0.tgz#9216d703ac8d74befece4499ea738c18de408842" + integrity sha512-qy9vnNnu6e/1PArEndp456BuSKLQkBgc+vX2pedOHT0N4GSLQY0l5fuQ4ft56xZ8xSWqrfuYSR+GXXIPtoESww== + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1036,6 +1337,72 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +vite-plugin-environment@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz#d01a04abb2f69730a4866c9c9db51d3dab74645b" + integrity sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA== + +vite-plugin-full-reload@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz#ca6fa32631024a459ea9e5613dd4c0ff0f3b7995" + integrity sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA== + dependencies: + picocolors "^1.0.0" + picomatch "^2.3.1" + +vite-plugin-manifest-sri@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/vite-plugin-manifest-sri/-/vite-plugin-manifest-sri-0.2.0.tgz#cb1cfd11692ee81f5d1194926cbea6d3a38b8599" + integrity sha512-Zt5jt19xTIJ91LOuQTCtNG7rTFc5OziAjBz2H5NdCGqaOD1nxrWExLhcKW+W4/q8/jOPCg/n5ncYEQmqCxiGQQ== + +vite-plugin-rails@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/vite-plugin-rails/-/vite-plugin-rails-0.5.0.tgz#fe29827b6f42abbc6e6537748963bb93871f468c" + integrity sha512-PR3zTHW96X8c7dRsuL2Mu1EAXXeO8fQjQ2KanwIC7EWgBST+D8AKjJyEUAr13IakrIYvd1cM3LcQUcrKmCMePg== + dependencies: + rollup-plugin-gzip "^3.1.0" + vite-plugin-environment "^1.1.3" + vite-plugin-full-reload "^1.1.0" + vite-plugin-manifest-sri "^0.2.0" + vite-plugin-ruby "^5.0.0" + vite-plugin-stimulus-hmr "^3.0.0" + +vite-plugin-ruby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/vite-plugin-ruby/-/vite-plugin-ruby-5.0.0.tgz#cd891198a7672f2e8402439f53ab9d2b08f6502d" + integrity sha512-c8PjTp21Ah/ttgnNUyu0qvCXZI08Jr9I24oUKg3TRIRhF5GcOZ++6wtlTCrNFd9COEQbpXHxlRIXd/MEg0iZJw== + dependencies: + debug "^4.3.4" + fast-glob "^3.3.2" + +vite-plugin-sass-glob-import@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vite-plugin-sass-glob-import/-/vite-plugin-sass-glob-import-3.0.2.tgz#de932204a66ea287f982bf5637870acfeed453ff" + integrity sha512-Tu6M6Fn4pFp1Gsvt+uOKAmPQyspNJSAWKV8GepHGR9Rmx4wujfS0wPjfmVk7QGqD+bSzr+P7L5VGGw9nPgiaMA== + dependencies: + ansi-colors "^4.1.3" + glob "^7.2.0" + minimatch "^3.0.5" + +vite-plugin-stimulus-hmr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/vite-plugin-stimulus-hmr/-/vite-plugin-stimulus-hmr-3.0.0.tgz#60410a69486e86a8c1a769fe4b10039ac5f8d910" + integrity sha512-KElOiZOlaG4XilQQHrzK8M1u5UfK4EFfADJKQYbnmsUMifDOnPR6anVYgHAN95QyWJ67Q/rYWe5BB9M5OxocfQ== + dependencies: + debug "^4.3" + stimulus-vite-helpers "^3.0.0" + +vite@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.1.tgz#bb2ca6b5fd7483249d3e86b25026e27ba8a663e6" + integrity sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"