From 0076b6990258c00c4abf51cb5e41827f91dc779d Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Thu, 2 Feb 2023 11:44:30 +0200 Subject: [PATCH 01/36] Merge extra changes --- .../initializers/content_security_policy.rb | 2 +- .../system_settings/system_settings.rb | 14 +++---- docker/docker-compose.prod.yml | 24 +++++++++-- .../etc/nginx/conf.d/primero.conf.template | 41 +++++++++++-------- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 91564c883e..e62b29073d 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -30,7 +30,7 @@ policy.script_src(*self_sources) policy.style_src(*style_sources) policy.child_src(*child_sources) - policy.frame_src(:none) + policy.frame_src('https://auth.primero.anpdca.ro/', :self) # Specify URI for violation reports # policy.report_uri "/csp-violation-report-endpoint" diff --git a/db/configuration/system_settings/system_settings.rb b/db/configuration/system_settings/system_settings.rb index 4c49972a68..dc01c0d4c7 100644 --- a/db/configuration/system_settings/system_settings.rb +++ b/db/configuration/system_settings/system_settings.rb @@ -61,11 +61,11 @@ def create_or_update_system_setting(setting_hash) action_plan: 'Action Plan', gbv_closure: 'GBV Closure' }, - approvals_labels_ar: { - assessment: 'Assessment', - case_plan: 'Case Plan', - closure: 'Closure', - action_plan: 'Action Plan', - gbv_closure: 'GBV Closure' - } + # approvals_labels_ar: { + # assessment: 'Assessment', + # case_plan: 'Case Plan', + # closure: 'Closure', + # action_plan: 'Action Plan', + # gbv_closure: 'GBV Closure' + # } ) diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index 38a96eac5d..a485e45252 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -1,11 +1,17 @@ --- version: '3' + +networks: + default: + primero-stack_gateway: + external: true + services: nginx: image: '${PRIMERO_IMAGE_REPOSITORY:-primeroims}/nginx:${PRIMERO_TAG:-latest}' - ports: - - "80:80" - - "443:443" + expose: + - "80" + - "443" volumes: - 'certbot_certificates:/etc/letsencrypt' - 'certbot_challenges:/usr/share/nginx/html/.well-known/acme-challenge' @@ -15,18 +21,30 @@ services: env_file: - docker/defaults.env - docker/local.env + environment: + VIRTUAL_HOST: primero.anpdca.ro + LETSENCRYPT_HOST: primero.anpdca.ro + networks: + - default + - primero-stack_gateway depends_on: - application restart: always application: + networks: + - default env_file: - docker/defaults.env - docker/local.env solr: + networks: + - default env_file: - docker/defaults.env - docker/local.env worker: + networks: + - default volumes: - public:/srv/primero/application/public env_file: diff --git a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template index 246967a247..ee11223c67 100644 --- a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template +++ b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template @@ -7,7 +7,7 @@ ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; -add_header X-Frame-Options DENY; +add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; ssl_certificate_key ${NGINX_SSL_KEY_PATH}; ssl_certificate ${NGINX_SSL_CERT_PATH}; @@ -19,23 +19,23 @@ upstream app { limit_req_zone $binary_remote_addr zone=login_app_limit:10m rate=1r/s; -server { - listen ${NGINX_HTTP_PORT}; - server_name www.${NGINX_SERVER_NAME} ${NGINX_SERVER_NAME}; - - location ~ ^/.well-known/acme-challenge/ { - root /usr/share/nginx/html/; - } - - # @begin-ssl - location / { - return 301 https://$host:${NGINX_HTTPS_PORT}$1; - } -} +#server { +# listen ${NGINX_HTTP_PORT}; +# server_name www.${NGINX_SERVER_NAME} ${NGINX_SERVER_NAME}; +# +# location ~ ^/.well-known/acme-challenge/ { +# root /usr/share/nginx/html/; +# } +# +# # @begin-ssl +# location / { +# return 301 https://$host:${NGINX_HTTPS_PORT}$1; +# } +#} server { - listen ${NGINX_HTTPS_PORT} ssl; + #listen ${NGINX_HTTPS_PORT} ssl; server_name www.${NGINX_SERVER_NAME} ${NGINX_SERVER_NAME}; # @end-ssl @@ -55,6 +55,11 @@ server { client_max_body_size ${NGINX_CLIENT_MAX_BODY_SIZE}; client_body_buffer_size ${NGINX_CLIENT_BODY_BUFFER_SIZE}; + location /login/ { + limit_req zone=login_app_limit burst=5; + try_files "" @app; + } + try_files $uri/index.html $uri.html $uri @app; location @app { @@ -83,9 +88,9 @@ server { deny all; } - location /v2/login/ { - limit_req zone=login_app_limit burst=5; - } + #location /v2/login/ { + # limit_req zone=login_app_limit burst=5; + #} location /api/v2/tokens/ { limit_req zone=login_app_limit burst=5; From bb21debfc0000b5ae7f71355bcb025a08f82637d Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Thu, 2 Feb 2023 13:24:05 +0200 Subject: [PATCH 02/36] PRIM-23 fix internal nginx --- .../etc/nginx/conf.d/primero.conf.template | 7 ++++-- .../nginx/root/etc/nginx/conf.d/security.conf | 4 ++-- docker/nginx/root/etc/nginx/nginx.conf | 22 ++----------------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template index ee11223c67..2b3df096b5 100644 --- a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template +++ b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template @@ -34,12 +34,15 @@ limit_req_zone $binary_remote_addr zone=login_app_limit:10m rate=1r/s; #} server { - + listen ${NGINX_HTTP_PORT}; #listen ${NGINX_HTTPS_PORT} ssl; server_name www.${NGINX_SERVER_NAME} ${NGINX_SERVER_NAME}; # @end-ssl - if ($request_method !~ ^(GET|PUT|POST|PATCH|DELETE)$ ) { +# if ($request_method !~ ^(GET|PUT|POST|PATCH|DELETE)$ ) { +# return 444; +# } + if ($request_method = HEAD) { return 444; } diff --git a/docker/nginx/root/etc/nginx/conf.d/security.conf b/docker/nginx/root/etc/nginx/conf.d/security.conf index ee72e60a4a..10e3deb15f 100644 --- a/docker/nginx/root/etc/nginx/conf.d/security.conf +++ b/docker/nginx/root/etc/nginx/conf.d/security.conf @@ -12,5 +12,5 @@ limit_req zone=req_limit_per_ip burst=20; send_timeout 10; client_header_timeout 10; client_body_timeout 10; -large_client_header_buffers 2 1k; -client_header_buffer_size 1k; \ No newline at end of file +large_client_header_buffers 5 256k; +client_header_buffer_size 128k; diff --git a/docker/nginx/root/etc/nginx/nginx.conf b/docker/nginx/root/etc/nginx/nginx.conf index 235cf75fe5..83943b5b69 100644 --- a/docker/nginx/root/etc/nginx/nginx.conf +++ b/docker/nginx/root/etc/nginx/nginx.conf @@ -12,27 +12,9 @@ events { http { include /etc/nginx/conf.d/*.conf; include /etc/nginx/mime.types; - + default_type application/octet-stream; access_log /var/log/nginx/access.log "qi-report-format"; sendfile on; keepalive_timeout 65; - - server { - root /var/www/html; - - listen 80 default_server; - listen [::]:80 default_server; - - ssl_session_tickets off; - - location / { - try_files $uri $uri/ =404; - } - - index index.html index.htm; - - server_name _; - return 444; - } -} \ No newline at end of file +} From c3cffa047a760268eb120945e3ba026628707a77 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Thu, 2 Feb 2023 15:03:28 +0200 Subject: [PATCH 03/36] PRIM-23 log status in keycloak connector --- app/services/api_connector/keycloak_connector.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index d9a90bd5c7..c7d8d0e864 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -92,7 +92,7 @@ def log_response(user, status) when 200, 201 Rails.logger.info("Connector #{id}: Successfully synced User #{user.user_name} #{message_suffix}") else - Rails.logger.error("Error syncing User #{user.user_name} #{message_suffix}") + Rails.logger.error("Error syncing User #{user.user_name} with status #{status} #{message_suffix}") end end end From 5a9013f8e820989fd132e694a2f9f9e4fe1f6239 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Fri, 3 Feb 2023 14:30:21 +0200 Subject: [PATCH 04/36] PRIM-23 update keycloak connector --- .../api_connector/keycloak_connector.rb | 90 +++++++++++++++---- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index c7d8d0e864..9088704ba2 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true # This is the sync connector for the Keycloak identity provider. - class ApiConnector::KeycloakConnector < ApiConnector::AbstractConnector IDENTIFIER = 'keycloak' + ADMIN_TOKEN_CACHE_KEY = 'keycloak_connector/admin_token' def self.id IDENTIFIER @@ -16,21 +16,26 @@ def realm def initialize(options = {}) extra_opts = { default_headers: { - 'Content-Type' => 'application/json', - 'Authorization' => "Bearer #{ENV['KEYCLOAK_ADMIN_TOKEN']}" + 'Content-Type' => 'application/json' } } super(options.merge(extra_opts)) end def fetch(user) - _, response = connection.get("/admin/realms/#{realm}/users?username=#{user.user_name}") - response[0] + status, response = connection.get("/admin/realms/#{realm}/users?username=#{user.user_name}", nil, auth_header) + case status + when 200 + response[0] + else + Rails.logger.error("Failed to fetch User #{user.user_name} for sync; status #{status}, error body #{response}") + nil + end end def create(user) - status, = connection.post("/admin/realms/#{realm}/users", create_user_representation(user)) - log_response(user, status) + status, response = connection.post("/admin/realms/#{realm}/users", create_user_representation(user), auth_header) + log_response(user, status, response) kc_user = fetch(user) response_attributes(kc_user) @@ -38,8 +43,10 @@ def create(user) def update(user) kc_id = user['identity_provider_sync']['keycloak']['id'] - status, = connection.put("/admin/realms/#{realm}/users/#{kc_id}", create_user_representation(user)) - log_response(user, status) + status, response = connection.put( + "/admin/realms/#{realm}/users/#{kc_id}", create_user_representation(user), auth_header + ) + log_response(user, status, response) kc_user = fetch(user) response_attributes(kc_user) @@ -56,10 +63,60 @@ def new?(user) end def relevant_updates?(user) - user.full_name != user['identity_provider_sync']['keycloak']['full_name'] || + user.email != user['identity_provider_sync']['keycloak']['email'] || + user.full_name != user['identity_provider_sync']['keycloak']['full_name'] || !user.disabled != user['identity_provider_sync']['keycloak']['enabled'] end + protected + + def auth_header + { + 'Authorization' => "Bearer #{admin_token}" + } + end + + def admin_token + token = Rails.cache.fetch(ADMIN_TOKEN_CACHE_KEY) + return token if token + + fetch_admin_token + end + + def fetch_admin_token + headers = { + 'Content-Type' => 'application/x-www-form-urlencoded' + } + status, response = connection.post( + "/realms/#{realm}/protocol/openid-connect/token", fetch_admin_token_body, headers + ) + + store_admin_token(status, response) + end + + def fetch_admin_token_body + token_body = { + client_id: ENV['KEYCLOAK_ADMIN_CLIENT_ID'], + grant_type: 'password', + username: ENV['KEYCLOAK_ADMIN_USERNAME'], + password: ENV['KEYCLOAK_ADMIN_PASSWORD'] + } + + URI.encode_www_form(token_body) + end + + def store_admin_token(status, response) + case status + when 200 + Rails.cache.write(ADMIN_TOKEN_CACHE_KEY, response['access_token'], expires_in: response['expires_in']) + + response['access_token'] + else + Rails.logger.error("Failed to fetch admin token for sync; status #{status}, error body #{response}") + '' + end + end + def create_user_representation(user) first, last = user.full_name.split(' ', 2) @@ -73,12 +130,11 @@ def create_user_representation(user) end def response_attributes(response) - full_name = "#{response['firstName']}#{' ' if response['lastName']}#{response['lastName']}" - { identity_provider_sync: { keycloak: { - full_name: full_name, + full_name: "#{response['firstName']}#{' ' if response['lastName']}#{response['lastName']}", + email: response['email'], enabled: response['enabled'], id: response['id'] } @@ -86,13 +142,15 @@ def response_attributes(response) }.compact end - def log_response(user, status) + def log_response(user, status, response) message_suffix = "with IDP #{user&.identity_provider&.name} (#{user&.identity_provider&.unique_id})" case status - when 200, 201 + when 200, 201, 204 Rails.logger.info("Connector #{id}: Successfully synced User #{user.user_name} #{message_suffix}") else - Rails.logger.error("Error syncing User #{user.user_name} with status #{status} #{message_suffix}") + Rails.logger.error( + "Error syncing User #{user.user_name} #{message_suffix}; status #{status}, error body #{response}" + ) end end end From 2e4fd48ab5ab4093877e4c52e0511197ba9e9635 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Mon, 6 Feb 2023 12:03:08 +0200 Subject: [PATCH 05/36] PRIM-23 send password email on sync --- .../api_connector/keycloak_connector.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index 9088704ba2..38f04e81e3 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true # This is the sync connector for the Keycloak identity provider. +# rubocop:disable Metrics/ClassLength class ApiConnector::KeycloakConnector < ApiConnector::AbstractConnector IDENTIFIER = 'keycloak' ADMIN_TOKEN_CACHE_KEY = 'keycloak_connector/admin_token' @@ -38,6 +39,8 @@ def create(user) log_response(user, status, response) kc_user = fetch(user) + trigger_password_email(kc_user['id']) + response_attributes(kc_user) end @@ -70,6 +73,20 @@ def relevant_updates?(user) protected + def trigger_password_email(kc_id) + actions_body = ['UPDATE_PASSWORD'].to_json + status, response = connection.put( + "/admin/realms/#{realm}/users/#{kc_id}/execute-actions-email?lifespan=9999999", actions_body, auth_header + ) + + case status + when 200, 204 + Rails.logger.info("Password update triggered for user #{kc_id}") + else + Rails.logger.error("Failed to trigger update for user #{kc_id}; status #{status}, error body #{response}") + end + end + def auth_header { 'Authorization' => "Bearer #{admin_token}" @@ -154,3 +171,4 @@ def log_response(user, status, response) end end end +# rubocop:enable Metrics/ClassLength From 3e9b93d3c3696e123831b69deed5c5953719ddbe Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Mon, 6 Feb 2023 12:42:45 +0200 Subject: [PATCH 06/36] PRIM-23 disable username validation for user update --- .../components/pages/admin/users-form/validations.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/components/pages/admin/users-form/validations.js b/app/javascript/components/pages/admin/users-form/validations.js index 5c55743a90..33fe531d75 100644 --- a/app/javascript/components/pages/admin/users-form/validations.js +++ b/app/javascript/components/pages/admin/users-form/validations.js @@ -14,7 +14,7 @@ export default (formMode, i18n, useIdentityProviders, providers, isMyAccountPage const providerId = this.resolve(inputRef); const provider = providers.find(currentProvider => currentProvider.get("unique_id") === providerId); - if (provider) { + if (provider && !formMode.get("isEdit")) { const regexMatch = new RegExp(`@${provider.get("user_domain")}$`); return value.match(regexMatch) @@ -26,6 +26,8 @@ export default (formMode, i18n, useIdentityProviders, providers, isMyAccountPage path: this.path }); } + + return true; }); }; From 3e9be05ccdd67a918a5430e5589b6fc0c0607a85 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Mon, 6 Feb 2023 14:19:14 +0200 Subject: [PATCH 07/36] PRIM-23 sync user locale to keycloak --- .../api_connector/keycloak_connector.rb | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index 38f04e81e3..27006abc8e 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -66,9 +66,12 @@ def new?(user) end def relevant_updates?(user) - user.email != user['identity_provider_sync']['keycloak']['email'] || - user.full_name != user['identity_provider_sync']['keycloak']['full_name'] || - !user.disabled != user['identity_provider_sync']['keycloak']['enabled'] + idp_sync_data = user['identity_provider_sync']['keycloak'] + + user.locale != idp_sync_data['locale'] || + user.email != idp_sync_data['email'] || + user.full_name != idp_sync_data['full_name'] || + !user.disabled != idp_sync_data['enabled'] end protected @@ -134,6 +137,7 @@ def store_admin_token(status, response) end end + # rubocop:disable Metrics/MethodLength def create_user_representation(user) first, last = user.full_name.split(' ', 2) @@ -142,22 +146,29 @@ def create_user_representation(user) email: user.email, firstName: first, lastName: last, - enabled: !user.disabled + enabled: !user.disabled, + attributes: { + locale: user.locale + } } end def response_attributes(response) + full_name = "#{response['firstName']}#{' ' if response['lastName']}#{response['lastName']}" + { identity_provider_sync: { keycloak: { - full_name: "#{response['firstName']}#{' ' if response['lastName']}#{response['lastName']}", + full_name: full_name, email: response['email'], enabled: response['enabled'], + locale: response['attributes']['locale'], id: response['id'] } } }.compact end + # rubocop:enable Metrics/MethodLength def log_response(user, status, response) message_suffix = "with IDP #{user&.identity_provider&.name} (#{user&.identity_provider&.unique_id})" From 1fbd23f7c1f1a4f2d1f554cc9c92e6f71ef20bf3 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Mon, 6 Feb 2023 15:09:39 +0200 Subject: [PATCH 08/36] PRIM-23 update lifespan --- app/services/api_connector/keycloak_connector.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index 27006abc8e..89a91311e0 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -79,7 +79,7 @@ def relevant_updates?(user) def trigger_password_email(kc_id) actions_body = ['UPDATE_PASSWORD'].to_json status, response = connection.put( - "/admin/realms/#{realm}/users/#{kc_id}/execute-actions-email?lifespan=9999999", actions_body, auth_header + "/admin/realms/#{realm}/users/#{kc_id}/execute-actions-email?lifespan=#{7.days}", actions_body, auth_header ) case status From 5d3bf85ea7f33a95cbdc0cba4533c28a3d378b63 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Mon, 6 Feb 2023 15:22:56 +0200 Subject: [PATCH 09/36] PRIM-23 fix locale data sync --- app/services/api_connector/keycloak_connector.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/api_connector/keycloak_connector.rb b/app/services/api_connector/keycloak_connector.rb index 89a91311e0..caf4da6a03 100644 --- a/app/services/api_connector/keycloak_connector.rb +++ b/app/services/api_connector/keycloak_connector.rb @@ -162,7 +162,7 @@ def response_attributes(response) full_name: full_name, email: response['email'], enabled: response['enabled'], - locale: response['attributes']['locale'], + locale: response['attributes']['locale'][0], id: response['id'] } } From 70422f02d183071fb11aeabc3d08d44336d0e0b0 Mon Sep 17 00:00:00 2001 From: Tudor-Mihai Pescaru Date: Fri, 3 Feb 2023 17:51:07 +0200 Subject: [PATCH 10/36] Adds rake task for migrating ActiveStorage Blobs from one storage to another --- lib/tasks/blob_migration.rake | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/tasks/blob_migration.rake diff --git a/lib/tasks/blob_migration.rake b/lib/tasks/blob_migration.rake new file mode 100644 index 0000000000..4c0b2f194a --- /dev/null +++ b/lib/tasks/blob_migration.rake @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +class ActiveStorage::Downloader + def initialize(blob, tempdir: nil) + @blob = blob + @tempdir = tempdir + end + + def download_blob_to_tempfile + open_tempfile do |file| + download_blob_to file + verify_integrity_of file + yield file + end + end + + private + + attr_reader :blob, :tempdir + + def open_tempfile + file = Tempfile.open(["ActiveStorage-#{blob.id}-", blob.filename.extension_with_delimiter], tempdir) + + begin + yield file + ensure + file.close! + end + end + + def download_blob_to(file) + file.binmode + blob.download { |chunk| file.write(chunk) } + file.flush + file.rewind + end + + def verify_integrity_of(file) + raise ActiveStorage::IntegrityError unless Digest::MD5.file(file).base64digest == blob.checksum + end +end + +module AsDownloadPatch + def open(tempdir: nil, &block) + ActiveStorage::Downloader.new(self, tempdir: tempdir).download_blob_to_tempfile(&block) + end +end + +Rails.application.config.to_prepare do + ActiveStorage::Blob.include AsDownloadPatch +end + +def migrate(from, to) + configs = Rails.configuration.active_storage.service_configurations + from_service = ActiveStorage::Service.configure from, configs + to_service = ActiveStorage::Service.configure to, configs + + ActiveStorage::Blob.service = from_service + + puts "#{ActiveStorage::Blob.count} Blobs to go..." + + ActiveStorage::Blob.find_each do |blob| + puts "Migrating blob #{blob.id} with key=#{blob.key}" + file = Tempfile.new("file#{Time.now}") + file.binmode + file << blob.download + file.rewind + checksum = blob.checksum + to_service.upload(blob.key, file, checksum: checksum) + rescue Errno::ENOENT + puts "Rescued by Errno::ENOENT statement. ID: #{blob.id} / Key: #{blob.key}" + next + rescue ActiveStorage::FileNotFoundError + puts "Rescued by FileNotFoundError. ID: #{blob.id} / Key: #{blob.key}" + next + end +end + +namespace :blobs do + desc 'Migrate ActiveStorage files from Azure Storage to Minio' + task :migrate, %i[from to] => :environment do |_, args| + if args.nil? || args[:from].nil? || args[:to].nil? + puts 'Please provide source and destination' + exit + end + migrate(args[:from], args[:to]) + end +end From 2b6ebc6b456f440d3043d7aa0e7294658c508e51 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Thu, 16 Mar 2023 10:13:07 +0200 Subject: [PATCH 11/36] Comment new file --- .../root/etc/nginx/conf.d/server-defaults.conf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/nginx/root/etc/nginx/conf.d/server-defaults.conf b/docker/nginx/root/etc/nginx/conf.d/server-defaults.conf index ba8d8ed4a3..675ed756f1 100644 --- a/docker/nginx/root/etc/nginx/conf.d/server-defaults.conf +++ b/docker/nginx/root/etc/nginx/conf.d/server-defaults.conf @@ -1,7 +1,7 @@ -server { - listen 80 default_server; - listen 443 default_server ssl; - ssl_reject_handshake on; - - return 444; -} \ No newline at end of file +# server { +# listen 80 default_server; +# listen 443 default_server ssl; +# ssl_reject_handshake on; +# +# return 444; +# } From c948f79667430a5869df7909fb5234af51d92118 Mon Sep 17 00:00:00 2001 From: Stefan Silviu Date: Thu, 16 Mar 2023 10:20:53 +0200 Subject: [PATCH 12/36] Add listen --- docker/nginx/root/etc/nginx/conf.d/primero.conf.template | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template index 02fee8d1b4..3f0a4281ce 100644 --- a/docker/nginx/root/etc/nginx/conf.d/primero.conf.template +++ b/docker/nginx/root/etc/nginx/conf.d/primero.conf.template @@ -31,6 +31,7 @@ limit_req_zone $binary_remote_addr zone=login_app_limit:10m rate=1r/s; #} server { + listen ${NGINX_HTTP_PORT}; #listen ${NGINX_HTTPS_PORT} ssl; server_name ${NGINX_SERVER_NAME}; # @end-ssl From dd0de6fc6874769ac4b0225e33af625475a1fd2f Mon Sep 17 00:00:00 2001 From: TudorPescaru Date: Thu, 16 Mar 2023 14:33:40 +0200 Subject: [PATCH 13/36] Breaks script up into separate download and upload steps --- lib/tasks/blob_migration.rake | 110 ++++++++++++++++------------------ 1 file changed, 52 insertions(+), 58 deletions(-) diff --git a/lib/tasks/blob_migration.rake b/lib/tasks/blob_migration.rake index 4c0b2f194a..b08d7048b9 100644 --- a/lib/tasks/blob_migration.rake +++ b/lib/tasks/blob_migration.rake @@ -1,83 +1,59 @@ # frozen_string_literal: true -class ActiveStorage::Downloader - def initialize(blob, tempdir: nil) - @blob = blob - @tempdir = tempdir - end - - def download_blob_to_tempfile - open_tempfile do |file| - download_blob_to file - verify_integrity_of file - yield file - end - end - - private - - attr_reader :blob, :tempdir - - def open_tempfile - file = Tempfile.open(["ActiveStorage-#{blob.id}-", blob.filename.extension_with_delimiter], tempdir) - - begin - yield file - ensure - file.close! - end - end - - def download_blob_to(file) - file.binmode - blob.download { |chunk| file.write(chunk) } - file.flush - file.rewind - end - - def verify_integrity_of(file) - raise ActiveStorage::IntegrityError unless Digest::MD5.file(file).base64digest == blob.checksum - end -end - -module AsDownloadPatch - def open(tempdir: nil, &block) - ActiveStorage::Downloader.new(self, tempdir: tempdir).download_blob_to_tempfile(&block) - end -end - +# This is done to reference ActiveStorage::Blob so service_configurations are available in dev mode +# https://github.com/rails/rails/issues/41636#issuecomment-792366847 Rails.application.config.to_prepare do - ActiveStorage::Blob.include AsDownloadPatch + ActiveStorage::Blob.present? end -def migrate(from, to) +def download_from(from) configs = Rails.configuration.active_storage.service_configurations from_service = ActiveStorage::Service.configure from, configs - to_service = ActiveStorage::Service.configure to, configs ActiveStorage::Blob.service = from_service - puts "#{ActiveStorage::Blob.count} Blobs to go..." - ActiveStorage::Blob.find_each do |blob| - puts "Migrating blob #{blob.id} with key=#{blob.key}" - file = Tempfile.new("file#{Time.now}") + puts "Downloading blob #{blob.key}" + file = File.new("/tmp/blobs/#{blob.key}", 'w') file.binmode file << blob.download + file.close + rescue ActiveStorage::FileNotFoundError + puts "Rescued by FileNotFoundError. Key: #{blob.key}" + next + end +end + +def upload_to(to) + configs = Rails.configuration.active_storage.service_configurations + to_service = ActiveStorage::Service.configure to, configs + + Dir.foreach('/tmp/blobs') do |filename| + next if filename == '.' or filename == '..' + + puts "Uploading blob #{filename}" + checksum = Digest::MD5.file("/tmp/blobs/#{filename}").base64digest + file = File.open("/tmp/blobs/#{filename}", 'r') file.rewind - checksum = blob.checksum - to_service.upload(blob.key, file, checksum: checksum) + file.binmode + to_service.upload(filename, file, checksum: checksum) + file.close rescue Errno::ENOENT - puts "Rescued by Errno::ENOENT statement. ID: #{blob.id} / Key: #{blob.key}" + puts "Rescued by Errno::ENOENT statement. Key: #{filename}" next rescue ActiveStorage::FileNotFoundError - puts "Rescued by FileNotFoundError. ID: #{blob.id} / Key: #{blob.key}" + puts "Rescued by FileNotFoundError. Key: #{filename}" next end end +def migrate(from, to) + download_from(from) + upload_to(to) +end + namespace :blobs do - desc 'Migrate ActiveStorage files from Azure Storage to Minio' + desc 'Migrate ActiveStorage files from one type of storage to another' task :migrate, %i[from to] => :environment do |_, args| if args.nil? || args[:from].nil? || args[:to].nil? puts 'Please provide source and destination' @@ -85,4 +61,22 @@ namespace :blobs do end migrate(args[:from], args[:to]) end + + desc 'Download ActiveStorage files from given storage' + task :download_from, %i[from] => :environment do |_, args| + if args.nil? || args[:from].nil? + puts 'Please provide source' + exit + end + download_from(args[:from]) + end + + desc 'Upload ActiveStorage files to given storage' + task :upload_to, %i[to] => :environment do |_, args| + if args.nil? || args[:to].nil? + puts 'Please provide destination' + exit + end + upload_to(args[:to]) + end end From ca9a385008e363a8c1f50ec7e8a611034e237459 Mon Sep 17 00:00:00 2001 From: Tudor-Mihai Pescaru Date: Thu, 16 Mar 2023 20:29:42 +0200 Subject: [PATCH 14/36] Adds patch for OOM when downloading blobs --- lib/tasks/blob_migration.rake | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/tasks/blob_migration.rake b/lib/tasks/blob_migration.rake index b08d7048b9..9651a95301 100644 --- a/lib/tasks/blob_migration.rake +++ b/lib/tasks/blob_migration.rake @@ -12,12 +12,20 @@ def download_from(from) ActiveStorage::Blob.service = from_service - ActiveStorage::Blob.find_each do |blob| - puts "Downloading blob #{blob.key}" - file = File.new("/tmp/blobs/#{blob.key}", 'w') - file.binmode - file << blob.download - file.close + ActiveStorage::Blob.find_in_batches(batch_size: 50) do |batch| + # Spawn a new process for each batch. This is a disgusting hack to avoid running out of memory. + Process.fork do + puts "Spawning process for batch #{batch.first.id} - #{batch.last.id}, size: #{batch.size}" + batch.each do |blob| + puts "Downloading blob #{blob.key}" + file = File.new("/mnt/migrate/blobs/#{blob.key}", 'w') + file.binmode + file << blob.download + file.close + end + end + Process.waitall + rescue ActiveStorage::FileNotFoundError puts "Rescued by FileNotFoundError. Key: #{blob.key}" next From ff88b09e48ee5f7168194900bded3642d55d9785 Mon Sep 17 00:00:00 2001 From: Dennis Hernandez Date: Tue, 26 Nov 2024 16:12:33 -0600 Subject: [PATCH 15/36] R2-3127 - Mark for Offline action broken Do not return the record_id for index actions since multiple records are handled in those actions. --- app/controllers/application_api_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/application_api_controller.rb b/app/controllers/application_api_controller.rb index 34ea70050a..ab553527c5 100644 --- a/app/controllers/application_api_controller.rb +++ b/app/controllers/application_api_controller.rb @@ -27,6 +27,8 @@ def model_class end def record_id + return if action_name == 'index' + params[:id] end From 0bc74fe2e1984d78c5a8d27d7ea31deff34ae02e Mon Sep 17 00:00:00 2001 From: Dennis Hernandez Date: Tue, 3 Dec 2024 18:05:46 -0600 Subject: [PATCH 16/36] R2-3127 - Store ids as metadata in Audit Logs --- app/controllers/application_api_controller.rb | 9 ++++++++- app/controllers/concerns/audit_log_actions.rb | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_api_controller.rb b/app/controllers/application_api_controller.rb index ab553527c5..76aed360a6 100644 --- a/app/controllers/application_api_controller.rb +++ b/app/controllers/application_api_controller.rb @@ -27,11 +27,18 @@ def model_class end def record_id - return if action_name == 'index' + return unless params[:id].is_a?(String) params[:id] end + def metadata_record_ids + return [] unless params[:id].present? + return [params[:id]] if params[:id].is_a?(String) + + params[:id].values + end + def authorize_all!(permission, records) records.each do |record| authorize!(permission, record) diff --git a/app/controllers/concerns/audit_log_actions.rb b/app/controllers/concerns/audit_log_actions.rb index 09f58053df..7df8d1f1f7 100644 --- a/app/controllers/concerns/audit_log_actions.rb +++ b/app/controllers/concerns/audit_log_actions.rb @@ -22,7 +22,8 @@ def default_metadata_audit_params remote_ip: LogUtils.remote_ip(request), agency_id: current_user.try(:agency_id), role_id: current_user.try(:role_id), - http_method: request.method + http_method: request.method, + record_ids: metadata_record_ids } end From 3bd0b6526dd3545256832bfae5512ca60423cd8d Mon Sep 17 00:00:00 2001 From: Dennis Hernandez Date: Wed, 4 Dec 2024 09:12:42 -0600 Subject: [PATCH 17/36] R2-3127 - Fix tests --- spec/requests/api/v2/children_controller_spec.rb | 2 +- spec/requests/api/v2/flags_controller_spec.rb | 2 +- spec/requests/api/v2/tokens_controller_spec.rb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spec/requests/api/v2/children_controller_spec.rb b/spec/requests/api/v2/children_controller_spec.rb index cb8d7703db..361b3b2401 100644 --- a/spec/requests/api/v2/children_controller_spec.rb +++ b/spec/requests/api/v2/children_controller_spec.rb @@ -581,7 +581,7 @@ user_id: fake_user_id, # This is technically wrong, but an artifact of the way we do tests resource_url: request.url, metadata: { user_name: fake_user_name, remote_ip: '127.0.0.1', agency_id: nil, role_id: nil, - http_method: 'GET' }) + http_method: 'GET', record_ids: [@case1.id] }) end it 'obfuscates the case name when hidden' do diff --git a/spec/requests/api/v2/flags_controller_spec.rb b/spec/requests/api/v2/flags_controller_spec.rb index 5e5855c17c..3b4e68ac32 100644 --- a/spec/requests/api/v2/flags_controller_spec.rb +++ b/spec/requests/api/v2/flags_controller_spec.rb @@ -153,7 +153,7 @@ user_id: fake_user_id, # This is technically wrong, but an artifact of the way we do tests resource_url: request.url, metadata: { user_name: fake_user_name, remote_ip: '127.0.0.1', agency_id: nil, role_id: nil, - http_method: 'POST' }) + http_method: 'POST', record_ids: [] }) end end diff --git a/spec/requests/api/v2/tokens_controller_spec.rb b/spec/requests/api/v2/tokens_controller_spec.rb index 720d3a9582..5fb0294784 100644 --- a/spec/requests/api/v2/tokens_controller_spec.rb +++ b/spec/requests/api/v2/tokens_controller_spec.rb @@ -33,7 +33,8 @@ it 'enqueues an audit log job that records the login attempt' do metadata = { - user_name: @user.user_name, remote_ip: '127.0.0.1', agency_id: nil, role_id: nil, http_method: 'POST' + user_name: @user.user_name, remote_ip: '127.0.0.1', agency_id: nil, role_id: nil, http_method: 'POST', + record_ids: [] } post '/api/v2/tokens', params: @params expect(AuditLogJob).to have_been_enqueued From bb0b1ded718684da6b56bf096a5d104965d91dfa Mon Sep 17 00:00:00 2001 From: Awen Saunders Date: Mon, 25 Nov 2024 17:52:07 +0000 Subject: [PATCH 18/36] Add data migration for gbv decimalPlaces forms --- db/data_migration/v2.12/README.md | 13 +++++++++ .../v2.12/update_calculated_avg_fields_gbv.rb | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 db/data_migration/v2.12/README.md create mode 100644 db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb diff --git a/db/data_migration/v2.12/README.md b/db/data_migration/v2.12/README.md new file mode 100644 index 0000000000..29a91bfd41 --- /dev/null +++ b/db/data_migration/v2.12/README.md @@ -0,0 +1,13 @@ +# Migrations in 2.12 + +This migration updates the configuration of GBV instances *only*. This migrates the fields that calculate average scores on subforms to new versions which support decimal places. + +# Verification of data to be updated + +These scripts will update the `Field` records where calculations exist. + +To validate which fields will be updated, run the following: + +```bash +rails r ./db/migrations/v2.12/update_calculated_avg_fields_gbv.rb +``` \ No newline at end of file diff --git a/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb b/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb new file mode 100644 index 0000000000..3413f66850 --- /dev/null +++ b/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +save_records = ARGV[0] == 'true' + +def fields_with_old_avg_calculations + return unless PrimeroModule.exists? unique_id: PrimeroModule::GBV + + avg_fields = Field.where("calculation -> 'expression' ? 'avg'") + # The new type of calculated average field has the avg object as a hash, not an array. + avg_fields.filter { |f| f.calculation.dig('expression', 'avg').is_a?(Array) } +end + +def migrate_field(field, save) + old_avg_data = field.calculation.dig('expression', 'avg') + field.calculation = { type: 'number', expression: { avg: { data: old_avg_data, extra: { decimalPlaces: 2 } } } } + field.disabled = true + field.type = 'calculated' + if save + field.save! + puts "Updated field #{field.name}" + else + puts "Would update #{field.name} to the following" + puts field.inspect + end +end + +fields_with_old_avg_calculations.each { |f| migrate_field(f, save_records) } From aaba8524c61616d07ac7d65137965897d83926cd Mon Sep 17 00:00:00 2001 From: Awen Saunders Date: Mon, 25 Nov 2024 18:11:04 +0000 Subject: [PATCH 19/36] Update data migration to destroy and recreate relevant field --- .../v2.12/update_calculated_avg_fields_gbv.rb | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb b/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb index 3413f66850..167c895dad 100644 --- a/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb +++ b/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb @@ -10,17 +10,20 @@ def fields_with_old_avg_calculations avg_fields.filter { |f| f.calculation.dig('expression', 'avg').is_a?(Array) } end -def migrate_field(field, save) - old_avg_data = field.calculation.dig('expression', 'avg') - field.calculation = { type: 'number', expression: { avg: { data: old_avg_data, extra: { decimalPlaces: 2 } } } } - field.disabled = true - field.type = 'calculated' +def migrate_field(orig_field, save) + old_avg_data = orig_field.calculation.dig('expression', 'avg') + new_field = orig_field.dup + new_field.calculation = { type: 'number', expression: { avg: { data: old_avg_data, extra: { decimalPlaces: 2 } } } } + new_field.disabled = true + new_field.type = 'calculated' if save - field.save! - puts "Updated field #{field.name}" + # We because the type of a field cannot be changed, we need to destroy and recreate + orig_field.destroy! + new_field.save! + puts "Updated field #{new_field.name}" else - puts "Would update #{field.name} to the following" - puts field.inspect + puts "Would update #{new_field.name} to the following" + puts new_field.inspect end end From 4b095caeb03779aacfc65a73e99dace12ca0ba9a Mon Sep 17 00:00:00 2001 From: Awen Saunders Date: Wed, 4 Dec 2024 16:22:15 +0000 Subject: [PATCH 20/36] Move from v2.12 to v2.11.1 for data migration --- db/data_migration/{v2.12 => v2.11.1}/README.md | 0 .../{v2.12 => v2.11.1}/update_calculated_avg_fields_gbv.rb | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename db/data_migration/{v2.12 => v2.11.1}/README.md (100%) rename db/data_migration/{v2.12 => v2.11.1}/update_calculated_avg_fields_gbv.rb (100%) diff --git a/db/data_migration/v2.12/README.md b/db/data_migration/v2.11.1/README.md similarity index 100% rename from db/data_migration/v2.12/README.md rename to db/data_migration/v2.11.1/README.md diff --git a/db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb b/db/data_migration/v2.11.1/update_calculated_avg_fields_gbv.rb similarity index 100% rename from db/data_migration/v2.12/update_calculated_avg_fields_gbv.rb rename to db/data_migration/v2.11.1/update_calculated_avg_fields_gbv.rb From 6ea19ac96d3f4cce652c71ed96a7c70f9f2a5c25 Mon Sep 17 00:00:00 2001 From: Awen Saunders Date: Wed, 4 Dec 2024 16:22:55 +0000 Subject: [PATCH 21/36] Update references in readme to point to new location --- db/data_migration/v2.11.1/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/data_migration/v2.11.1/README.md b/db/data_migration/v2.11.1/README.md index 29a91bfd41..f4c66eb9d8 100644 --- a/db/data_migration/v2.11.1/README.md +++ b/db/data_migration/v2.11.1/README.md @@ -1,4 +1,4 @@ -# Migrations in 2.12 +# Migrations in 2.11.1 This migration updates the configuration of GBV instances *only*. This migrates the fields that calculate average scores on subforms to new versions which support decimal places. @@ -9,5 +9,5 @@ These scripts will update the `Field` records where calculations exist. To validate which fields will be updated, run the following: ```bash -rails r ./db/migrations/v2.12/update_calculated_avg_fields_gbv.rb +rails r ./db/migrations/v2.11.1/update_calculated_avg_fields_gbv.rb ``` \ No newline at end of file From 0d1d510309a0539165aa4422f0f9a1aea0295244 Mon Sep 17 00:00:00 2001 From: Alberto Espinoza Date: Wed, 4 Dec 2024 12:23:56 -0600 Subject: [PATCH 22/36] R2-3138 - Security - Fix user escalation of privilege --- app/models/user.rb | 2 +- spec/models/user_spec.rb | 29 +++++++++++++++++++ spec/requests/api/v2/users_controller_spec.rb | 2 ++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index b058b6d27f..e1e2dd811e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -128,7 +128,7 @@ def hidden_attributes end def self_hidden_attributes - %w[role_unique_id identity_provider_unique_id user_name] + %w[role_unique_id identity_provider_unique_id user_name user_group_unique_ids agency_id] end def password_parameters diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index b14c202b12..19c3883706 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1056,6 +1056,35 @@ def build_and_save_user(options = {}) end end + describe '.permitted_api_params' do + before do + clean_data(User, Role, PrimeroModule, PrimeroProgram, FormSection, Agency, UserGroup, Child) + @module_cp = PrimeroModule.new(name: 'CP') + @module_cp.save(validate: false) + + permission_case = Permission.new( + resource: Permission::CASE, + actions: [Permission::READ, Permission::WRITE, Permission::CREATE] + ) + @role = Role.new(permissions: [permission_case], modules: [@module_cp]) + @role.save(validate: false) + @group1 = UserGroup.create!(name: 'Group1') + @user1 = User.new(user_name: 'user1', role: @role, user_groups: [@group1]) + @user1.save(validate: false) + end + context 'when user is not admin' do + it 'should not returm that are not allowed' do + expect(User.permitted_api_params(@user1, @user1)).not_to include( + 'role_unique_id', 'role_id', 'user_group_unique_ids', 'agency_id' + ) + end + end + + after do + clean_data(User, Role, PrimeroModule, PrimeroProgram, FormSection, Agency, UserGroup, Child) + end + end + after do clean_data(Alert, User, Agency, Role, FormSection, Field) end diff --git a/spec/requests/api/v2/users_controller_spec.rb b/spec/requests/api/v2/users_controller_spec.rb index 6d64deeee0..977d7a2279 100644 --- a/spec/requests/api/v2/users_controller_spec.rb +++ b/spec/requests/api/v2/users_controller_spec.rb @@ -733,6 +733,7 @@ data: { role_unique_id: 'test-role-1', identity_provider_unique_id: 'primeroims_2', + agency_id: @agency_a.id, user_name: } } @@ -744,6 +745,7 @@ expect(response).to have_http_status(200) expect(json['data']['id']).to eq(@user_d.id) expect(@user_d.role.unique_id).to eq(@role_manage_user.unique_id) + expect(@user_d.agency.unique_id).to eq(@agency_b.unique_id) expect(@user_d.user_name).not_to eq(user_name) expect(@user_d.identity_provider.unique_id).to eq(@identity_provider_a.unique_id) end From aaede4d815e2ddcf71b4cf0880c3434efb065bab Mon Sep 17 00:00:00 2001 From: Alberto Espinoza Date: Wed, 4 Dec 2024 14:20:33 -0600 Subject: [PATCH 23/36] R2-3138 Adding more hidden attributes --- app/models/user.rb | 4 +++- spec/models/user_spec.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index e1e2dd811e..b5c5361844 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -128,7 +128,9 @@ def hidden_attributes end def self_hidden_attributes - %w[role_unique_id identity_provider_unique_id user_name user_group_unique_ids agency_id] + %w[role_unique_id identity_provider_unique_id user_name user_group_unique_ids agency_id + identity_provider_id reset_password_token reset_password_sent_at service_account + unlock_token locked_at failed_attempts identity_provider_sync] end def password_parameters diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 19c3883706..0d68de420d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1075,7 +1075,7 @@ def build_and_save_user(options = {}) context 'when user is not admin' do it 'should not returm that are not allowed' do expect(User.permitted_api_params(@user1, @user1)).not_to include( - 'role_unique_id', 'role_id', 'user_group_unique_ids', 'agency_id' + *User.self_hidden_attributes ) end end From 504ebe68e25ff9bda689970539cf107e928183b0 Mon Sep 17 00:00:00 2001 From: Alberto Espinoza Date: Thu, 5 Dec 2024 11:23:20 -0600 Subject: [PATCH 24/36] R2-3105 - W - Missing 'Show hidden fields' label on form export modal --- .../components/form/fields/radio-input.jsx | 2 +- .../form/fields/radio-input.spec.js | 33 +++++++++++++++++++ .../components/form/fields/styles.css | 5 +++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 app/javascript/components/form/fields/radio-input.spec.js diff --git a/app/javascript/components/form/fields/radio-input.jsx b/app/javascript/components/form/fields/radio-input.jsx index 5971364eb2..dca2bc2e1d 100644 --- a/app/javascript/components/form/fields/radio-input.jsx +++ b/app/javascript/components/form/fields/radio-input.jsx @@ -12,7 +12,7 @@ function RadioInput({ commonInputProps, options, formMethods }) { return ( - + {radioGroupLabel} - fields/", () => { + const props = { + commonInputProps: { + label: "Test Field 2", + name: "test" + }, + options: [ + { id: 1, display_text: "option-1" }, + { id: 2, display_text: "option-2" } + ], + formMethods: {} + }; + + it("renders RadioInput inputs", () => { + mountedFieldComponent(); + expect(screen.getByText("option-1")).toBeInTheDocument(); + expect(screen.getByText("option-2")).toBeInTheDocument(); + }); + + it("renders help text", () => { + mountedFieldComponent(); + expect(screen.getByText("Test Field 2 help text")).toBeInTheDocument(); + }); + + it("renders label", () => { + mountedFieldComponent(); + expect(screen.getByText("Test Field 2")).toBeInTheDocument(); + }); +}); diff --git a/app/javascript/components/form/fields/styles.css b/app/javascript/components/form/fields/styles.css index 3a880b97ae..9b54a4b365 100644 --- a/app/javascript/components/form/fields/styles.css +++ b/app/javascript/components/form/fields/styles.css @@ -145,3 +145,8 @@ .downloadButton { padding-top: 10px; } + +.radioLabel { + font-weight: bold; + color: var(--c-solid-black); +} From eaad4ca440c1a1e41bc91049d7987ace50e8071b Mon Sep 17 00:00:00 2001 From: Joshua Toliver Date: Thu, 5 Dec 2024 16:38:52 -0500 Subject: [PATCH 25/36] R2-3139: Fixing issue where users get signed out after updating their password in profile --- app/controllers/api/v2/users_controller.rb | 5 +++++ spec/requests/api/v2/users_controller_spec.rb | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/app/controllers/api/v2/users_controller.rb b/app/controllers/api/v2/users_controller.rb index 812d4f8b98..b0f722dec2 100644 --- a/app/controllers/api/v2/users_controller.rb +++ b/app/controllers/api/v2/users_controller.rb @@ -41,6 +41,7 @@ def update validate_json!(User::USER_FIELDS_SCHEMA, user_params) @user.update_with_properties(@user_params) @user.save! + keep_logged_in end def destroy @@ -73,4 +74,8 @@ def welcome def identity_sync @user.identity_sync(current_user) end + + def keep_logged_in + bypass_sign_in(@user) if @user.saved_change_to_encrypted_password? + end end diff --git a/spec/requests/api/v2/users_controller_spec.rb b/spec/requests/api/v2/users_controller_spec.rb index 977d7a2279..01c2485f3e 100644 --- a/spec/requests/api/v2/users_controller_spec.rb +++ b/spec/requests/api/v2/users_controller_spec.rb @@ -667,6 +667,21 @@ expect(user1.identity_provider.unique_id).to eq(@identity_provider_b.unique_id) end + it 'keeps user signed in when password changed' do + sign_in(@user_d) + params = { + data: { + password: 'primer0!', + password_confirmation: 'primer0!' + } + } + patch("/api/v2/users/#{@user_d.id}", params:) + expect(response).to have_http_status(200) + get('/api/v2/roles') + expect(response).to have_http_status(200) + expect(controller.current_user).to eq(@user_d) + end + it "returns 403 if user isn't authorized to update users" do login_for_test params = { From 05b27b9f1a73dc32d2d430e5f0a1658bcc5f9461 Mon Sep 17 00:00:00 2001 From: Joshua Toliver Date: Thu, 5 Dec 2024 16:41:04 -0500 Subject: [PATCH 26/36] Renaming method --- app/controllers/api/v2/users_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v2/users_controller.rb b/app/controllers/api/v2/users_controller.rb index b0f722dec2..574b8130d6 100644 --- a/app/controllers/api/v2/users_controller.rb +++ b/app/controllers/api/v2/users_controller.rb @@ -41,7 +41,7 @@ def update validate_json!(User::USER_FIELDS_SCHEMA, user_params) @user.update_with_properties(@user_params) @user.save! - keep_logged_in + keep_user_signed_in end def destroy @@ -75,7 +75,7 @@ def identity_sync @user.identity_sync(current_user) end - def keep_logged_in + def keep_user_signed_in bypass_sign_in(@user) if @user.saved_change_to_encrypted_password? end end From 25bd032cf6a7ba5114e88150d10a701886dc03f3 Mon Sep 17 00:00:00 2001 From: Alberto Espinoza Date: Thu, 5 Dec 2024 16:39:17 -0600 Subject: [PATCH 27/36] R2-3068 - Fix current location horizontal scroll bar --- .../components/filter-types/select-filter/component.jsx | 2 +- .../index-filters/components/filter-types/styles.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/javascript/components/index-filters/components/filter-types/select-filter/component.jsx b/app/javascript/components/index-filters/components/filter-types/select-filter/component.jsx index 9e713424a7..c4ff812cc4 100644 --- a/app/javascript/components/index-filters/components/filter-types/select-filter/component.jsx +++ b/app/javascript/components/index-filters/components/filter-types/select-filter/component.jsx @@ -166,7 +166,7 @@ function Component({ filter, mode, moreSectionFilters = {}, multiple = true, res return ( Date: Fri, 6 Dec 2024 12:46:25 -0500 Subject: [PATCH 28/36] Updating Rails to 6.1.7.9, Puma, Nokogiri, etc --- Gemfile | 2 +- Gemfile.lock | 136 +++++++++++++++++++++++++-------------------------- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Gemfile b/Gemfile index 229d44e6b6..9e9ce4f377 100644 --- a/Gemfile +++ b/Gemfile @@ -34,7 +34,7 @@ gem 'prawn-table', '~> 0.2' # PDF generation gem 'puma', '~> 6.4' # Ruby Rack server gem 'rack', '~> 2.2' gem 'rack-attack', '>= 6.6' # Rack middleware to rate limit sensetive routes, such as those used for auth -gem 'rails', '6.1.7.8' +gem 'rails', '6.1.7.9' gem 'rake', '~> 13.0' gem 'rbnacl', '>= 7.1.1' # Libsodium Ruby binding. Used for encrypting export file passwords. gem 'rubyzip', '~> 2.3', # Zip and encrypt exported files diff --git a/Gemfile.lock b/Gemfile.lock index 344d20baf1..8243ae3da4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,62 +1,62 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.8) - actionpack (= 6.1.7.8) - activesupport (= 6.1.7.8) + actioncable (6.1.7.9) + actionpack (= 6.1.7.9) + activesupport (= 6.1.7.9) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.8) - actionpack (= 6.1.7.8) - activejob (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + actionmailbox (6.1.7.9) + actionpack (= 6.1.7.9) + activejob (= 6.1.7.9) + activerecord (= 6.1.7.9) + activestorage (= 6.1.7.9) + activesupport (= 6.1.7.9) mail (>= 2.7.1) - actionmailer (6.1.7.8) - actionpack (= 6.1.7.8) - actionview (= 6.1.7.8) - activejob (= 6.1.7.8) - activesupport (= 6.1.7.8) + actionmailer (6.1.7.9) + actionpack (= 6.1.7.9) + actionview (= 6.1.7.9) + activejob (= 6.1.7.9) + activesupport (= 6.1.7.9) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7.8) - actionview (= 6.1.7.8) - activesupport (= 6.1.7.8) + actionpack (6.1.7.9) + actionview (= 6.1.7.9) + activesupport (= 6.1.7.9) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.8) - actionpack (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + actiontext (6.1.7.9) + actionpack (= 6.1.7.9) + activerecord (= 6.1.7.9) + activestorage (= 6.1.7.9) + activesupport (= 6.1.7.9) nokogiri (>= 1.8.5) - actionview (6.1.7.8) - activesupport (= 6.1.7.8) + actionview (6.1.7.9) + activesupport (= 6.1.7.9) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.1.7.8) - activesupport (= 6.1.7.8) + activejob (6.1.7.9) + activesupport (= 6.1.7.9) globalid (>= 0.3.6) - activemodel (6.1.7.8) - activesupport (= 6.1.7.8) - activerecord (6.1.7.8) - activemodel (= 6.1.7.8) - activesupport (= 6.1.7.8) + activemodel (6.1.7.9) + activesupport (= 6.1.7.9) + activerecord (6.1.7.9) + activemodel (= 6.1.7.9) + activesupport (= 6.1.7.9) activerecord-nulldb-adapter (0.9.0) activerecord (>= 5.2.0, < 7.1) - activestorage (6.1.7.8) - actionpack (= 6.1.7.8) - activejob (= 6.1.7.8) - activerecord (= 6.1.7.8) - activesupport (= 6.1.7.8) + activestorage (6.1.7.9) + actionpack (= 6.1.7.9) + activejob (= 6.1.7.9) + activerecord (= 6.1.7.9) + activesupport (= 6.1.7.9) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.8) + activesupport (6.1.7.9) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -111,7 +111,7 @@ GEM crass (1.0.6) csv-safe (3.2.1) daemons (1.4.1) - date (3.3.4) + date (3.4.1) deep_merge (1.2.2) delayed_job (4.1.11) activesupport (>= 3.0, < 8.0) @@ -183,7 +183,7 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.6.1) - loofah (2.22.0) + loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -200,7 +200,7 @@ GEM mime-types-data (3.2023.0808) mini_magick (4.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.7) + mini_portile2 (2.8.8) minipack (0.3.6) actionview railties (>= 4.2) @@ -209,7 +209,7 @@ GEM multipart-post (2.3.0) net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.12) + net-imap (0.5.1) date net-protocol net-pop (0.1.2) @@ -218,8 +218,8 @@ GEM timeout net-smtp (0.5.0) net-protocol - nio4r (2.5.9) - nokogiri (1.16.5) + nio4r (2.7.4) + nokogiri (1.16.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) openssl (3.1.0) @@ -244,9 +244,9 @@ GEM byebug (~> 11.0) pry (>= 0.13, < 0.15) public_suffix (5.0.3) - puma (6.4.2) + puma (6.5.0) nio4r (~> 2.0) - racc (1.8.0) + racc (1.8.1) rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) @@ -257,20 +257,20 @@ GEM rack_session_access (0.2.0) builder (>= 2.0.0) rack (>= 1.0.0) - rails (6.1.7.8) - actioncable (= 6.1.7.8) - actionmailbox (= 6.1.7.8) - actionmailer (= 6.1.7.8) - actionpack (= 6.1.7.8) - actiontext (= 6.1.7.8) - actionview (= 6.1.7.8) - activejob (= 6.1.7.8) - activemodel (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + rails (6.1.7.9) + actioncable (= 6.1.7.9) + actionmailbox (= 6.1.7.9) + actionmailer (= 6.1.7.9) + actionpack (= 6.1.7.9) + actiontext (= 6.1.7.9) + actionview (= 6.1.7.9) + activejob (= 6.1.7.9) + activemodel (= 6.1.7.9) + activerecord (= 6.1.7.9) + activestorage (= 6.1.7.9) + activesupport (= 6.1.7.9) bundler (>= 1.15.0) - railties (= 6.1.7.8) + railties (= 6.1.7.9) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -280,15 +280,15 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.0) + rails-html-sanitizer (1.6.1) loofah (~> 2.21) - nokogiri (~> 1.14) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rails-i18n (7.0.8) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (6.1.7.8) - actionpack (= 6.1.7.8) - activesupport (= 6.1.7.8) + railties (6.1.7.9) + actionpack (= 6.1.7.9) + activesupport (= 6.1.7.9) method_source rake (>= 12.2) thor (~> 1.0) @@ -384,9 +384,9 @@ GEM 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.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) strscan (3.1.0) sunspot (2.6.0) @@ -403,7 +403,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) text (1.3.1) thor (1.3.1) - timeout (0.4.1) + timeout (0.4.2) ttfunk (1.7.0) twitter_cldr (4.4.5) camertron-eprun @@ -476,7 +476,7 @@ DEPENDENCIES rack-mini-profiler (>= 1.0.0) rack-test (~> 1.1) rack_session_access (~> 0.2) - rails (= 6.1.7.8) + rails (= 6.1.7.9) rails-controller-testing (~> 1.0) rake (~> 13.0) rbnacl (>= 7.1.1) From bbe0d22ade159873ad8ad8c12b0c20929788d8f5 Mon Sep 17 00:00:00 2001 From: Joshua Toliver Date: Fri, 6 Dec 2024 15:20:11 -0500 Subject: [PATCH 29/36] Fixing issue where changing password on another user changes the session --- app/controllers/api/v2/users_controller.rb | 2 +- spec/requests/api/v2/users_controller_spec.rb | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v2/users_controller.rb b/app/controllers/api/v2/users_controller.rb index 574b8130d6..552ea5e8b7 100644 --- a/app/controllers/api/v2/users_controller.rb +++ b/app/controllers/api/v2/users_controller.rb @@ -76,6 +76,6 @@ def identity_sync end def keep_user_signed_in - bypass_sign_in(@user) if @user.saved_change_to_encrypted_password? + bypass_sign_in(@user) if @user.saved_change_to_encrypted_password? && current_user == @user end end diff --git a/spec/requests/api/v2/users_controller_spec.rb b/spec/requests/api/v2/users_controller_spec.rb index 01c2485f3e..6358286fc9 100644 --- a/spec/requests/api/v2/users_controller_spec.rb +++ b/spec/requests/api/v2/users_controller_spec.rb @@ -682,6 +682,21 @@ expect(controller.current_user).to eq(@user_d) end + it 'does not change logged in user session when password changed on another user' do + sign_in(@super_user) + params = { + data: { + password: 'primer0!', + password_confirmation: 'primer0!' + } + } + patch("/api/v2/users/#{@user_c.id}", params:) + expect(response).to have_http_status(200) + get('/api/v2/roles') + expect(response).to have_http_status(200) + expect(controller.current_user).to eq(@super_user) + end + it "returns 403 if user isn't authorized to update users" do login_for_test params = { From e3ec5e90f57c49638c43c9df473e5f1a59e3d25a Mon Sep 17 00:00:00 2001 From: Joshua Toliver Date: Fri, 6 Dec 2024 15:41:14 -0500 Subject: [PATCH 30/36] Updating node packages from npm audit --- package-lock.json | 1509 ++++++++++++++++++--------------------------- package.json | 3 +- 2 files changed, 618 insertions(+), 894 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0088429c81..f901a1c69a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,6 @@ "compression-webpack-plugin": "^9.2.0", "connected-react-router": "^6.9.3", "core-js": "3.37.1", - "cross-env": "^7.0.3", "css-loader": "^6.7.1", "date-fns": "^2.29.2", "deepmerge": "^4.3.1", @@ -113,7 +112,7 @@ "nock": "^10.0.6", "normalizr": "^3.6.2", "notistack": "^2.0.8", - "nyc": "^14.1.1", + "nyc": "^17.1.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-import": "^14.0.2", "postcss-loader": "^6.2.1", @@ -2705,18 +2704,6 @@ "node": ">=6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", "dev": true, @@ -2729,58 +2716,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "dev": true, @@ -3174,67 +3109,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-reports": { - "version": "3.1.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.7.0", "dev": true, @@ -3263,42 +3137,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -5878,6 +5716,19 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "dev": true, @@ -6012,20 +5863,22 @@ } }, "node_modules/append-transform": { - "version": "1.0.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/archy": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/argparse": { "version": "2.0.1", @@ -6484,18 +6337,6 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/babel-loader/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-loader/node_modules/loader-utils": { "version": "2.0.4", "dev": true, @@ -6509,17 +6350,6 @@ "node": ">=8.9.0" } }, - "node_modules/babel-loader/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-loader/node_modules/make-dir": { "version": "3.1.0", "dev": true, @@ -6534,47 +6364,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-loader/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/babel-loader/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/babel-loader/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/babel-loader/node_modules/pkg-dir": { "version": "4.2.0", "dev": true, @@ -6609,14 +6398,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "dev": true, @@ -6632,19 +6413,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "dev": true, @@ -7175,32 +6943,48 @@ } }, "node_modules/caching-transform": { - "version": "3.0.2", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/call-bind": { - "version": "1.0.7", + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "semver": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7416,6 +7200,15 @@ "dev": true, "license": "MIT" }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/clean-webpack-plugin": { "version": "4.0.0", "dev": true, @@ -7761,9 +7554,10 @@ } }, "node_modules/cookie": { - "version": "0.6.0", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7824,21 +7618,6 @@ "node": ">=10" } }, - "node_modules/cp-file": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/create-jest": { "version": "29.7.0", "dev": true, @@ -7918,27 +7697,11 @@ "node": ">=8" } }, - "node_modules/cross-env": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8426,14 +8189,27 @@ } }, "node_modules/default-require-extensions": { - "version": "2.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { - "strip-bom": "^3.0.0" + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/define-data-property": { @@ -8961,8 +8737,9 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, "node_modules/es6-promise": { "version": "4.2.8", @@ -9756,9 +9533,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -9766,7 +9543,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -9780,7 +9557,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -9795,6 +9572,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { @@ -9824,9 +9605,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "node_modules/express/node_modules/safe-buffer": { @@ -10121,6 +9902,28 @@ "version": "1.1.0", "license": "MIT" }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/flat": { "version": "5.0.2", "dev": true, @@ -10188,48 +9991,33 @@ } }, "node_modules/foreground-child": { - "version": "1.5.6", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/foreground-child/node_modules/lru-cache": { - "version": "4.1.5", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, - "license": "ISC", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/which": { - "version": "1.3.1", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" + "engines": { + "node": ">=14" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/yallist": { - "version": "2.1.2", - "dev": true, - "license": "ISC" - }, "node_modules/form-data": { "version": "4.0.0", "dev": true, @@ -10316,6 +10104,26 @@ "node": ">= 0.6" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/fs-extra": { "version": "9.1.0", "dev": true, @@ -10696,22 +10504,28 @@ } }, "node_modules/hasha": { - "version": "3.0.0", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { - "is-stream": "^1.0.1" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/is-stream": { - "version": "1.1.0", + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/hasown": { @@ -10756,11 +10570,6 @@ "version": "16.13.1", "license": "MIT" }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, "node_modules/hpack.js": { "version": "2.1.6", "dev": true, @@ -10924,9 +10733,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.4", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -11063,70 +10873,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", "dev": true, @@ -11645,6 +11391,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "dev": true, @@ -11693,6 +11445,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "dev": true, @@ -11723,97 +11484,195 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-hook": { - "version": "2.0.7", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "append-transform": "^1.0.0" + "append-transform": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { - "version": "2.2.7", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "html-escaper": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/iterator.prototype": { @@ -14185,11 +14044,6 @@ "node": ">=4" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "license": "MIT" @@ -14372,46 +14226,24 @@ "version": "1.2.4", "license": "MIT" }, - "node_modules/load-json-file": { - "version": "4.0.0", + "node_modules/loader-runner": { + "version": "4.2.0", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=6.11.5" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" + "node": ">=8" } }, "node_modules/lockfile": { @@ -14453,8 +14285,9 @@ }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", @@ -14772,22 +14605,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -15329,11 +15146,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nested-error-stacks": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/nise": { "version": "1.5.3", "dev": true, @@ -15394,29 +15206,22 @@ "dev": true, "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", + "node_modules/node-releases": { + "version": "2.0.14", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -15495,224 +15300,236 @@ "license": "MIT" }, "node_modules/nyc": { - "version": "14.1.1", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dev": true, - "license": "ISC", "dependencies": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "bin": { "nyc": "bin/nyc.js" }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/nyc/node_modules/argparse": { - "version": "1.0.10", + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/nyc/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/nyc/node_modules/cliui": { - "version": "5.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/nyc/node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/nyc/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/nyc/node_modules/find-up": { - "version": "3.0.0", + "node_modules/nyc/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/nyc/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "3.0.0", + "node_modules/nyc/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/p-locate": { + "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nyc/node_modules/p-try": { - "version": "2.2.0", + "node_modules/nyc/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nyc/node_modules/string-width": { - "version": "3.1.0", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nyc/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=6" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nyc/node_modules/wrap-ansi": { - "version": "5.1.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "node_modules/nyc/node_modules/yargs": { - "version": "13.3.2", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, "node_modules/nyc/node_modules/yargs-parser": { - "version": "13.1.2", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/object-assign": { @@ -15924,12 +15741,31 @@ "node": ">= 0.8.0" } }, - "node_modules/os-homedir": { - "version": "1.0.2", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/p-map": { @@ -15952,18 +15788,28 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/package-hash": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", + "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/parent-module": { @@ -16188,20 +16034,6 @@ "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "3.0.0", "dev": true, @@ -16213,14 +16045,6 @@ "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pkg-up": { "version": "3.1.0", "dev": true, @@ -16255,20 +16079,6 @@ "node": ">=6" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "dev": true, @@ -16280,14 +16090,6 @@ "node": ">=6" } }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "dev": true, @@ -17272,6 +17074,18 @@ "dev": true, "license": "MIT" }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/progress": { "version": "2.0.3", "dev": true, @@ -17359,11 +17173,6 @@ "proxy-compare": "2.4.0" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, "node_modules/psl": { "version": "1.8.0", "dev": true, @@ -17967,106 +17776,6 @@ "node": ">=0.10.0" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "dev": true, @@ -18296,8 +18005,9 @@ }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -18345,8 +18055,9 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/require-relative": { "version": "0.8.7", @@ -18454,9 +18165,10 @@ } }, "node_modules/rollup": { - "version": "2.70.1", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -18888,8 +18600,9 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -19130,57 +18843,66 @@ "license": "(WTFPL OR MIT)" }, "node_modules/spawn-wrap": { - "version": "1.4.3", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "which": "^1.3.0" + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "1.3.1", + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/spdx-correct": { - "version": "3.1.1", + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/spdy": { "version": "4.0.2", "dev": true, @@ -19704,17 +19426,17 @@ "license": "MIT" }, "node_modules/test-exclude": { - "version": "5.2.3", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/text-segmentation": { @@ -20007,6 +19729,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "3.9.10", "dev": true, @@ -20229,15 +19960,6 @@ "node": ">=10.12.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/value-equal": { "version": "1.0.1", "dev": true, @@ -20968,9 +20690,10 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "dev": true, - "license": "ISC" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true }, "node_modules/which-typed-array": { "version": "1.1.15", @@ -21517,13 +21240,15 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "2.4.3", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "node_modules/ws": { diff --git a/package.json b/package.json index 6e3f66ce35..243fdf384f 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,6 @@ "compression-webpack-plugin": "^9.2.0", "connected-react-router": "^6.9.3", "core-js": "3.37.1", - "cross-env": "^7.0.3", "css-loader": "^6.7.1", "date-fns": "^2.29.2", "deepmerge": "^4.3.1", @@ -136,7 +135,7 @@ "nock": "^10.0.6", "normalizr": "^3.6.2", "notistack": "^2.0.8", - "nyc": "^14.1.1", + "nyc": "^17.1.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-import": "^14.0.2", "postcss-loader": "^6.2.1", From a676a814d1410f9f0820cfd5d60505fa2f0458d4 Mon Sep 17 00:00:00 2001 From: Pavel Nabutovsky Date: Mon, 9 Dec 2024 14:03:08 -0500 Subject: [PATCH 31/36] Updating rexml to 3.3.9 - CVE bill of health --- Gemfile.lock | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8243ae3da4..7b7165bbb3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -305,8 +305,7 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.3.6) - strscan + rexml (3.3.9) roo (2.10.0) nokogiri (~> 1) rubyzip (>= 1.3.0, < 3.0.0) @@ -388,7 +387,6 @@ GEM actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - strscan (3.1.0) sunspot (2.6.0) pr_geohash (~> 1.0) rsolr (>= 1.1.1, < 3) From a057bc264ea2cdc343a2492df9a44296af272603 Mon Sep 17 00:00:00 2001 From: Pavel Nabutovsky Date: Mon, 9 Dec 2024 14:03:40 -0500 Subject: [PATCH 32/36] Bumping to v2.11.1 --- config/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/version.rb b/config/version.rb index c03dc2f533..4a92118bf4 100644 --- a/config/version.rb +++ b/config/version.rb @@ -3,5 +3,5 @@ # Copyright (c) 2014 - 2023 UNICEF. All rights reserved. class Primero::Application - VERSION = '2.11.0.6' + VERSION = '2.11.1' end From 9b96812074532aeb831b294b8a97edd29a46c8b5 Mon Sep 17 00:00:00 2001 From: Alexandru Contu <44123566+AlexTheProg@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:02:14 +0200 Subject: [PATCH 33/36] remove breaking dependency --- package-lock.json | 68 ++++------------------------------------------- package.json | 1 - 2 files changed, 5 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index f901a1c69a..10e46bb073 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,6 @@ "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", - "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.2", "ad-bs-converter": "^0.5.0", "add": "^2.0.6", @@ -4698,35 +4697,6 @@ } } }, - "node_modules/@testing-library/react-hooks": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0", - "react": "^16.9.0 || ^17.0.0", - "react-dom": "^16.9.0 || ^17.0.0", - "react-test-renderer": "^16.9.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } - } - }, "node_modules/@testing-library/user-event": { "version": "14.5.2", "dev": true, @@ -4874,7 +4844,6 @@ }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", - "dev": true, "license": "MIT", "dependencies": { "@types/react": "*", @@ -5004,11 +4973,12 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "17.0.42", + "version": "18.3.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", + "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -5047,10 +5017,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "license": "MIT" - }, "node_modules/@types/semver": { "version": "7.3.13", "dev": true, @@ -8037,7 +8003,7 @@ }, "node_modules/date-fns": { "version": "2.29.2", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.11" @@ -10033,7 +9999,6 @@ }, "node_modules/formik": { "version": "2.4.6", - "dev": true, "funding": [ { "type": "individual", @@ -10069,7 +10034,6 @@ }, "node_modules/formik/node_modules/deepmerge": { "version": "2.2.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14260,7 +14224,6 @@ }, "node_modules/lodash-es": { "version": "4.17.21", - "dev": true, "license": "MIT" }, "node_modules/lodash.assignwith": { @@ -14994,7 +14957,7 @@ }, "node_modules/moment": { "version": "2.29.4", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "*" @@ -17415,7 +17378,6 @@ }, "node_modules/react": { "version": "18.3.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -17489,7 +17451,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -17501,30 +17462,13 @@ }, "node_modules/react-dom/node_modules/scheduler": { "version": "0.23.2", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, "node_modules/react-fast-compare": { "version": "2.0.4", - "dev": true, "license": "MIT" }, "node_modules/react-hook-form": { @@ -19470,7 +19414,6 @@ }, "node_modules/tiny-warning": { "version": "1.0.3", - "dev": true, "license": "MIT" }, "node_modules/tmpl": { @@ -19572,7 +19515,6 @@ }, "node_modules/tslib": { "version": "2.6.3", - "dev": true, "license": "0BSD" }, "node_modules/tss-react": { diff --git a/package.json b/package.json index 243fdf384f..78cfff2fe1 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", - "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.2", "ad-bs-converter": "^0.5.0", "add": "^2.0.6", From da8a3ceca58c0621f8dd89d23e188ef526b25832 Mon Sep 17 00:00:00 2001 From: Alexandru Contu <44123566+AlexTheProg@users.noreply.github.com> Date: Tue, 17 Dec 2024 13:04:10 +0200 Subject: [PATCH 34/36] update import for renderHook --- app/javascript/test-utils/setup-hook.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/test-utils/setup-hook.js b/app/javascript/test-utils/setup-hook.js index 633bd6d2cb..d8ece1b73d 100644 --- a/app/javascript/test-utils/setup-hook.js +++ b/app/javascript/test-utils/setup-hook.js @@ -1,9 +1,9 @@ // Copyright (c) 2014 - 2023 UNICEF. All rights reserved. -import { renderHook, act } from "@testing-library/react-hooks"; import { Provider } from "react-redux"; import isFunction from "lodash/isFunction"; import { fromJS } from "immutable"; +import { renderHook } from "@testing-library/react"; import I18nProvider from "../components/i18n/provider"; From bc5d029e804a088ac7e1abfdfc79f0de1faeb088 Mon Sep 17 00:00:00 2001 From: Alexandru Contu <44123566+AlexTheProg@users.noreply.github.com> Date: Tue, 17 Dec 2024 13:08:58 +0200 Subject: [PATCH 35/36] Revert "update import for renderHook" This reverts commit da8a3ceca58c0621f8dd89d23e188ef526b25832. --- app/javascript/test-utils/setup-hook.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/test-utils/setup-hook.js b/app/javascript/test-utils/setup-hook.js index d8ece1b73d..633bd6d2cb 100644 --- a/app/javascript/test-utils/setup-hook.js +++ b/app/javascript/test-utils/setup-hook.js @@ -1,9 +1,9 @@ // Copyright (c) 2014 - 2023 UNICEF. All rights reserved. +import { renderHook, act } from "@testing-library/react-hooks"; import { Provider } from "react-redux"; import isFunction from "lodash/isFunction"; import { fromJS } from "immutable"; -import { renderHook } from "@testing-library/react"; import I18nProvider from "../components/i18n/provider"; From e684cb0e62d05c79036e8de80bbbc40958327873 Mon Sep 17 00:00:00 2001 From: Alexandru Contu <44123566+AlexTheProg@users.noreply.github.com> Date: Tue, 17 Dec 2024 13:08:58 +0200 Subject: [PATCH 36/36] Revert "remove breaking dependency" This reverts commit 9b96812074532aeb831b294b8a97edd29a46c8b5. --- package-lock.json | 68 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 1 + 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10e46bb073..f901a1c69a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", + "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.2", "ad-bs-converter": "^0.5.0", "add": "^2.0.6", @@ -4697,6 +4698,35 @@ } } }, + "node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, "node_modules/@testing-library/user-event": { "version": "14.5.2", "dev": true, @@ -4844,6 +4874,7 @@ }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*", @@ -4973,12 +5004,11 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", - "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", + "version": "17.0.42", "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -5017,6 +5047,10 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "license": "MIT" + }, "node_modules/@types/semver": { "version": "7.3.13", "dev": true, @@ -8003,7 +8037,7 @@ }, "node_modules/date-fns": { "version": "2.29.2", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.11" @@ -9999,6 +10033,7 @@ }, "node_modules/formik": { "version": "2.4.6", + "dev": true, "funding": [ { "type": "individual", @@ -10034,6 +10069,7 @@ }, "node_modules/formik/node_modules/deepmerge": { "version": "2.2.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14224,6 +14260,7 @@ }, "node_modules/lodash-es": { "version": "4.17.21", + "dev": true, "license": "MIT" }, "node_modules/lodash.assignwith": { @@ -14957,7 +14994,7 @@ }, "node_modules/moment": { "version": "2.29.4", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -17378,6 +17415,7 @@ }, "node_modules/react": { "version": "18.3.1", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -17451,6 +17489,7 @@ }, "node_modules/react-dom": { "version": "18.3.1", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -17462,13 +17501,30 @@ }, "node_modules/react-dom/node_modules/scheduler": { "version": "0.23.2", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/react-fast-compare": { "version": "2.0.4", + "dev": true, "license": "MIT" }, "node_modules/react-hook-form": { @@ -19414,6 +19470,7 @@ }, "node_modules/tiny-warning": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "node_modules/tmpl": { @@ -19515,6 +19572,7 @@ }, "node_modules/tslib": { "version": "2.6.3", + "dev": true, "license": "0BSD" }, "node_modules/tss-react": { diff --git a/package.json b/package.json index 78cfff2fe1..243fdf384f 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", + "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.2", "ad-bs-converter": "^0.5.0", "add": "^2.0.6",