diff --git a/Gemfile b/Gemfile index 8a7d7b6f5..6bef72e7d 100644 --- a/Gemfile +++ b/Gemfile @@ -42,6 +42,7 @@ gem 'groupdate' gem 'haml-rails' gem 'hashie' gem 'http_accept_language' +gem 'i18n_data' gem 'i18n-tasks', require: false gem 'iban-tools' gem 'image_processing' diff --git a/Gemfile.lock b/Gemfile.lock index d5b56654c..83b365654 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,40 +11,40 @@ GEM specs: aasm (5.1.1) concurrent-ruby (~> 1.0) - actioncable (6.1.3.2) - actionpack (= 6.1.3.2) - activesupport (= 6.1.3.2) + actioncable (6.1.4.1) + actionpack (= 6.1.4.1) + activesupport (= 6.1.4.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.3.2) - actionpack (= 6.1.3.2) - activejob (= 6.1.3.2) - activerecord (= 6.1.3.2) - activestorage (= 6.1.3.2) - activesupport (= 6.1.3.2) + actionmailbox (6.1.4.1) + actionpack (= 6.1.4.1) + activejob (= 6.1.4.1) + activerecord (= 6.1.4.1) + activestorage (= 6.1.4.1) + activesupport (= 6.1.4.1) mail (>= 2.7.1) - actionmailer (6.1.3.2) - actionpack (= 6.1.3.2) - actionview (= 6.1.3.2) - activejob (= 6.1.3.2) - activesupport (= 6.1.3.2) + actionmailer (6.1.4.1) + actionpack (= 6.1.4.1) + actionview (= 6.1.4.1) + activejob (= 6.1.4.1) + activesupport (= 6.1.4.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.3.2) - actionview (= 6.1.3.2) - activesupport (= 6.1.3.2) + actionpack (6.1.4.1) + actionview (= 6.1.4.1) + activesupport (= 6.1.4.1) 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.3.2) - actionpack (= 6.1.3.2) - activerecord (= 6.1.3.2) - activestorage (= 6.1.3.2) - activesupport (= 6.1.3.2) + actiontext (6.1.4.1) + actionpack (= 6.1.4.1) + activerecord (= 6.1.4.1) + activestorage (= 6.1.4.1) + activesupport (= 6.1.4.1) nokogiri (>= 1.8.5) - actionview (6.1.3.2) - activesupport (= 6.1.3.2) + actionview (6.1.4.1) + activesupport (= 6.1.4.1) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -59,26 +59,26 @@ GEM jsonapi-renderer (>= 0.1.1.beta1, < 0.3) active_storage_validations (0.9.2) rails (>= 5.2.0) - activejob (6.1.3.2) - activesupport (= 6.1.3.2) + activejob (6.1.4.1) + activesupport (= 6.1.4.1) globalid (>= 0.3.6) - activemodel (6.1.3.2) - activesupport (= 6.1.3.2) - activerecord (6.1.3.2) - activemodel (= 6.1.3.2) - activesupport (= 6.1.3.2) - activestorage (6.1.3.2) - actionpack (= 6.1.3.2) - activejob (= 6.1.3.2) - activerecord (= 6.1.3.2) - activesupport (= 6.1.3.2) + activemodel (6.1.4.1) + activesupport (= 6.1.4.1) + activerecord (6.1.4.1) + activemodel (= 6.1.4.1) + activesupport (= 6.1.4.1) + activestorage (6.1.4.1) + actionpack (= 6.1.4.1) + activejob (= 6.1.4.1) + activerecord (= 6.1.4.1) + activesupport (= 6.1.4.1) marcel (~> 1.0.0) - mini_mime (~> 1.0.2) + mini_mime (>= 1.1.0) activestorage-openstack (1.5.1) fog-openstack (~> 1.0) marcel rails (>= 5.2.2) - activesupport (6.1.3.2) + activesupport (6.1.4.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -134,7 +134,7 @@ GEM bindex (0.8.1) bootsnap (1.7.2) msgpack (~> 1.0) - brakeman (5.0.0) + brakeman (5.1.1) browser (5.3.1) builder (3.2.4) byebug (11.1.3) @@ -292,8 +292,8 @@ GEM raabro (~> 1.4) geo_coord (0.2.0) geocoder (1.6.5) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (0.5.2) + activesupport (>= 5.0) gon (6.4.0) actionpack (>= 3.0.20) i18n (>= 0.7) @@ -360,6 +360,7 @@ GEM rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) + i18n_data (0.13.0) iban-tools (1.1.0) ice_nine (0.11.2) image_processing (1.12.1) @@ -411,7 +412,7 @@ GEM railties (>= 4) request_store (~> 1.0) logstash-event (1.2.02) - loofah (2.9.1) + loofah (2.12.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -426,8 +427,8 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2021.0212) mini_magick (4.11.0) - mini_mime (1.0.3) - mini_portile2 (2.5.1) + mini_mime (1.1.1) + mini_portile2 (2.6.1) minitest (5.14.4) momentjs-rails (2.20.1) railties (>= 3.1) @@ -437,9 +438,9 @@ GEM mustermann (1.1.1) ruby2_keywords (~> 0.0.1) netrc (0.11.0) - nio4r (2.5.7) - nokogiri (1.11.6) - mini_portile2 (~> 2.5.0) + nio4r (2.5.8) + nokogiri (1.12.4) + mini_portile2 (~> 2.6.1) racc (~> 1.4) open4 (1.3.4) openid_connect (1.2.0) @@ -509,20 +510,20 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.1.3.2) - actioncable (= 6.1.3.2) - actionmailbox (= 6.1.3.2) - actionmailer (= 6.1.3.2) - actionpack (= 6.1.3.2) - actiontext (= 6.1.3.2) - actionview (= 6.1.3.2) - activejob (= 6.1.3.2) - activemodel (= 6.1.3.2) - activerecord (= 6.1.3.2) - activestorage (= 6.1.3.2) - activesupport (= 6.1.3.2) + rails (6.1.4.1) + actioncable (= 6.1.4.1) + actionmailbox (= 6.1.4.1) + actionmailer (= 6.1.4.1) + actionpack (= 6.1.4.1) + actiontext (= 6.1.4.1) + actionview (= 6.1.4.1) + activejob (= 6.1.4.1) + activemodel (= 6.1.4.1) + activerecord (= 6.1.4.1) + activestorage (= 6.1.4.1) + activesupport (= 6.1.4.1) bundler (>= 1.15.0) - railties (= 6.1.3.2) + railties (= 6.1.4.1) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -536,19 +537,19 @@ GEM activesupport (>= 4.2) choice (~> 0.2.0) ruby-graphviz (~> 1.2) - rails-html-sanitizer (1.3.0) + rails-html-sanitizer (1.4.2) loofah (~> 2.3) rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.1.3.2) - actionpack (= 6.1.3.2) - activesupport (= 6.1.3.2) + railties (6.1.4.1) + actionpack (= 6.1.4.1) + activesupport (= 6.1.4.1) method_source - rake (>= 0.8.7) + rake (>= 0.13) thor (~> 1.0) rainbow (3.0.0) - rake (13.0.3) + rake (13.0.6) rake-progressbar (0.0.5) rb-fsevent (0.10.4) rb-inotify (0.10.1) @@ -767,7 +768,7 @@ GEM rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) - websocket-driver (0.7.4) + websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) @@ -837,6 +838,7 @@ DEPENDENCIES hashie http_accept_language i18n-tasks + i18n_data iban-tools image_processing json_schemer diff --git a/app/controllers/admin/instructeurs_controller.rb b/app/controllers/admin/instructeurs_controller.rb deleted file mode 100644 index 1f549756c..000000000 --- a/app/controllers/admin/instructeurs_controller.rb +++ /dev/null @@ -1,63 +0,0 @@ -class Admin::InstructeursController < AdminController - include SmartListing::Helper::ControllerExtensions - helper SmartListing::Helper - - def index - @instructeurs = smart_listing_create :instructeurs, - current_administrateur.instructeurs, - partial: "admin/instructeurs/list", - array: true - end - - def create - email = params[:instructeur][:email].downcase - @instructeur = Instructeur.by_email(email) - procedure_id = params[:procedure_id] - procedure = Procedure.find_by(id: procedure_id) - - if @instructeur.nil? - invite_instructeur(email) - else - assign_instructeur! - end - - if procedure_id.present? - redirect_to admin_procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur) - else - redirect_to admin_instructeurs_path - end - end - - def destroy - Instructeur.find(params[:id]).administrateurs.delete current_administrateur - redirect_to admin_instructeurs_path - end - - private - - def invite_instructeur(email) - user = User.create_or_promote_to_instructeur( - email, - SecureRandom.hex, - administrateurs: [current_administrateur] - ) - - if user.valid? - user.invite! - - flash.notice = 'Instructeur ajouté' - else - flash.alert = user.errors.full_messages - end - end - - def assign_instructeur! - if current_administrateur.instructeurs.include?(@instructeur) - flash.alert = 'Instructeur déjà ajouté' - else - @instructeur.administrateurs.push current_administrateur - flash.notice = 'Instructeur ajouté' - # TODO Mailer no assign_to - end - end -end diff --git a/app/controllers/admin/procedures_controller.rb b/app/controllers/admin/procedures_controller.rb deleted file mode 100644 index 3193ceb7d..000000000 --- a/app/controllers/admin/procedures_controller.rb +++ /dev/null @@ -1,147 +0,0 @@ -class Admin::ProceduresController < AdminController - include SmartListing::Helper::ControllerExtensions - helper SmartListing::Helper - - before_action :retrieve_procedure, only: [:show, :delete_logo, :delete_deliberation, :delete_notice, :publish_validate, :publish] - - def index - if current_administrateur.procedures.count != 0 - @procedures = smart_listing_create :procedures, - current_administrateur.procedures.publiees.order(published_at: :desc), - partial: "admin/procedures/list", - array: true - - active_class - else - redirect_to new_from_existing_admin_procedures_path - end - end - - def show - if @procedure.brouillon? - @procedure_lien = commencer_test_url(path: @procedure.path) - else - @procedure_lien = commencer_url(path: @procedure.path) - end - @procedure.path = @procedure.suggested_path(current_administrateur) - @current_administrateur = current_administrateur - end - - def destroy - procedure = current_administrateur.procedures.find(params[:id]) - - if procedure.can_be_deleted_by_administrateur? - procedure.discard_and_keep_track!(current_administrateur) - - flash.notice = 'Démarche supprimée' - redirect_to admin_procedures_draft_path - else - render json: {}, status: 403 - end - end - - def archive - procedure = current_administrateur.procedures.find(params[:procedure_id]) - procedure.close! - - flash.notice = "Démarche close" - redirect_to admin_procedures_path - - rescue ActiveRecord::RecordNotFound - flash.alert = 'Démarche inexistante' - redirect_to admin_procedures_path - end - - def clone - procedure = Procedure.find(params[:procedure_id]) - new_procedure = procedure.clone(current_administrateur, cloned_from_library?) - - if new_procedure.valid? - flash.notice = 'Démarche clonée' - redirect_to edit_admin_procedure_path(id: new_procedure.id) - else - if cloned_from_library? - flash.alert = new_procedure.errors.full_messages - redirect_to new_from_existing_admin_procedures_path - else - flash.alert = new_procedure.errors.full_messages - redirect_to admin_procedures_path - end - end - - rescue ActiveRecord::RecordNotFound - flash.alert = 'Démarche inexistante' - redirect_to admin_procedures_path - end - - SIGNIFICANT_DOSSIERS_THRESHOLD = 30 - - def new_from_existing - significant_procedure_ids = Procedure - .publiees_ou_closes - .joins(:dossiers) - .group("procedures.id") - .having("count(dossiers.id) >= ?", SIGNIFICANT_DOSSIERS_THRESHOLD) - .pluck('procedures.id') - - @grouped_procedures = Procedure - .includes(:administrateurs, :service) - .where(id: significant_procedure_ids) - .group_by(&:organisation_name) - .sort_by { |_, procedures| procedures.first.created_at } - render layout: 'application' - end - - def active_class - @active_class = 'active' - end - - def archived_class - @archived_class = 'active' - end - - def draft_class - @draft_class = 'active' - end - - def delete_logo - @procedure.logo.purge_later - - flash.notice = 'le logo a bien été supprimé' - redirect_to edit_admin_procedure_path(@procedure) - end - - def delete_deliberation - @procedure.deliberation.purge_later - - flash.notice = 'la délibération a bien été supprimée' - redirect_to edit_admin_procedure_path(@procedure) - end - - def delete_notice - @procedure.notice.purge_later - - flash.notice = 'la notice a bien été supprimée' - redirect_to edit_admin_procedure_path(@procedure) - end - - private - - def cloned_from_library? - params[:from_new_from_existing].present? - end - - def publish_params - params.permit(:path, :lien_site_web) - end - - def procedure_params - editable_params = [:libelle, :description, :organisation, :direction, :lien_site_web, :cadre_juridique, :deliberation, :notice, :web_hook_url, :euro_flag, :logo, :auto_archive_on] - permited_params = if @procedure&.locked? - params.require(:procedure).permit(*editable_params) - else - params.require(:procedure).permit(*editable_params, :duree_conservation_dossiers_dans_ds, :duree_conservation_dossiers_hors_ds, :for_individual, :path) - end - permited_params - end -end diff --git a/app/controllers/api/pays_controller.rb b/app/controllers/api/pays_controller.rb new file mode 100644 index 000000000..b64359281 --- /dev/null +++ b/app/controllers/api/pays_controller.rb @@ -0,0 +1,20 @@ +class API::PaysController < ApplicationController + before_action :authenticate_logged_user! + + def index + countries = I18nData.countries('FR').zip(I18nData.countries(I18n.locale)) + countries = countries.map do |(code, value_fr), (localized_code, localized_value)| + if code != localized_code + raise "Countries lists mismatch. It means i18n_data gem has some internal inconsistencies." + end + + { + code: code, + value: value_fr, + label: localized_value + } + end + + render json: countries + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e0322e717..399ec9171 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -78,6 +78,9 @@ class ApplicationController < ActionController::Base def set_locale(locale) if locale && locale.to_sym.in?(I18n.available_locales) cookies[:locale] = locale + if user_signed_in? + current_user.update(locale: locale) + end locale end end @@ -322,6 +325,7 @@ class ApplicationController < ActionController::Base def switch_locale(&action) locale = extract_locale_from_query_params || extract_locale_from_cookie || + extract_locale_from_user || extract_locale_from_accept_language_header || I18n.default_locale @@ -332,6 +336,10 @@ class ApplicationController < ActionController::Base set_locale(request.query_parameters[:locale]) end + def extract_locale_from_user + current_user&.locale + end + def extract_locale_from_cookie cookies[:locale] end diff --git a/app/controllers/new_administrateur/procedures_controller.rb b/app/controllers/new_administrateur/procedures_controller.rb index 1e5a07877..97616ce8c 100644 --- a/app/controllers/new_administrateur/procedures_controller.rb +++ b/app/controllers/new_administrateur/procedures_controller.rb @@ -52,6 +52,23 @@ module NewAdministrateur @procedure ||= Procedure.new(for_individual: true) end + SIGNIFICANT_DOSSIERS_THRESHOLD = 30 + + def new_from_existing + significant_procedure_ids = Procedure + .publiees_ou_closes + .joins(:dossiers) + .group("procedures.id") + .having("count(dossiers.id) >= ?", SIGNIFICANT_DOSSIERS_THRESHOLD) + .pluck('procedures.id') + + @grouped_procedures = Procedure + .includes(:administrateurs, :service) + .where(id: significant_procedure_ids) + .group_by(&:organisation_name) + .sort_by { |_, procedures| procedures.first.created_at } + end + def show @procedure = current_administrateur.procedures.find(params[:id]) @current_administrateur = current_administrateur @@ -93,6 +110,40 @@ module NewAdministrateur end end + def clone + procedure = Procedure.find(params[:procedure_id]) + new_procedure = procedure.clone(current_administrateur, cloned_from_library?) + + if new_procedure.valid? + flash.notice = 'Démarche clonée' + redirect_to edit_admin_procedure_path(id: new_procedure.id) + else + if cloned_from_library? + flash.alert = new_procedure.errors.full_messages + redirect_to new_from_existing_admin_procedures_path + else + flash.alert = new_procedure.errors.full_messages + redirect_to admin_procedures_path + end + end + + rescue ActiveRecord::RecordNotFound + flash.alert = 'Démarche inexistante' + redirect_to admin_procedures_path + end + + def archive + procedure = current_administrateur.procedures.find(params[:procedure_id]) + procedure.close! + + flash.notice = "Démarche close" + redirect_to admin_procedures_path + + rescue ActiveRecord::RecordNotFound + flash.alert = 'Démarche inexistante' + redirect_to admin_procedures_path + end + def destroy procedure = current_administrateur.procedures.find(params[:id]) @@ -219,5 +270,9 @@ module NewAdministrateur def allow_decision_access_params params.require(:experts_procedure).permit(:allow_decision_access) end + + def cloned_from_library? + params[:from_new_from_existing].present? + end end end diff --git a/app/javascript/components/ComboPaysSearch.jsx b/app/javascript/components/ComboPaysSearch.jsx index 7bddae9f9..22b1cdcd6 100644 --- a/app/javascript/components/ComboPaysSearch.jsx +++ b/app/javascript/components/ComboPaysSearch.jsx @@ -12,7 +12,7 @@ function ComboPaysSearch(params) { hiddenFieldId={params.hiddenFieldId} scope="pays" minimumInputLength={0} - transformResult={({ nom }) => [nom, nom]} + transformResult={({ code, value, label }) => [code, value, label]} /> ); diff --git a/app/javascript/components/ComboSearch.jsx b/app/javascript/components/ComboSearch.jsx index a257181a4..5bcf4d559 100644 --- a/app/javascript/components/ComboSearch.jsx +++ b/app/javascript/components/ComboSearch.jsx @@ -47,6 +47,10 @@ function ComboSearch({ const [debouncedSearchTerm] = useDebounce(searchTerm, 300); const [value, setValue] = useState(initialValue); const resultsMap = useRef({}); + const getLabel = (result) => { + const [, value, label] = transformResult(result); + return label ?? value; + }; const setExternalValue = useCallback( (value) => { if (hiddenValueField) { @@ -64,8 +68,8 @@ function ComboSearch({ }, [hiddenIdField] ); - const setExternalValueAndId = useCallback((value) => { - const [key, result] = resultsMap.current[value]; + const setExternalValueAndId = useCallback((label) => { + const { key, value, result } = resultsMap.current[label]; setExternalId(key); setExternalValue(value); if (onChange) { @@ -107,9 +111,9 @@ function ComboSearch({ const onBlur = useCallback(() => { if (!allowInputValues && isSuccess && results[0]) { - const [, value] = transformResult(results[0]); + const label = getLabel(results[0]); awaitFormSubmit(() => { - handleOnSelect(value); + handleOnSelect(label); }); } }, [data]); @@ -129,13 +133,14 @@ function ComboSearch({ {results.length > 0 ? ( {results.map((result, index) => { - const [key, str] = transformResult(result); - resultsMap.current[str] = [key, result]; + const label = getLabel(result); + const [key, value] = transformResult(result); + resultsMap.current[label] = { key, value, result }; return ( ); })} diff --git a/app/javascript/components/MapEditor/index.jsx b/app/javascript/components/MapEditor/index.jsx index 12a2f0a67..20fa26dd4 100644 --- a/app/javascript/components/MapEditor/index.jsx +++ b/app/javascript/components/MapEditor/index.jsx @@ -44,16 +44,11 @@ function MapEditor({ featureCollection, url, options, preview }) { enabled: !preview, cadastreEnabled }); - const { - style, - layers, - setStyle, - setLayerEnabled, - setLayerOpacity - } = useMapStyle(options.layers, { - onStyleChange, - cadastreEnabled - }); + const { style, layers, setStyle, setLayerEnabled, setLayerOpacity } = + useMapStyle(options.layers, { + onStyleChange, + cadastreEnabled + }); if (!isSupported) { return ( diff --git a/app/javascript/components/MapEditor/useMapboxEditor.js b/app/javascript/components/MapEditor/useMapboxEditor.js index aa2bd7f0b..bc875b344 100644 --- a/app/javascript/components/MapEditor/useMapboxEditor.js +++ b/app/javascript/components/MapEditor/useMapboxEditor.js @@ -133,25 +133,20 @@ export function useMapboxEditor( ); const addEventListeners = useCallback((events) => { - const unsubscribe = Object.entries( - events - ).map(([eventName, [target, callback]]) => - addEventListener(eventName, target, callback) + const unsubscribe = Object.entries(events).map( + ([eventName, [target, callback]]) => + addEventListener(eventName, target, callback) ); return () => unsubscribe.map((unsubscribe) => unsubscribe()); }, []); - const { - createFeatures, - updateFeatures, - deleteFeatures, - ...props - } = useFeatureCollection(featureCollection, { - url, - enabled: isSupported && enabled, - addFeatures, - removeFeatures - }); + const { createFeatures, updateFeatures, deleteFeatures, ...props } = + useFeatureCollection(featureCollection, { + url, + enabled: isSupported && enabled, + addFeatures, + removeFeatures + }); const onStyleChange = useCallback(() => { if (mapRef.current) { diff --git a/app/javascript/components/MapReader/index.jsx b/app/javascript/components/MapReader/index.jsx index 2d245b046..b20dde570 100644 --- a/app/javascript/components/MapReader/index.jsx +++ b/app/javascript/components/MapReader/index.jsx @@ -13,20 +13,10 @@ import { useMapbox } from './useMapbox'; const Mapbox = ReactMapboxGl({}); const MapReader = ({ featureCollection, options }) => { - const { - isSupported, - onLoad, - onStyleChange, - onMouseEnter, - onMouseLeave - } = useMapbox(featureCollection); - const { - style, - layers, - setStyle, - setLayerEnabled, - setLayerOpacity - } = useMapStyle(options.layers, { onStyleChange }); + const { isSupported, onLoad, onStyleChange, onMouseEnter, onMouseLeave } = + useMapbox(featureCollection); + const { style, layers, setStyle, setLayerEnabled, setLayerOpacity } = + useMapStyle(options.layers, { onStyleChange }); if (!isSupported) { return ( diff --git a/app/javascript/components/shared/FlashMessage.jsx b/app/javascript/components/shared/FlashMessage.jsx index fb12c7ccd..027b1c709 100644 --- a/app/javascript/components/shared/FlashMessage.jsx +++ b/app/javascript/components/shared/FlashMessage.jsx @@ -1,5 +1,6 @@ import React from 'react'; import { createPortal } from 'react-dom'; +import PropTypes from 'prop-types'; export function FlashMessage({ message, level, sticky, fixed }) { return createPortal( @@ -22,3 +23,10 @@ function flashClassName(level, sticky = false, fixed = false) { } return className.join(' '); } + +FlashMessage.propTypes = { + message: PropTypes.string, + level: PropTypes.string, + sticky: PropTypes.bool, + fixed: PropTypes.bool +}; diff --git a/app/javascript/components/shared/mapbox/styles/base.js b/app/javascript/components/shared/mapbox/styles/base.js index 172187d57..8e7ecd0e1 100644 --- a/app/javascript/components/shared/mapbox/styles/base.js +++ b/app/javascript/components/shared/mapbox/styles/base.js @@ -198,23 +198,16 @@ export default { sources: { 'decoupage-administratif': { type: 'vector', - url: - 'https://openmaptiles.geo.data.gouv.fr/data/decoupage-administratif.json' + url: 'https://openmaptiles.geo.data.gouv.fr/data/decoupage-administratif.json' }, openmaptiles: { type: 'vector', url: 'https://openmaptiles.geo.data.gouv.fr/data/france-vector.json' }, - 'photographies-aeriennes': { - type: 'raster', - tiles: [ - 'https://tiles.geo.api.gouv.fr/photographies-aeriennes/tiles/{z}/{x}/{y}' - ], - tileSize: 256, - attribution: 'Images aériennes © IGN', - minzoom: 0, - maxzoom: 19 - }, + 'photographies-aeriennes': rasterSource( + [ignServiceURL('ORTHOIMAGERY.ORTHOPHOTOS', 'image/jpeg')], + 'IGN-F/Géoportail' + ), cadastre: { type: 'vector', url: 'https://openmaptiles.geo.data.gouv.fr/data/cadastre.json' diff --git a/app/javascript/components/shared/queryClient.js b/app/javascript/components/shared/queryClient.js index 5971b99c2..9ec274d87 100644 --- a/app/javascript/components/shared/queryClient.js +++ b/app/javascript/components/shared/queryClient.js @@ -55,7 +55,7 @@ function buildOptions() { async function defaultQueryFn({ queryKey: [scope, term] }) { if (scope == 'pays') { - return matchSorter(await getPays(), term, { keys: ['nom'] }); + return matchSorter(await getPays(), term, { keys: ['label'] }); } const url = buildURL(scope, term); @@ -73,7 +73,7 @@ async function defaultQueryFn({ queryKey: [scope, term] }) { let paysCache; async function getPays() { if (!paysCache) { - paysCache = await fetch('/pays.json').then((response) => response.json()); + paysCache = await fetch('/api/pays').then((response) => response.json()); } return paysCache; } diff --git a/app/javascript/new_design/dossiers/auto-save.js b/app/javascript/new_design/dossiers/auto-save.js index d51bd1dda..1db6f8a25 100644 --- a/app/javascript/new_design/dossiers/auto-save.js +++ b/app/javascript/new_design/dossiers/auto-save.js @@ -64,7 +64,7 @@ addEventListener('autosave:end', () => { addEventListener('autosave:error', (event) => { let error = event.detail; - if (error.xhr.status == 401) { + if (error.xhr && error.xhr.status == 401) { // If we are unauthenticated, reload the page using a GET request. // This will allow Devise to properly redirect us to sign-in, and then back to this page. document.location.reload(); diff --git a/app/javascript/new_design/dossiers/auto-upload-controller.js b/app/javascript/new_design/dossiers/auto-upload-controller.js index 84e5f594b..8e022e415 100644 --- a/app/javascript/new_design/dossiers/auto-upload-controller.js +++ b/app/javascript/new_design/dossiers/auto-upload-controller.js @@ -99,9 +99,8 @@ export default class AutoUploadController { } _hideErrorMessage() { - let errorElement = this.input.parentElement.querySelector( - '.attachment-error' - ); + let errorElement = + this.input.parentElement.querySelector('.attachment-error'); if (errorElement) { hide(errorElement); } diff --git a/app/mailers/dossier_mailer.rb b/app/mailers/dossier_mailer.rb index cb1f8f772..4be072ee7 100644 --- a/app/mailers/dossier_mailer.rb +++ b/app/mailers/dossier_mailer.rb @@ -5,61 +5,73 @@ class DossierMailer < ApplicationMailer helper ProcedureHelper layout 'mailers/layout' + default from: NO_REPLY_EMAIL def notify_new_draft(dossier) - @dossier = dossier - @service = dossier.procedure.service - @logo_url = attach_logo(dossier.procedure) + I18n.with_locale(dossier.user_locale) do + @dossier = dossier + @service = dossier.procedure.service + @logo_url = attach_logo(dossier.procedure) + @subject = default_i18n_subject(libelle_demarche: dossier.procedure.libelle) - subject = "Retrouvez votre brouillon pour la démarche « #{dossier.procedure.libelle} »" - - mail(from: NO_REPLY_EMAIL, to: dossier.user_email_for(:notification), subject: subject) do |format| - format.html { render layout: 'mailers/notifications_layout' } + mail(to: dossier.user_email_for(:notification), subject: @subject) do |format| + format.html { render layout: 'mailers/notifications_layout' } + end end end def notify_new_answer(dossier, body = nil) - @dossier = dossier - @service = dossier.procedure.service - @logo_url = attach_logo(dossier.procedure) - @body = body + I18n.with_locale(dossier.user_locale) do + @dossier = dossier + @service = dossier.procedure.service + @logo_url = attach_logo(dossier.procedure) + @body = body + @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) - subject = "Nouveau message pour votre dossier nº #{dossier.id} (#{dossier.procedure.libelle})" - - mail(from: NO_REPLY_EMAIL, to: dossier.user_email_for(:notification), subject: subject) do |format| - format.html { render layout: 'mailers/notifications_layout' } + mail(to: dossier.user_email_for(:notification), subject: @subject) do |format| + format.html { render layout: 'mailers/notifications_layout' } + end end end def notify_new_commentaire_to_instructeur(dossier, instructeur_email) - @dossier = dossier - @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) - mail(from: NO_REPLY_EMAIL, to: instructeur_email, subject: @subject) + I18n.with_locale(dossier.user_locale) do + @dossier = dossier + @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) + + mail(to: instructeur_email, subject: @subject) + end end def notify_new_dossier_depose_to_instructeur(dossier, instructeur_email) - @dossier = dossier - @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) - mail(from: NO_REPLY_EMAIL, to: instructeur_email, subject: @subject) + I18n.with_locale(dossier.user_locale) do + @dossier = dossier + @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) + + mail(to: instructeur_email, subject: @subject) + end end def notify_revert_to_instruction(dossier) - @dossier = dossier - @service = dossier.procedure.service - @logo_url = attach_logo(dossier.procedure) + I18n.with_locale(dossier.user_locale) do + @dossier = dossier + @service = dossier.procedure.service + @logo_url = attach_logo(dossier.procedure) + @subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle) - subject = "Votre dossier nº #{@dossier.id} est en train d’être réexaminé" - - mail(from: NO_REPLY_EMAIL, to: dossier.user_email_for(:notification), subject: subject) do |format| - format.html { render layout: 'mailers/notifications_layout' } + mail(to: dossier.user_email_for(:notification), subject: @subject) do |format| + format.html { render layout: 'mailers/notifications_layout' } + end end end def notify_brouillon_near_deletion(dossiers, to_email) - @subject = default_i18n_subject(count: dossiers.count) - @dossiers = dossiers + I18n.with_locale(dossiers.first.user_locale) do + @subject = default_i18n_subject(count: dossiers.count) + @dossiers = dossiers - mail(to: to_email, subject: @subject) + mail(to: to_email, subject: @subject) + end end def notify_brouillon_deletion(dossier_hashes, to_email) @@ -70,24 +82,21 @@ class DossierMailer < ApplicationMailer end def notify_deletion_to_user(deleted_dossier, to_email) - @subject = default_i18n_subject(dossier_id: deleted_dossier.dossier_id) - @deleted_dossier = deleted_dossier + I18n.with_locale(deleted_dossier.user_locale) do + @subject = default_i18n_subject(dossier_id: deleted_dossier.dossier_id) + @deleted_dossier = deleted_dossier - mail(to: to_email, subject: @subject) + mail(to: to_email, subject: @subject) + end end def notify_instructeur_deletion_to_user(deleted_dossier, to_email) - @subject = default_i18n_subject(libelle_demarche: deleted_dossier.procedure.libelle) - @deleted_dossier = deleted_dossier + I18n.with_locale(deleted_dossier.user_locale) do + @subject = default_i18n_subject(libelle_demarche: deleted_dossier.procedure.libelle) + @deleted_dossier = deleted_dossier - mail(to: to_email, subject: @subject) - end - - def notify_instructeur(deleted_dossier, to_email) - @subject = default_i18n_subject(dossier_id: deleted_dossier.dossier_id) - @deleted_dossier = deleted_dossier - - mail(to: to_email, subject: @subject) + mail(to: to_email, subject: @subject) + end end def notify_deletion_to_administration(deleted_dossier, to_email) @@ -98,11 +107,13 @@ class DossierMailer < ApplicationMailer end def notify_automatic_deletion_to_user(deleted_dossiers, to_email) - @state = deleted_dossiers.first.state - @subject = default_i18n_subject(count: deleted_dossiers.count) - @deleted_dossiers = deleted_dossiers + I18n.with_locale(deleted_dossiers.first.user_locale) do + @state = deleted_dossiers.first.state + @subject = default_i18n_subject(count: deleted_dossiers.count) + @deleted_dossiers = deleted_dossiers - mail(to: to_email, subject: @subject) + mail(to: to_email, subject: @subject) + end end def notify_automatic_deletion_to_administration(deleted_dossiers, to_email) @@ -113,11 +124,13 @@ class DossierMailer < ApplicationMailer end def notify_near_deletion_to_user(dossiers, to_email) - @state = dossiers.first.state - @subject = default_i18n_subject(count: dossiers.count, state: @state) - @dossiers = dossiers + I18n.with_locale(dossiers.first.user_locale) do + @state = dossiers.first.state + @subject = default_i18n_subject(count: dossiers.count, state: @state) + @dossiers = dossiers - mail(to: to_email, subject: @subject) + mail(to: to_email, subject: @subject) + end end def notify_near_deletion_to_administration(dossiers, to_email) @@ -129,18 +142,19 @@ class DossierMailer < ApplicationMailer end def notify_groupe_instructeur_changed(instructeur, dossier) - @subject = "Un dossier a changé de groupe instructeur" - @dossier_id = dossier.id - @demarche = dossier.procedure.libelle + @subject = default_i18n_subject(dossier_id: dossier.id) + @dossier = dossier - mail(from: NO_REPLY_EMAIL, to: instructeur.email, subject: @subject) + mail(to: instructeur.email, subject: @subject) end def notify_brouillon_not_submitted(dossier) - @subject = "Attention : votre dossier n’est pas déposé." - @dossier = dossier + I18n.with_locale(dossier.user_locale) do + @subject = default_i18n_subject(dossier_id: dossier.id) + @dossier = dossier - mail(to: dossier.user_email_for(:notification), subject: @subject) + mail(to: dossier.user_email_for(:notification), subject: @subject) + end end protected diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 056240dc2..d3c5324f1 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -22,7 +22,9 @@ class NotificationMailer < ApplicationMailer @logo_url = attach_logo(@dossier.procedure) @rendered_template = sanitize(@body) - mail(subject: @subject, to: @email, template_name: 'send_notification') + I18n.with_locale(@dossier.user_locale) do + mail(subject: @subject, to: @email, template_name: 'send_notification') + end end def self.send_en_construction_notification(dossier) @@ -53,12 +55,14 @@ class NotificationMailer < ApplicationMailer if @dossier.user_deleted? mail.perform_deliveries = false else - mail_template = @dossier.procedure.mail_template_for(params[:state]) + I18n.with_locale(@dossier.user_locale) do + mail_template = @dossier.procedure.mail_template_for(params[:state]) - @email = @dossier.user_email_for(:notification) - @subject = mail_template.subject_for_dossier(@dossier) - @body = mail_template.body_for_dossier(@dossier) - @actions = mail_template.actions_for_dossier(@dossier) + @email = @dossier.user_email_for(:notification) + @subject = mail_template.subject_for_dossier(@dossier) + @body = mail_template.body_for_dossier(@dossier) + @actions = mail_template.actions_for_dossier(@dossier) + end end end diff --git a/app/models/champs/linked_drop_down_list_champ.rb b/app/models/champs/linked_drop_down_list_champ.rb index 355f44442..157f4af89 100644 --- a/app/models/champs/linked_drop_down_list_champ.rb +++ b/app/models/champs/linked_drop_down_list_champ.rb @@ -41,7 +41,11 @@ class Champs::LinkedDropDownListChamp < Champ end def primary_value=(value) - pack_value(value, secondary_value) + if value.blank? + pack_value("", "") + else + pack_value(value, secondary_value) + end end def secondary_value=(value) diff --git a/app/models/champs/pays_champ.rb b/app/models/champs/pays_champ.rb index ba56eb3ee..04110d82f 100644 --- a/app/models/champs/pays_champ.rb +++ b/app/models/champs/pays_champ.rb @@ -18,4 +18,19 @@ # type_de_champ_id :integer # class Champs::PaysChamp < Champs::TextChamp + def localized_value + if external_id + I18nData.countries(I18n.locale)[external_id] + else + value.present? ? value.to_s : '' + end + end + + def to_s + localized_value + end + + def for_tag + localized_value + end end diff --git a/app/models/deleted_dossier.rb b/app/models/deleted_dossier.rb index 96a78acec..687ec9458 100644 --- a/app/models/deleted_dossier.rb +++ b/app/models/deleted_dossier.rb @@ -47,4 +47,8 @@ class DeletedDossier < ApplicationRecord def procedure_removed? reason == self.class.reasons.fetch(:procedure_removed) end + + def user_locale + User.find_by(id: user_id)&.locale || I18n.default_locale + end end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 3a1958cb3..e02866a3a 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -921,6 +921,10 @@ class Dossier < ApplicationRecord update_column(:api_entreprise_job_exceptions, exceptions) end + def user_locale + user&.locale || I18n.default_locale + end + private def defaut_groupe_instructeur? diff --git a/app/models/user.rb b/app/models/user.rb index 1e40adb85..9fde0c77d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -13,6 +13,7 @@ # failed_attempts :integer default(0), not null # last_sign_in_at :datetime # last_sign_in_ip :string +# locale :string # locked_at :datetime # loged_in_with_france_connect :string default(NULL) # remember_created_at :datetime diff --git a/app/views/admin/instructeurs/_informations.html.haml b/app/views/admin/instructeurs/_informations.html.haml deleted file mode 100644 index 34a4ea5e8..000000000 --- a/app/views/admin/instructeurs/_informations.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -.form-group - %p.notice - = 'Email *' - = text_field_tag 'instructeur[email]', nil, class: 'form-control', placeholder: 'ex : laura.azema@exemple.gouv.fr' diff --git a/app/views/admin/instructeurs/_list.html.haml b/app/views/admin/instructeurs/_list.html.haml deleted file mode 100644 index b1d8b2f66..000000000 --- a/app/views/admin/instructeurs/_list.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -- if smart_listing.present? - %table.table#liste-instructeur - %thead - %th#libelle= smart_listing.sortable 'Email', 'email' - %th - - - @instructeurs.each do |instructeur| - %tr - %td{ style: 'padding-top: 11px; font-size: 15px;' }= instructeur.email - %td{ style: 'text-align: right;' } - .delete.btn.btn-sm.fa.fa-trash - - .confirm - = link_to 'Valider', admin_instructeur_path(id: instructeur.id), { method: :delete, class: 'btn btn-sm btn-success' } - .cancel.btn.btn-sm.btn-danger.fa.fa-minus{ style: 'top: 0;' } - - = smart_listing.paginate - = smart_listing.pagination_per_page_links - -- else - %h4.center - Aucun instructeur diff --git a/app/views/admin/instructeurs/index.html.haml b/app/views/admin/instructeurs/index.html.haml deleted file mode 100644 index 1860442f6..000000000 --- a/app/views/admin/instructeurs/index.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -%h1 Instructeurs disponibles - -%p - Cette page vous permet de gérer la liste des instructeurs disponibles pour être affectés à une démarche. - -%p{ style: 'font-style: italic' } - N.B. : cette page ne concerne que la liste des personnes disponibles. Si vous souhaitez affecter ou enlever un instructeur d’une démarche particulière, - utilisez plutôt la - = link_to "page de la démarche", admin_procedures_path - concernée. - -.row - .col-xs-4 - - = smart_listing_render :instructeurs - .col-xs-1 -   - .col-xs-6 - %h3 Ajouter un instructeur - #procedure_new.section.section-label - = form_with url: { controller: 'admin/instructeurs', action: :create } do - .row - .col-xs-5 - = render partial: 'admin/instructeurs/informations' - .col-xs-2 - %br - %br - = submit_tag 'Ajouter', class: 'btn btn-info', style: 'float: left;' diff --git a/app/views/admin/instructeurs/index.js.erb b/app/views/admin/instructeurs/index.js.erb deleted file mode 100644 index 35f7cb74c..000000000 --- a/app/views/admin/instructeurs/index.js.erb +++ /dev/null @@ -1 +0,0 @@ -<%= smart_listing_update :instructeurs %> diff --git a/app/views/dossier_mailer/notify_groupe_instructeur_changed.html.haml b/app/views/dossier_mailer/notify_groupe_instructeur_changed.html.haml index c45087d0f..55eab2566 100644 --- a/app/views/dossier_mailer/notify_groupe_instructeur_changed.html.haml +++ b/app/views/dossier_mailer/notify_groupe_instructeur_changed.html.haml @@ -3,7 +3,7 @@ %p= t(:hello, scope: [:views, :shared, :greetings]) %p - = "Vous suiviez jusqu'à maintenant le dossier n°#{@dossier_id} de la démarche #{@demarche}." + = "Vous suiviez jusqu'à maintenant le dossier n° #{@dossier.id} de la démarche #{@dossier.procedure.libelle}." L’usager a modifié le groupe de routage. Son dossier appartient maintenant à un groupe instructeur dont vous ne faites pas partie. %p Suite à cette modification, vous ne suivez plus ce dossier. diff --git a/app/views/dossier_mailer/notify_new_answer.en.html.haml b/app/views/dossier_mailer/notify_new_answer.en.html.haml deleted file mode 100644 index 88ef43b79..000000000 --- a/app/views/dossier_mailer/notify_new_answer.en.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -- content_for :procedure_logo do - = render 'layouts/mailers/logo', url: @logo_url - -%p= t(:hello, scope: [:views, :shared, :greetings]) - -- if !@dossier.brouillon? - %p - You received - %strong a new message - from the service in charge of examine your File. - %p - To read the message and answer it, select the following link: - - = round_button('Read the message', messagerie_dossier_url(@dossier), :primary) -- else - %p - You received - %strong a new message - from the service in charge of examine the File you started a draft for on the procedure #{@dossier.procedure.libelle}. - %p{ style: "padding: 8px; color: #333333; background-color: #EEEEEE; font-size: 14px;" } - = @body - - %p - If you chose to contact the service, please use the email available below in the page. - - = round_button('Open the File', dossier_url(@dossier), :primary) - -= render 'layouts/mailers/signature', service: @service - -- content_for :footer do - = render 'layouts/mailers/service_footer', service: @service, dossier: @dossier diff --git a/app/views/dossier_mailer/notify_new_answer.html.haml b/app/views/dossier_mailer/notify_new_answer.html.haml index 932b6e4f1..28f26ca6f 100644 --- a/app/views/dossier_mailer/notify_new_answer.html.haml +++ b/app/views/dossier_mailer/notify_new_answer.html.haml @@ -4,25 +4,15 @@ %p= t(:hello, scope: [:views, :shared, :greetings]) - if !@dossier.brouillon? - %p - Vous avez reçu un - %strong nouveau message - de la part du service en charge de votre dossier. - %p - Pour consulter le message et y répondre, cliquez sur le bouton ci-dessous : - - = round_button('Lire le message', messagerie_dossier_url(@dossier), :primary) + %p= t('.body', libelle_demarche: @dossier.procedure.libelle) + %p= t('.link') + = round_button(t('.access_message'), messagerie_dossier_url(@dossier), :primary) - else - %p - Vous avez reçu un - %strong nouveau message - du service pour lequel votre dossier est en brouillon pour la démarche #{@dossier.procedure.libelle}. + %p= t('.body_draft', libelle_demarche: @dossier.procedure.libelle) %p{ style: "padding: 8px; color: #333333; background-color: #EEEEEE; font-size: 14px;" } = @body - - %p Si vous souhaitez contacter le service, merci de le faire directement à l'aide de l'email en bas de page. - - = round_button('Voir le dossier', dossier_url(@dossier), :primary) + %p= t('.contact') + = round_button(t('.access_file'), dossier_url(@dossier), :primary) = render 'layouts/mailers/signature', service: @service diff --git a/app/views/dossier_mailer/notify_new_draft.en.html.haml b/app/views/dossier_mailer/notify_new_draft.en.html.haml deleted file mode 100644 index 2c6e001b3..000000000 --- a/app/views/dossier_mailer/notify_new_draft.en.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -- content_for :procedure_logo do - = render 'layouts/mailers/logo', url: @logo_url - -%p= t(:hello, scope: [:views, :shared, :greetings]) - -%p - You started filling a File on the procedure: - = succeed '.' do - %strong « #{@dossier.procedure.libelle} » - -%p - You can access your File, to review or complete, by clicking on the following button: - -= round_button('Access your File', dossier_url(@dossier), :primary) - -- if @dossier.procedure.auto_archive_on - %p - Your File needs to be submitted before #{procedure_auto_archive_datetime(@dossier.procedure)}. - -= render 'layouts/mailers/signature' - -- content_for :footer do - = render 'layouts/mailers/service_footer', service: @service, dossier: @dossier diff --git a/app/views/dossier_mailer/notify_new_draft.html.haml b/app/views/dossier_mailer/notify_new_draft.html.haml index fdb341967..ee0219970 100644 --- a/app/views/dossier_mailer/notify_new_draft.html.haml +++ b/app/views/dossier_mailer/notify_new_draft.html.haml @@ -3,21 +3,12 @@ %p= t(:hello, scope: [:views, :shared, :greetings]) -%p - Vous avez commencé à remplir un dossier pour la démarche - = succeed '.' do - %strong « #{@dossier.procedure.libelle} » - -%p - Vous pouvez - %strong retrouver et compléter votre dossier - en cliquant sur le bouton ci-dessous: - -= round_button('Afficher votre dossier', dossier_url(@dossier), :primary) +%p= t('.body', libelle_demarche: @dossier.procedure.libelle) +%p= t('.link') += round_button(t('.access_file'), dossier_url(@dossier), :primary) - if @dossier.procedure.auto_archive_on - %p - Vous pouvez déposer votre dossier jusqu’au #{procedure_auto_archive_datetime(@dossier.procedure)}. + %p= t('.submit_before', before: procedure_auto_archive_datetime(@dossier.procedure)) = render 'layouts/mailers/signature' diff --git a/app/views/dossier_mailer/notify_revert_to_instruction.en.html.haml b/app/views/dossier_mailer/notify_revert_to_instruction.en.html.haml deleted file mode 100644 index 2f64e85ae..000000000 --- a/app/views/dossier_mailer/notify_revert_to_instruction.en.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -- content_for :procedure_logo do - = render 'layouts/mailers/logo', url: @logo_url - -%p= t(:hello, scope: [:views, :shared, :greetings]) - -%p - Your File will be reexamined. All previous decisions are void. - To see the File created on procedure - %strong= @dossier.procedure.libelle - , select the following link: - = link_to dossier_url(@dossier), dossier_url(@dossier), target: '_blank', rel: 'noopener' - -- if @dossier.procedure.service.present? - %p - In order to get more details about the decision to reexamin, please contact the following service: - = mail_to @dossier.procedure.service.email, @dossier.procedure.service.email - -= render 'layouts/mailers/signature' - -- content_for :footer do - = render 'layouts/mailers/service_footer', service: @service, dossier: @dossier diff --git a/app/views/dossier_mailer/notify_revert_to_instruction.html.haml b/app/views/dossier_mailer/notify_revert_to_instruction.html.haml index 0f75d8070..e8323b95c 100644 --- a/app/views/dossier_mailer/notify_revert_to_instruction.html.haml +++ b/app/views/dossier_mailer/notify_revert_to_instruction.html.haml @@ -4,15 +4,11 @@ %p= t(:hello, scope: [:views, :shared, :greetings]) %p - Votre dossier va être réexaminé, la précédente décision sur ce dossier est caduque. - Vous pouvez retrouver le dossier que vous avez créé pour la démarche - %strong= @dossier.procedure.libelle - à l'adresse suivante : + = t('.body', dossier_id: @dossier.id, libelle_demarche: @dossier.procedure.libelle) = link_to dossier_url(@dossier), dossier_url(@dossier), target: '_blank', rel: 'noopener' - if @dossier.procedure.service.present? %p - Pour obtenir le détail de cette modification de la décision, vous pouvez contacter par - email: + = t('.contact') = mail_to @dossier.procedure.service.email, @dossier.procedure.service.email = render 'layouts/mailers/signature' diff --git a/app/views/new_administrateur/procedures/_publication_form.html.haml b/app/views/new_administrateur/procedures/_publication_form.html.haml index d7f0c8f45..1af036c6a 100644 --- a/app/views/new_administrateur/procedures/_publication_form.html.haml +++ b/app/views/new_administrateur/procedures/_publication_form.html.haml @@ -17,7 +17,6 @@ class: 'form', pattern: '^[a-z0-9_-]{3,200}$', title: "De 3 à 200 caractères; minuscules, chiffres et tiret seulement", - data: { debounce: true, url: admin_procedure_publish_validate_path(procedure)}, autocomplete: 'off', style: 'width: 300px; display: inline;') .text-info.mb-4 diff --git a/app/views/admin/procedures/new_from_existing.html.haml b/app/views/new_administrateur/procedures/new_from_existing.html.haml similarity index 100% rename from app/views/admin/procedures/new_from_existing.html.haml rename to app/views/new_administrateur/procedures/new_from_existing.html.haml diff --git a/app/views/shared/dossiers/editable_champs/_pays.html.haml b/app/views/shared/dossiers/editable_champs/_pays.html.haml index 5a9ca2523..241049b46 100644 --- a/app/views/shared/dossiers/editable_champs/_pays.html.haml +++ b/app/views/shared/dossiers/editable_champs/_pays.html.haml @@ -1,3 +1,4 @@ - hidden_field_id = SecureRandom.uuid -= form.hidden_field :value, { data: { uuid: hidden_field_id } } += form.hidden_field :value, { value: champ.localized_value, data: { uuid: hidden_field_id } } += form.hidden_field :external_id, { data: { reference: true } } = react_component("ComboPaysSearch", mandatory: champ.mandatory?, hiddenFieldId: hidden_field_id) diff --git a/config/brakeman.ignore b/config/brakeman.ignore index 40404a3aa..bb1c24763 100644 --- a/config/brakeman.ignore +++ b/config/brakeman.ignore @@ -1,25 +1,5 @@ { "ignored_warnings": [ - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "25d6ed4f7f9120faf69596aa97d9e0558fd86817583b99b9b7879aff43ec2751", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/procedure_presentation.rb", - "line": 114, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "dossiers.with_type_de_champ_private(column).order(\"champs.value #{order}\")", - "render_path": null, - "location": { - "type": "method", - "class": "ProcedurePresentation", - "method": "sorted_ids" - }, - "user_input": "order", - "confidence": "Weak", - "note": "`table`, `column` and `order` come from the model, which is validated to prevent injection attacks. Furthermore, `table` and `column` are escaped." - }, { "warning_type": "Cross-Site Scripting", "warning_code": 2, @@ -51,26 +31,6 @@ "confidence": "Weak", "note": "" }, - { - "warning_type": "Redirect", - "warning_code": 18, - "fingerprint": "7e27a03f04576569601d7ec70bddd05c21c4f2de17448e6e093f76844c59e0a0", - "check_name": "Redirect", - "message": "Possible unprotected redirect", - "file": "app/controllers/instructeurs/procedures_controller.rb", - "line": 175, - "link": "https://brakemanscanner.org/docs/warning_types/redirect/", - "code": "redirect_to(Export.find_or_create_export(params[:export_format], (params[:time_span_type] or Export.time_span_types.fetch(:everything)), current_instructeur.groupe_instructeurs.where(:procedure => procedure)).file.service_url)", - "render_path": null, - "location": { - "type": "method", - "class": "Instructeurs::ProceduresController", - "method": "download_export" - }, - "user_input": "Export.find_or_create_export(params[:export_format], (params[:time_span_type] or Export.time_span_types.fetch(:everything)), current_instructeur.groupe_instructeurs.where(:procedure => procedure)).file.service_url", - "confidence": "High", - "note": "" - }, { "warning_type": "SQL Injection", "warning_code": 0, @@ -92,66 +52,26 @@ "note": "The table and column are escaped, which should make this safe" }, { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "d6031dd493ff36d62af2d75d0b1e4606c665413a62ef26a847902af4ad97d81f", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/procedure_presentation.rb", - "line": 109, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "dossiers.with_type_de_champ(column).order(\"champs.value #{order}\")", + "warning_type": "Redirect", + "warning_code": 18, + "fingerprint": "c46b5c9cd6474ffae789f39a2280ba6b5a5a74d3ffa8a38cf8a409f9a027ed0e", + "check_name": "Redirect", + "message": "Possible unprotected redirect", + "file": "app/controllers/instructeurs/procedures_controller.rb", + "line": 180, + "link": "https://brakemanscanner.org/docs/warning_types/redirect/", + "code": "redirect_to(Export.find_or_create_export(params[:export_format], (params[:time_span_type] or \"everything\"), current_instructeur.groupe_instructeurs.where(:procedure => procedure)).file.service_url)", "render_path": null, "location": { "type": "method", - "class": "ProcedurePresentation", - "method": "sorted_ids" + "class": "Instructeurs::ProceduresController", + "method": "download_export" }, - "user_input": "order", - "confidence": "Weak", - "note": "`table`, `column` and `order` come from the model, which is validated to prevent injection attacks. Furthermore, `table` and `column` are escaped." - }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "e6f09095e3d381bcf6280d2f9b06c239946be3e440330136934f34611bc2b2d9", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/procedure_presentation.rb", - "line": 127, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "((\"self\" == \"self\") ? (dossiers) : (dossiers.includes(\"self\"))).order(\"#{self.class.sanitized_column(\"self\", column)} #{order}\")", - "render_path": null, - "location": { - "type": "method", - "class": "ProcedurePresentation", - "method": "sorted_ids" - }, - "user_input": "self.class.sanitized_column(\"self\", column)", - "confidence": "Weak", - "note": "`table`, `column` and `order` come from the model, which is validated to prevent injection attacks. Furthermore, `table` and `column` are escaped." - }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "fd9d738975ccb93c8915833fceb3f43ac35410d653b8c64a1c92c1afc36d2177", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/procedure_presentation.rb", - "line": 122, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "dossiers.includes(:followers_instructeurs).joins(\"LEFT OUTER JOIN users instructeurs_users ON instructeurs_users.instructeur_id = instructeurs.id\").order(\"instructeurs_users.email #{order}\")", - "render_path": null, - "location": { - "type": "method", - "class": "ProcedurePresentation", - "method": "sorted_ids" - }, - "user_input": "order", - "confidence": "Weak", - "note": "`table`, `column` and `order` come from the model, which is validated to prevent injection attacks. Furthermore, `table` and `column` are escaped." + "user_input": "Export.find_or_create_export(params[:export_format], (params[:time_span_type] or \"everything\"), current_instructeur.groupe_instructeurs.where(:procedure => procedure)).file.service_url", + "confidence": "High", + "note": "" } ], - "updated": "2021-06-17 09:26:40 +0200", - "brakeman_version": "5.0.0" + "updated": "2021-09-02 16:12:11 -0500", + "brakeman_version": "5.1.1" } diff --git a/config/locales/en.yml b/config/locales/en.yml index 17244f9b8..8597383b1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -202,6 +202,19 @@ en: connection: Sign in are_you_new: First time on %{app_name}? find_procedure: Find your procedure + password: + reset_link_sent: + got_it: Got it! + open_your_mailbox: Now open your mailbox. + email_sent_html: We have sent you an email to the address %{email}. + click_link_to_reset_password: Click on the link in the email to change your password. + no_mail: Didn't receive the email? + check_spams: Check your junk or spam email. + check_account: Have you created a %{application_name} account with the adress %{email}? You will not receive any message if no account is linked to your email adress. + check_france_connect_html: Have you once logged in with France Connect? If yes, try again with France Connect. + shared: + email_can_take_a_while_html: Please note that this message can take up to 15 minutes to arrive. + contact_us_if_any_trouble_html: You can contact us through this form if a problem still exists. modal: publish: title: diff --git a/config/locales/views/dossier_mailer/notify_brouillon_not_submitted/fr.yml b/config/locales/views/dossier_mailer/notify_brouillon_not_submitted/fr.yml new file mode 100644 index 000000000..78ee3eae0 --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_brouillon_not_submitted/fr.yml @@ -0,0 +1,4 @@ +fr: + dossier_mailer: + notify_brouillon_not_submitted: + subject: "Attention : votre dossier nº %{dossier_id} n’est pas déposé" diff --git a/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml b/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml new file mode 100644 index 000000000..541d2607d --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml @@ -0,0 +1,4 @@ +fr: + dossier_mailer: + notify_groupe_instructeur_changed: + subject: Le dossier nº %{dossier_id} a changé de groupe instructeur diff --git a/config/locales/views/dossier_mailer/notify_new_answer/en.yml b/config/locales/views/dossier_mailer/notify_new_answer/en.yml new file mode 100644 index 000000000..5184b1c71 --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_new_answer/en.yml @@ -0,0 +1,13 @@ +fr: + dossier_mailer: + notify_new_answer: + subject: New message on your file nº %{dossier_id} « %{libelle_demarche} » + body_html: | + You received a new message from the service in charge of reviewing your file on « %{libelle_demarche} ». + link: | + To read the message and answer it, select the following link: + body_draft_html: | + You received a new message from the service in charge of reviewing the file you started a draft for on the procedure « %{libelle_demarche} ». + contact: If you chose to contact the service, please use the email available below in the page. + access_message: Read the message + access_file: Open file diff --git a/config/locales/views/dossier_mailer/notify_new_answer/fr.yml b/config/locales/views/dossier_mailer/notify_new_answer/fr.yml new file mode 100644 index 000000000..334ed7fad --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_new_answer/fr.yml @@ -0,0 +1,13 @@ +fr: + dossier_mailer: + notify_new_answer: + subject: Nouveau message pour votre dossier nº %{dossier_id} « %{libelle_demarche} » + body_html: | + Vous avez reçu un nouveau message de la part du service en charge de votre dossier. + link: | + Pour consulter le message et y répondre, cliquez sur le bouton ci-dessous : + body_draft_html: | + Vous avez reçu un nouveau messagedu service pour lequel votre dossier est en brouillon pour la démarche « %{libelle_demarche} ». + contact: Si vous souhaitez contacter le service, merci de le faire directement à l'aide de l'email en bas de page. + access_message: Lire le message + access_file: Voir le dossier diff --git a/config/locales/views/dossier_mailer/notify_new_dossier_depose_to_instructeur/fr.yml b/config/locales/views/dossier_mailer/notify_new_dossier_depose_to_instructeur/fr.yml index 736475042..967ae13eb 100644 --- a/config/locales/views/dossier_mailer/notify_new_dossier_depose_to_instructeur/fr.yml +++ b/config/locales/views/dossier_mailer/notify_new_dossier_depose_to_instructeur/fr.yml @@ -1,5 +1,5 @@ fr: dossier_mailer: notify_new_dossier_depose_to_instructeur: - subject: Nouveau dossier déposé pour la démarche %{libelle_demarche} - body: Un nouveau dossier a été déposé (n° %{dossier_id}) pour la démarche %{libelle_demarche} + subject: Nouveau dossier déposé pour la démarche « %{libelle_demarche} » + body: Un nouveau dossier a été déposé (n° %{dossier_id}) pour la démarche « %{libelle_demarche} » diff --git a/config/locales/views/dossier_mailer/notify_new_draft/en.yml b/config/locales/views/dossier_mailer/notify_new_draft/en.yml new file mode 100644 index 000000000..95c3f766a --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_new_draft/en.yml @@ -0,0 +1,10 @@ +en: + dossier_mailer: + notify_new_draft: + subject: Draft file created on procedure « %{libelle_demarche} » + body_html: | + You created a draft file on procedure « %{libelle_demarche} ». + link_html: | + You can access your file, to review or complete, by clicking on the following button: + submit_before: Your file needs to be submitted before %{before} + access_file: Open file diff --git a/config/locales/views/dossier_mailer/notify_new_draft/fr.yml b/config/locales/views/dossier_mailer/notify_new_draft/fr.yml new file mode 100644 index 000000000..6fc4bad51 --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_new_draft/fr.yml @@ -0,0 +1,10 @@ +fr: + dossier_mailer: + notify_new_draft: + subject: Retrouvez votre brouillon pour la démarche « %{libelle_demarche} » + body_html: | + Vous avez commencé à remplir un dossier pour la démarche « %{libelle_demarche} ». + link_html: | + Vous pouvez retrouver et compléter votre dossier en cliquant sur le bouton ci-dessous : + submit_before: Vous pouvez déposer votre dossier jusqu’au %{before}. + access_file: Afficher votre dossier diff --git a/config/locales/views/dossier_mailer/notify_revert_to_instruction/en.yml b/config/locales/views/dossier_mailer/notify_revert_to_instruction/en.yml new file mode 100644 index 000000000..6f820beeb --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_revert_to_instruction/en.yml @@ -0,0 +1,9 @@ +en: + dossier_mailer: + notify_revert_to_instruction: + subject: Your file nº %{dossier_id} « %{libelle_demarche} » will be reexamined + body_html: | + Your file nº %{dossier_id} will be reexamined. All previous decisions are void. + To see the file created on procedure « %{libelle_demarche} », select the following link: + contact: | + In order to get more details about the decision to reexamin, please contact the following service: diff --git a/config/locales/views/dossier_mailer/notify_revert_to_instruction/fr.yml b/config/locales/views/dossier_mailer/notify_revert_to_instruction/fr.yml new file mode 100644 index 000000000..bf26477c2 --- /dev/null +++ b/config/locales/views/dossier_mailer/notify_revert_to_instruction/fr.yml @@ -0,0 +1,9 @@ +fr: + dossier_mailer: + notify_revert_to_instruction: + subject: Votre dossier nº %{dossier_id} sur la démarche « %{libelle_demarche} » est en train d’être réexaminé + body_html: | + Votre dossier va être réexaminé, la précédente décision sur ce dossier est caduque. + Vous pouvez retrouver le dossier que vous avez créé pour la démarche « %{libelle_demarche} » à l'adresse suivante : + contact: | + Pour obtenir le détail de cette modification de la décision, vous pouvez contacter par email : diff --git a/config/routes.rb b/config/routes.rb index 6fbfb9841..f1cc0e1a7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -193,27 +193,9 @@ Rails.application.routes.draw do get 'procedures/archived', to: redirect('/admin/procedures?statut=archivees') get 'procedures/draft', to: redirect('/admin/procedures?statut=brouillons') - resources :procedures, only: [:destroy] do - collection do - get 'new_from_existing' => 'procedures#new_from_existing', as: :new_from_existing - end - - member do - delete :delete_logo - delete :delete_deliberation - delete :delete_notice - end - - put 'archive' => 'procedures#archive', as: :archive - get 'publish_validate' => 'procedures#publish_validate', as: :publish_validate - put 'clone' => 'procedures#clone', as: :clone - end - namespace :assigns do get 'show' # delete after fixed tests admin/instructeurs/show_spec without this line end - - resources :instructeurs, only: [:index, :create, :destroy] end resources :invites, only: [:show, :destroy] do @@ -242,6 +224,8 @@ Rails.application.routes.draw do get 'dossiers/pdf/:id', format: :pdf, to: "dossiers#pdf", as: :dossier_pdf get 'dossiers/geojson/:id', to: "dossiers#geojson", as: :dossier_geojson end + + resources :pays, only: :index end # @@ -398,7 +382,11 @@ Rails.application.routes.draw do # namespace :admin, module: 'new_administrateur' do - resources :procedures, except: [:destroy] do + resources :procedures do + collection do + get 'new_from_existing' + end + member do get 'apercu' get 'champs' @@ -411,6 +399,8 @@ Rails.application.routes.draw do put :experts_require_administrateur_invitation end + put 'clone' + put 'archive' get 'publication' => 'procedures#publication', as: :publication put 'publish' => 'procedures#publish', as: :publish get 'transfert' => 'procedures#transfert', as: :transfert diff --git a/db/migrate/20210826161956_add_locale_to_users.rb b/db/migrate/20210826161956_add_locale_to_users.rb new file mode 100644 index 000000000..c5cca3643 --- /dev/null +++ b/db/migrate/20210826161956_add_locale_to_users.rb @@ -0,0 +1,5 @@ +class AddLocaleToUsers < ActiveRecord::Migration[6.1] + def change + add_column :users, :locale, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 2cc0a24a3..8cc67d824 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_08_18_083349) do +ActiveRecord::Schema.define(version: 2021_08_26_161956) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -753,6 +753,7 @@ ActiveRecord::Schema.define(version: 2021_08_18_083349) do t.bigint "instructeur_id" t.bigint "administrateur_id" t.bigint "expert_id" + t.string "locale" t.index ["administrateur_id"], name: "index_users_on_administrateur_id" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["email"], name: "index_users_on_email", unique: true diff --git a/package.json b/package.json index d8365369a..5357742a3 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,25 @@ { "dependencies": { - "@babel/preset-react": "^7.12.13", + "@babel/preset-react": "^7.14.5", "@headlessui/react": "^1.3.0", "@heroicons/react": "^1.0.1", "@mapbox/mapbox-gl-draw": "^1.2.2", "@popperjs/core": "^2.9.2", - "@rails/actiontext": "^6.0.3", - "@rails/activestorage": "^6.0.3", - "@rails/ujs": "^6.0.3", + "@rails/actiontext": "^6.1.4-1", + "@rails/activestorage": "^6.1.4-1", + "@rails/ujs": "^6.1.4-1", "@rails/webpacker": "5.1.1", "@reach/combobox": "^0.13.0", "@reach/slider": "^0.15.0", "@reach/visually-hidden": "^0.15.2", - "@sentry/browser": "6.9.0", + "@sentry/browser": "6.11.0", "@tmcw/togeojson": "^4.3.0", "babel-plugin-macros": "^2.8.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "chartkick": "^3.2.0", "core-js": "^3.6.5", - "debounce": "^1.2.0", - "dom4": "^2.1.5", + "debounce": "^1.2.1", + "dom4": "^2.1.6", "email-butler": "^1.0.13", "highcharts": "^9.0.0", "intersection-observer": "^0.12.0", @@ -44,13 +44,13 @@ "devDependencies": { "@2fd/graphdoc": "^2.4.0", "babel-eslint": "^10.1.0", - "eslint": "^7.0.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-react": "^7.22.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.25.1", "eslint-plugin-react-hooks": "^4.2.0", "netlify-cli": "^2.61.2", - "prettier": "^2.0.5", + "prettier": "^2.3.2", "webpack-bundle-analyzer": "^3.7.0", "webpack-dev-server": "^3.11.0" }, diff --git a/public/pays.json b/public/pays.json deleted file mode 100644 index a56e16923..000000000 --- a/public/pays.json +++ /dev/null @@ -1,848 +0,0 @@ -[ - { - "nom": "FRANCE" - }, - { - "nom": "ACORES, MADERE" - }, - { - "nom": "AFGHANISTAN" - }, - { - "nom": "AFRIQUE DU SUD" - }, - { - "nom": "ALASKA" - }, - { - "nom": "ALBANIE" - }, - { - "nom": "ALGERIE" - }, - { - "nom": "ALLEMAGNE" - }, - { - "nom": "ANDORRE" - }, - { - "nom": "ANGOLA" - }, - { - "nom": "ANGUILLA" - }, - { - "nom": "ANTIGUA-ET-BARBUDA" - }, - { - "nom": "ANTILLES NEERLANDAISES" - }, - { - "nom": "ARABIE SAOUDITE" - }, - { - "nom": "ARGENTINE" - }, - { - "nom": "ARMENIE" - }, - { - "nom": "ARUBA" - }, - { - "nom": "AUSTRALIE" - }, - { - "nom": "AUTRICHE" - }, - { - "nom": "AZERBAIDJAN" - }, - { - "nom": "BAHAMAS" - }, - { - "nom": "BAHREIN" - }, - { - "nom": "BANGLADESH" - }, - { - "nom": "BARBADE" - }, - { - "nom": "BELGIQUE" - }, - { - "nom": "BELIZE" - }, - { - "nom": "BENIN" - }, - { - "nom": "BERMUDES" - }, - { - "nom": "BHOUTAN" - }, - { - "nom": "BIELORUSSIE" - }, - { - "nom": "BIRMANIE" - }, - { - "nom": "BOLIVIE" - }, - { - "nom": "BONAIRE, SAINT EUSTACHE ET SABA" - }, - { - "nom": "BOSNIE-HERZEGOVINE" - }, - { - "nom": "BOTSWANA" - }, - { - "nom": "BOUVET (ILE)" - }, - { - "nom": "BRESIL" - }, - { - "nom": "BRUNEI" - }, - { - "nom": "BULGARIE" - }, - { - "nom": "BURKINA" - }, - { - "nom": "BURUNDI" - }, - { - "nom": "CAIMANES (ILES)" - }, - { - "nom": "CAMBODGE" - }, - { - "nom": "CAMEROUN" - }, - { - "nom": "CAMEROUN ET TOGO" - }, - { - "nom": "CANADA" - }, - { - "nom": "CANARIES (ILES)" - }, - { - "nom": "CAP-VERT" - }, - { - "nom": "CENTRAFRICAINE (REPUBLIQUE)" - }, - { - "nom": "CHILI" - }, - { - "nom": "CHINE" - }, - { - "nom": "CHRISTMAS (ILE)" - }, - { - "nom": "CHYPRE" - }, - { - "nom": "CLIPPERTON (ILE)" - }, - { - "nom": "COCOS ou KEELING (ILES)" - }, - { - "nom": "COLOMBIE" - }, - { - "nom": "COMORES" - }, - { - "nom": "CONGO" - }, - { - "nom": "CONGO (REPUBLIQUE DEMOCRATIQUE)" - }, - { - "nom": "COOK (ILES)" - }, - { - "nom": "COREE" - }, - { - "nom": "COREE (REPUBLIQUE DE)" - }, - { - "nom": "COREE (REPUBLIQUE POPULAIRE DEMOCRATIQUE DE)" - }, - { - "nom": "COSTA RICA" - }, - { - "nom": "COTE D'IVOIRE" - }, - { - "nom": "CROATIE" - }, - { - "nom": "CUBA" - }, - { - "nom": "CURAÇAO" - }, - { - "nom": "DANEMARK" - }, - { - "nom": "DJIBOUTI" - }, - { - "nom": "DOMINICAINE (REPUBLIQUE)" - }, - { - "nom": "DOMINIQUE" - }, - { - "nom": "EGYPTE" - }, - { - "nom": "EL SALVADOR" - }, - { - "nom": "EMIRATS ARABES UNIS" - }, - { - "nom": "EQUATEUR" - }, - { - "nom": "ERYTHREE" - }, - { - "nom": "ESPAGNE" - }, - { - "nom": "ESTONIE" - }, - { - "nom": "ETATS MALAIS NON FEDERES" - }, - { - "nom": "ETATS-UNIS" - }, - { - "nom": "ETHIOPIE" - }, - { - "nom": "FEROE (ILES)" - }, - { - "nom": "FIDJI" - }, - { - "nom": "FINLANDE" - }, - { - "nom": "GABON" - }, - { - "nom": "GAMBIE" - }, - { - "nom": "GEORGIE" - }, - { - "nom": "GEORGIE DU SUD ET LES ILES SANDWICH DU SUD" - }, - { - "nom": "GHANA" - }, - { - "nom": "GIBRALTAR" - }, - { - "nom": "GOA" - }, - { - "nom": "GRECE" - }, - { - "nom": "GRENADE" - }, - { - "nom": "GROENLAND" - }, - { - "nom": "GUADELOUPE" - }, - { - "nom": "GUAM" - }, - { - "nom": "GUATEMALA" - }, - { - "nom": "GUERNESEY" - }, - { - "nom": "GUINEE" - }, - { - "nom": "GUINEE EQUATORIALE" - }, - { - "nom": "GUINEE-BISSAU" - }, - { - "nom": "GUYANA" - }, - { - "nom": "GUYANE" - }, - { - "nom": "HAITI" - }, - { - "nom": "HAWAII (ILES)" - }, - { - "nom": "HEARD ET MACDONALD (ILES)" - }, - { - "nom": "HONDURAS" - }, - { - "nom": "HONG-KONG" - }, - { - "nom": "HONGRIE" - }, - { - "nom": "ILES PORTUGAISES DE L'OCEAN INDIEN" - }, - { - "nom": "INDE" - }, - { - "nom": "INDONESIE" - }, - { - "nom": "IRAN" - }, - { - "nom": "IRAQ" - }, - { - "nom": "IRLANDE, ou EIRE" - }, - { - "nom": "ISLANDE" - }, - { - "nom": "ISRAEL" - }, - { - "nom": "ITALIE" - }, - { - "nom": "JAMAIQUE" - }, - { - "nom": "JAPON" - }, - { - "nom": "JERSEY" - }, - { - "nom": "JORDANIE" - }, - { - "nom": "KAMTCHATKA" - }, - { - "nom": "KAZAKHSTAN" - }, - { - "nom": "KENYA" - }, - { - "nom": "KIRGHIZISTAN" - }, - { - "nom": "KIRIBATI" - }, - { - "nom": "KOSOVO" - }, - { - "nom": "KOWEIT" - }, - { - "nom": "LA REUNION" - }, - { - "nom": "LABRADOR" - }, - { - "nom": "LAOS" - }, - { - "nom": "LESOTHO" - }, - { - "nom": "LETTONIE" - }, - { - "nom": "LIBAN" - }, - { - "nom": "LIBERIA" - }, - { - "nom": "LIBYE" - }, - { - "nom": "LIECHTENSTEIN" - }, - { - "nom": "LITUANIE" - }, - { - "nom": "LUXEMBOURG" - }, - { - "nom": "MACAO" - }, - { - "nom": "MACEDOINE DU NORD (REPUBLIQUE DE)" - }, - { - "nom": "MADAGASCAR" - }, - { - "nom": "MALAISIE" - }, - { - "nom": "MALAWI" - }, - { - "nom": "MALDIVES" - }, - { - "nom": "MALI" - }, - { - "nom": "MALOUINES, OU FALKLAND (ILES)" - }, - { - "nom": "MALTE" - }, - { - "nom": "MAN (ILE)" - }, - { - "nom": "MANDCHOURIE" - }, - { - "nom": "MARIANNES DU NORD (ILES)" - }, - { - "nom": "MAROC" - }, - { - "nom": "MARSHALL (ILES)" - }, - { - "nom": "MARTINIQUE" - }, - { - "nom": "MAURICE" - }, - { - "nom": "MAURITANIE" - }, - { - "nom": "MAYOTTE" - }, - { - "nom": "MEXIQUE" - }, - { - "nom": "MICRONESIE (ETATS FEDERES DE)" - }, - { - "nom": "MOLDAVIE" - }, - { - "nom": "MONACO" - }, - { - "nom": "MONGOLIE" - }, - { - "nom": "MONTENEGRO" - }, - { - "nom": "MONTSERRAT" - }, - { - "nom": "MOZAMBIQUE" - }, - { - "nom": "NAMIBIE" - }, - { - "nom": "NAURU" - }, - { - "nom": "NEPAL" - }, - { - "nom": "NICARAGUA" - }, - { - "nom": "NIGER" - }, - { - "nom": "NIGERIA" - }, - { - "nom": "NIUE" - }, - { - "nom": "NORFOLK (ILE)" - }, - { - "nom": "NORVEGE" - }, - { - "nom": "NOUVELLE-CALEDONIE" - }, - { - "nom": "NOUVELLE-ZELANDE" - }, - { - "nom": "OCEAN INDIEN (TERRITOIRE BRITANNIQUE DE L')" - }, - { - "nom": "OMAN" - }, - { - "nom": "OUGANDA" - }, - { - "nom": "OUZBEKISTAN" - }, - { - "nom": "PAKISTAN" - }, - { - "nom": "PALAOS (ILES)" - }, - { - "nom": "PALESTINE (Etat de)" - }, - { - "nom": "PANAMA" - }, - { - "nom": "PAPOUASIE-NOUVELLE-GUINEE" - }, - { - "nom": "PARAGUAY" - }, - { - "nom": "PAYS-BAS" - }, - { - "nom": "PEROU" - }, - { - "nom": "PHILIPPINES" - }, - { - "nom": "PITCAIRN (ILE)" - }, - { - "nom": "POLOGNE" - }, - { - "nom": "POLYNESIE FRANCAISE" - }, - { - "nom": "PORTO RICO" - }, - { - "nom": "PORTUGAL" - }, - { - "nom": "POSSESSIONS BRITANNIQUES AU PROCHE-ORIENT" - }, - { - "nom": "PRESIDES" - }, - { - "nom": "PROVINCES ESPAGNOLES D'AFRIQUE" - }, - { - "nom": "QATAR" - }, - { - "nom": "REPUBLIQUE DEMOCRATIQUE ALLEMANDE" - }, - { - "nom": "REPUBLIQUE FEDERALE D'ALLEMAGNE" - }, - { - "nom": "ROUMANIE" - }, - { - "nom": "ROYAUME-UNI" - }, - { - "nom": "RUSSIE" - }, - { - "nom": "RWANDA" - }, - { - "nom": "SAHARA OCCIDENTAL" - }, - { - "nom": "SAINT-BARTHELEMY" - }, - { - "nom": "SAINT-CHRISTOPHE-ET-NIEVES" - }, - { - "nom": "SAINT-MARIN" - }, - { - "nom": "SAINT-MARTIN" - }, - { - "nom": "SAINT-MARTIN (PARTIE NEERLANDAISE)" - }, - { - "nom": "SAINT-PIERRE-ET-MIQUELON" - }, - { - "nom": "SAINT-VINCENT-ET-LES GRENADINES" - }, - { - "nom": "SAINTE HELENE, ASCENSION ET TRISTAN DA CUNHA" - }, - { - "nom": "SAINTE-LUCIE" - }, - { - "nom": "SALOMON (ILES)" - }, - { - "nom": "SAMOA AMERICAINES" - }, - { - "nom": "SAMOA OCCIDENTALES" - }, - { - "nom": "SAO TOME-ET-PRINCIPE" - }, - { - "nom": "SENEGAL" - }, - { - "nom": "SERBIE" - }, - { - "nom": "SEYCHELLES" - }, - { - "nom": "SIBERIE" - }, - { - "nom": "SIERRA LEONE" - }, - { - "nom": "SINGAPOUR" - }, - { - "nom": "SLOVAQUIE" - }, - { - "nom": "SLOVENIE" - }, - { - "nom": "SOMALIE" - }, - { - "nom": "SOUDAN" - }, - { - "nom": "SOUDAN ANGLO-EGYPTIEN, KENYA, OUGANDA" - }, - { - "nom": "SOUDAN DU SUD" - }, - { - "nom": "SRI LANKA" - }, - { - "nom": "SUEDE" - }, - { - "nom": "SUISSE" - }, - { - "nom": "SURINAME" - }, - { - "nom": "SVALBARD et ILE JAN MAYEN" - }, - { - "nom": "SWAZILAND" - }, - { - "nom": "SYRIE" - }, - { - "nom": "TADJIKISTAN" - }, - { - "nom": "TAIWAN" - }, - { - "nom": "TANGER" - }, - { - "nom": "TANZANIE" - }, - { - "nom": "TCHAD" - }, - { - "nom": "TCHECOSLOVAQUIE" - }, - { - "nom": "TCHEQUE (REPUBLIQUE)" - }, - { - "nom": "TERR. DES ETATS-UNIS D'AMERIQUE EN AMERIQUE" - }, - { - "nom": "TERR. DES ETATS-UNIS D'AMERIQUE EN OCEANIE" - }, - { - "nom": "TERR. DU ROYAUME-UNI DANS L'ATLANTIQUE SUD" - }, - { - "nom": "TERRE-NEUVE" - }, - { - "nom": "TERRES AUSTRALES FRANCAISES" - }, - { - "nom": "TERRITOIRES DU ROYAUME-UNI AUX ANTILLES" - }, - { - "nom": "THAILANDE" - }, - { - "nom": "TIMOR ORIENTAL" - }, - { - "nom": "TOGO" - }, - { - "nom": "TOKELAU" - }, - { - "nom": "TONGA" - }, - { - "nom": "TRINITE-ET-TOBAGO" - }, - { - "nom": "TUNISIE" - }, - { - "nom": "TURKESTAN RUSSE" - }, - { - "nom": "TURKMENISTAN" - }, - { - "nom": "TURKS ET CAIQUES (ILES)" - }, - { - "nom": "TURQUIE" - }, - { - "nom": "TURQUIE D'EUROPE" - }, - { - "nom": "TUVALU" - }, - { - "nom": "UKRAINE" - }, - { - "nom": "URUGUAY" - }, - { - "nom": "VANUATU" - }, - { - "nom": "VATICAN, ou SAINT-SIEGE" - }, - { - "nom": "VENEZUELA" - }, - { - "nom": "VIERGES BRITANNIQUES (ILES)" - }, - { - "nom": "VIERGES DES ETATS-UNIS (ILES)" - }, - { - "nom": "VIET NAM" - }, - { - "nom": "VIET NAM DU NORD" - }, - { - "nom": "VIET NAM DU SUD" - }, - { - "nom": "WALLIS-ET-FUTUNA" - }, - { - "nom": "YEMEN" - }, - { - "nom": "YEMEN (REPUBLIQUE ARABE DU)" - }, - { - "nom": "YEMEN DEMOCRATIQUE" - }, - { - "nom": "ZAMBIE" - }, - { - "nom": "ZANZIBAR" - }, - { - "nom": "ZIMBABWE" - } -] diff --git a/spec/controllers/admin/instructeurs_controller_spec.rb b/spec/controllers/admin/instructeurs_controller_spec.rb deleted file mode 100644 index 3bf695cdf..000000000 --- a/spec/controllers/admin/instructeurs_controller_spec.rb +++ /dev/null @@ -1,177 +0,0 @@ -describe Admin::InstructeursController, type: :controller do - let(:admin) { create(:administrateur) } - let(:email_2) { 'plip@octo.com' } - let(:admin_2) { create :administrateur, email: email_2 } - - before do - sign_in(admin.user) - end - - describe 'GET #index' do - subject { get :index } - it { expect(subject.status).to eq(200) } - end - - describe 'GET #index with sorting and pagination' do - subject { - get :index, params: { - 'instructeurs_smart_listing[page]': 1, - 'instructeurs_smart_listing[per_page]': 10, - 'instructeurs_smart_listing[sort][email]': 'asc' - } - } - - it { expect(subject.status).to eq(200) } - end - - describe 'POST #create' do - let(:email) { 'test@plop.com' } - let(:procedure_id) { nil } - subject { post :create, params: { instructeur: { email: email }, procedure_id: procedure_id } } - - context 'When email is valid' do - before do - subject - end - - let(:instructeur) { Instructeur.last } - - it { expect(response.status).to eq(302) } - it { expect(response).to redirect_to admin_instructeurs_path } - - context 'when procedure_id params is not null' do - let(:procedure) { create :procedure } - let(:procedure_id) { procedure.id } - it { expect(response.status).to eq(302) } - it { expect(response).to redirect_to admin_procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur) } - end - - describe 'Instructeur attributs in database' do - it { expect(instructeur.email).to eq(email) } - end - - describe 'New instructeur is assign to the admin' do - it { expect(instructeur.administrateurs).to include admin } - it { expect(admin.instructeurs).to include instructeur } - end - end - - context 'when email is not valid' do - before do - subject - end - let(:email) { 'piou' } - it { expect(response.status).to eq(302) } - it { expect { response }.not_to change(Instructeur, :count) } - it { expect(flash[:alert]).to be_present } - - describe 'Email Notification' do - it { - expect(InstructeurMailer).not_to receive(:new_instructeur) - expect(InstructeurMailer).not_to receive(:deliver_later) - subject - } - end - end - - context 'when email is empty' do - before do - subject - end - let(:email) { '' } - it { expect(response.status).to eq(302) } - it { expect { response }.not_to change(Instructeur, :count) } - - it 'Notification email is not send' do - expect(InstructeurMailer).not_to receive(:new_instructeur) - expect(InstructeurMailer).not_to receive(:deliver_later) - end - end - - context 'when email is already assign at the admin' do - before do - create :instructeur, email: email, administrateurs: [admin] - subject - end - - it { expect(response.status).to eq(302) } - it { expect { response }.not_to change(Instructeur, :count) } - it { expect(flash[:alert]).to be_present } - - describe 'Email notification' do - it 'is not sent when email already exists' do - expect(InstructeurMailer).not_to receive(:new_instructeur) - expect(InstructeurMailer).not_to receive(:deliver_later) - - subject - end - end - end - - context 'when an other admin will add the same email' do - let(:instructeur) { Instructeur.by_email(email) } - - before do - create :instructeur, email: email, administrateurs: [admin] - - sign_out(admin.user) - sign_in(admin_2.user) - - subject - end - - it { expect(response.status).to eq(302) } - it { expect { response }.not_to change(Instructeur, :count) } - it { expect(flash[:notice]).to be_present } - - it { expect(admin_2.instructeurs).to include instructeur } - it { expect(instructeur.administrateurs.size).to eq 2 } - end - - context 'when an other admin will add the same email with some uppercase in it' do - let(:email) { 'Test@Plop.com' } - let(:instructeur) { Instructeur.by_email(email.downcase) } - - before do - create :instructeur, email: email, administrateurs: [admin] - - sign_out(admin.user) - sign_in(admin_2.user) - - subject - end - - it { expect(admin_2.instructeurs).to include instructeur } - end - - context 'Email notification' do - it 'Notification email is sent when instructeur is create' do - expect_any_instance_of(User).to receive(:invite!) - subject - end - end - end - - describe 'DELETE #destroy' do - let(:email) { 'test@plop.com' } - let!(:admin) { create :administrateur } - let!(:instructeur) { create :instructeur, email: email, administrateurs: [admin] } - - subject { delete :destroy, params: { id: instructeur.id } } - - context "when gestionaire_id is valid" do - before do - subject - admin.reload - instructeur.reload - end - - it { expect(response.status).to eq(302) } - it { expect(response).to redirect_to admin_instructeurs_path } - it { expect(admin.instructeurs).not_to include instructeur } - it { expect(instructeur.administrateurs).not_to include admin } - end - - it { expect { subject }.not_to change(Instructeur, :count) } - end -end diff --git a/spec/controllers/admin/procedures_controller_spec.rb b/spec/controllers/admin/procedures_controller_spec.rb deleted file mode 100644 index 2ebfc636f..000000000 --- a/spec/controllers/admin/procedures_controller_spec.rb +++ /dev/null @@ -1,280 +0,0 @@ -require 'uri' - -describe Admin::ProceduresController, type: :controller do - let(:admin) { create(:administrateur) } - - let(:bad_procedure_id) { 100000 } - - let(:path) { 'ma-jolie-demarche' } - let(:libelle) { 'Démarche de test' } - let(:description) { 'Description de test' } - let(:organisation) { 'Organisation de test' } - let(:direction) { 'Direction de test' } - let(:cadre_juridique) { 'cadre juridique' } - let(:duree_conservation_dossiers_dans_ds) { 3 } - let(:duree_conservation_dossiers_hors_ds) { 6 } - let(:monavis_embed) { nil } - let(:lien_site_web) { 'http://mon-site.gouv.fr' } - - let(:procedure_params) { - { - path: path, - libelle: libelle, - description: description, - organisation: organisation, - direction: direction, - cadre_juridique: cadre_juridique, - duree_conservation_dossiers_dans_ds: duree_conservation_dossiers_dans_ds, - duree_conservation_dossiers_hors_ds: duree_conservation_dossiers_hors_ds, - monavis_embed: monavis_embed, - lien_site_web: lien_site_web - } - } - - before do - sign_in(admin.user) - end - - describe 'GET #published' do - subject { get :published } - - it { expect(response.status).to eq(200) } - end - - describe 'DELETE #destroy' do - let(:procedure_draft) { create(:procedure, administrateurs: [admin]) } - let(:procedure_published) { create(:procedure, :published, administrateurs: [admin]) } - let(:procedure_closed) { create(:procedure, :closed, administrateurs: [admin]) } - let(:procedure) { dossier.procedure } - - subject { delete :destroy, params: { id: procedure } } - - context 'when the procedure is a brouillon' do - let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_draft) } - - before { subject } - - it 'discard the procedure' do - expect(procedure.reload.discarded?).to be_truthy - end - - it 'deletes associated dossiers' do - expect(procedure.dossiers.with_discarded.count).to eq(0) - end - - it 'redirects to the procedure drafts page' do - expect(response).to redirect_to admin_procedures_draft_path - expect(flash[:notice]).to be_present - end - end - - context 'when procedure is published' do - let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_published) } - - before { subject } - - it { expect(response.status).to eq 403 } - - context 'when dossier is en_construction' do - let(:dossier) { create(:dossier, :en_construction, procedure: procedure_published) } - - it { expect(procedure.reload.close?).to be_truthy } - it { expect(procedure.reload.discarded?).to be_truthy } - it { expect(dossier.reload.discarded?).to be_truthy } - end - end - - context 'when procedure is closed' do - let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_closed) } - - before { subject } - - it { expect(response.status).to eq 403 } - - context 'when dossier is en_construction' do - let(:dossier) { create(:dossier, :en_construction, procedure: procedure_published) } - - it { expect(procedure.reload.discarded?).to be_truthy } - it { expect(dossier.reload.discarded?).to be_truthy } - end - end - - context "when administrateur does not own the procedure" do - let(:dossier) { create(:dossier) } - - it { expect { subject }.to raise_error(ActiveRecord::RecordNotFound) } - end - end - - describe 'PUT #archive' do - let(:procedure) { create(:procedure, :published, administrateur: admin, lien_site_web: lien_site_web) } - - context 'when admin is the owner of the procedure' do - before do - put :archive, params: { procedure_id: procedure.id } - procedure.reload - end - - context 'when owner want archive procedure' do - it { expect(procedure.close?).to be_truthy } - it { expect(response).to redirect_to :admin_procedures } - it { expect(flash[:notice]).to have_content 'Démarche close' } - end - end - - context 'when admin is not the owner of the procedure' do - let(:admin_2) { create(:administrateur) } - - before do - sign_out(admin.user) - sign_in(admin_2.user) - - put :archive, params: { procedure_id: procedure.id } - procedure.reload - end - - it { expect(response).to redirect_to :admin_procedures } - it { expect(flash[:alert]).to have_content 'Démarche inexistante' } - end - end - - describe 'PUT #clone' do - let!(:procedure) { create(:procedure, :with_notice, :with_deliberation, administrateur: admin) } - let(:params) { { procedure_id: procedure.id } } - subject { put :clone, params: params } - - before do - response = Typhoeus::Response.new(code: 200, body: 'Hello world') - Typhoeus.stub(/active_storage\/disk/).and_return(response) - end - - it { expect { subject }.to change(Procedure, :count).by(1) } - - context 'when admin is the owner of the procedure' do - before { subject } - - it 'creates a new procedure and redirect to it' do - expect(response).to redirect_to edit_admin_procedure_path(id: Procedure.last.id) - expect(Procedure.last.cloned_from_library).to be_falsey - expect(Procedure.last.notice.attached?).to be_truthy - expect(Procedure.last.deliberation.attached?).to be_truthy - expect(flash[:notice]).to have_content 'Démarche clonée' - end - - context 'when the procedure is cloned from the library' do - let(:params) { { procedure_id: procedure.id, from_new_from_existing: true } } - - it { expect(Procedure.last.cloned_from_library).to be(true) } - end - end - - context 'when admin is not the owner of the procedure' do - let(:admin_2) { create(:administrateur) } - - before do - sign_out(admin.user) - sign_in(admin_2.user) - subject - end - - it 'creates a new procedure and redirect to it' do - expect(response).to redirect_to edit_admin_procedure_path(id: Procedure.last.id) - expect(flash[:notice]).to have_content 'Démarche clonée' - end - end - end - - describe 'GET #new_from_existing' do - before do - stub_const("Admin::ProceduresController::SIGNIFICANT_DOSSIERS_THRESHOLD", 2) - end - - subject { get :new_from_existing } - let(:grouped_procedures) { subject; assigns(:grouped_procedures) } - let(:response_procedures) { grouped_procedures.map { |_o, procedures| procedures }.flatten } - - describe 'selecting' do - let!(:large_draft_procedure) { create(:procedure_with_dossiers, dossiers_count: 2) } - let!(:large_published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2) } - let!(:large_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 2) } - let!(:small_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 1) } - - it 'displays published and closed procedures' do - expect(response_procedures).to include(large_published_procedure) - expect(response_procedures).to include(large_closed_procedure) - end - - it 'doesn’t display procedures without a significant number of dossiers' do - expect(response_procedures).not_to include(small_closed_procedure) - end - - it 'doesn’t display draft procedures' do - expect(response_procedures).not_to include(large_draft_procedure) - end - end - - describe 'grouping' do - let(:service_1) { create(:service, nom: 'DDT des Vosges') } - let(:service_2) { create(:service, nom: 'DDT du Loiret') } - let!(:procedure_with_service_1) { create(:procedure_with_dossiers, :published, organisation: nil, service: service_1, dossiers_count: 2) } - let!(:procedure_with_service_2) { create(:procedure_with_dossiers, :published, organisation: nil, service: service_2, dossiers_count: 2) } - let!(:procedure_without_service) { create(:procedure_with_dossiers, :published, organisation: 'DDT du Loiret', dossiers_count: 2) } - - it 'groups procedures with services as well as procedures with organisations' do - expect(grouped_procedures.length).to eq 2 - expect(grouped_procedures.find { |o, _p| o == 'DDT des Vosges' }.last).to contain_exactly(procedure_with_service_1) - expect(grouped_procedures.find { |o, _p| o == 'DDT du Loiret' }.last).to contain_exactly(procedure_with_service_2, procedure_without_service) - end - end - end - - describe "DELETE #delete_deliberation" do - context "with a demarche the admin owns" do - let(:procedure) { create(:procedure, :with_deliberation, administrateur: admin) } - - before do - delete :delete_deliberation, params: { id: procedure.id } - procedure.reload - end - - it { expect(procedure.deliberation.attached?).to eq(false) } - it { expect(response).to redirect_to(edit_admin_procedure_path(procedure)) } - end - - context "with a demarche the admin does not own" do - let(:procedure) { create(:procedure, :with_deliberation) } - - before do - delete :delete_deliberation, params: { id: procedure.id } - procedure.reload - end - - it { expect(response.status).to eq(404) } - end - end - - describe "DELETE #delete_notice" do - context "with a demarche the admin owns" do - let(:procedure) { create(:procedure, :with_notice, administrateur: admin) } - - before do - delete :delete_notice, params: { id: procedure.id } - procedure.reload - end - - it { expect(procedure.notice.attached?).to eq(false) } - it { expect(response).to redirect_to(edit_admin_procedure_path(procedure)) } - end - - context "with a demarche the admin does not own" do - let(:procedure) { create(:procedure, :with_notice) } - - before do - delete :delete_notice, params: { id: procedure.id } - procedure.reload - end - - it { expect(response.status).to eq(404) } - end - end -end diff --git a/spec/controllers/new_administrateur/procedures_controller_spec.rb b/spec/controllers/new_administrateur/procedures_controller_spec.rb index 6dfe388fb..2e5e57e1a 100644 --- a/spec/controllers/new_administrateur/procedures_controller_spec.rb +++ b/spec/controllers/new_administrateur/procedures_controller_spec.rb @@ -64,6 +64,50 @@ describe NewAdministrateur::ProceduresController, type: :controller do it { expect(subject.status).to eq(200) } end + describe 'GET #new_from_existing' do + before do + stub_const("NewAdministrateur::ProceduresController::SIGNIFICANT_DOSSIERS_THRESHOLD", 2) + end + + subject { get :new_from_existing } + let(:grouped_procedures) { subject; assigns(:grouped_procedures) } + let(:response_procedures) { grouped_procedures.map { |_o, procedures| procedures }.flatten } + + describe 'selecting' do + let!(:large_draft_procedure) { create(:procedure_with_dossiers, dossiers_count: 2) } + let!(:large_published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2) } + let!(:large_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 2) } + let!(:small_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 1) } + + it 'displays published and closed procedures' do + expect(response_procedures).to include(large_published_procedure) + expect(response_procedures).to include(large_closed_procedure) + end + + it 'doesn’t display procedures without a significant number of dossiers' do + expect(response_procedures).not_to include(small_closed_procedure) + end + + it 'doesn’t display draft procedures' do + expect(response_procedures).not_to include(large_draft_procedure) + end + end + + describe 'grouping' do + let(:service_1) { create(:service, nom: 'DDT des Vosges') } + let(:service_2) { create(:service, nom: 'DDT du Loiret') } + let!(:procedure_with_service_1) { create(:procedure_with_dossiers, :published, organisation: nil, service: service_1, dossiers_count: 2) } + let!(:procedure_with_service_2) { create(:procedure_with_dossiers, :published, organisation: nil, service: service_2, dossiers_count: 2) } + let!(:procedure_without_service) { create(:procedure_with_dossiers, :published, organisation: 'DDT du Loiret', dossiers_count: 2) } + + it 'groups procedures with services as well as procedures with organisations' do + expect(grouped_procedures.length).to eq 2 + expect(grouped_procedures.find { |o, _p| o == 'DDT des Vosges' }.last).to contain_exactly(procedure_with_service_1) + expect(grouped_procedures.find { |o, _p| o == 'DDT du Loiret' }.last).to contain_exactly(procedure_with_service_2, procedure_without_service) + end + end + end + describe 'GET #edit' do let(:published_at) { nil } let(:procedure) { create(:procedure, administrateur: admin, published_at: published_at) } @@ -250,6 +294,154 @@ describe NewAdministrateur::ProceduresController, type: :controller do end end + describe 'PUT #clone' do + let(:procedure) { create(:procedure, :with_notice, :with_deliberation, administrateur: admin) } + let(:params) { { procedure_id: procedure.id } } + + subject { put :clone, params: params } + + before do + procedure + + response = Typhoeus::Response.new(code: 200, body: 'Hello world') + Typhoeus.stub(/active_storage\/disk/).and_return(response) + end + + it { expect { subject }.to change(Procedure, :count).by(1) } + + context 'when admin is the owner of the procedure' do + before { subject } + + it 'creates a new procedure and redirect to it' do + expect(response).to redirect_to edit_admin_procedure_path(id: Procedure.last.id) + expect(Procedure.last.cloned_from_library).to be_falsey + expect(Procedure.last.notice.attached?).to be_truthy + expect(Procedure.last.deliberation.attached?).to be_truthy + expect(flash[:notice]).to have_content 'Démarche clonée' + end + + context 'when the procedure is cloned from the library' do + let(:params) { { procedure_id: procedure.id, from_new_from_existing: true } } + + it { expect(Procedure.last.cloned_from_library).to be(true) } + end + end + + context 'when admin is not the owner of the procedure' do + let(:admin_2) { create(:administrateur) } + + before do + sign_out(admin.user) + sign_in(admin_2.user) + subject + end + + it 'creates a new procedure and redirect to it' do + expect(response).to redirect_to edit_admin_procedure_path(id: Procedure.last.id) + expect(flash[:notice]).to have_content 'Démarche clonée' + end + end + end + + describe 'PUT #archive' do + let(:procedure) { create(:procedure, :published, administrateur: admin, lien_site_web: lien_site_web) } + + context 'when the admin is an owner of the procedure' do + before do + put :archive, params: { procedure_id: procedure.id } + procedure.reload + end + + it 'archives the procedure' do + expect(procedure.close?).to be_truthy + expect(response).to redirect_to :admin_procedures + expect(flash[:notice]).to have_content 'Démarche close' + end + end + + context 'when the admin is not an owner of the procedure' do + let(:admin_2) { create(:administrateur) } + + before do + sign_out(admin.user) + sign_in(admin_2.user) + + put :archive, params: { procedure_id: procedure.id } + procedure.reload + end + + it 'displays an error message' do + expect(response).to redirect_to :admin_procedures + expect(flash[:alert]).to have_content 'Démarche inexistante' + end + end + end + + describe 'DELETE #destroy' do + let(:procedure_draft) { create(:procedure, administrateurs: [admin]) } + let(:procedure_published) { create(:procedure, :published, administrateurs: [admin]) } + let(:procedure_closed) { create(:procedure, :closed, administrateurs: [admin]) } + let(:procedure) { dossier.procedure } + + subject { delete :destroy, params: { id: procedure } } + + context 'when the procedure is a brouillon' do + let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_draft) } + + before { subject } + + it 'discard the procedure' do + expect(procedure.reload.discarded?).to be_truthy + end + + it 'deletes associated dossiers' do + expect(procedure.dossiers.with_discarded.count).to eq(0) + end + + it 'redirects to the procedure drafts page' do + expect(response).to redirect_to admin_procedures_draft_path + expect(flash[:notice]).to be_present + end + end + + context 'when procedure is published' do + let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_published) } + + before { subject } + + it { expect(response.status).to eq 403 } + + context 'when dossier is en_construction' do + let(:dossier) { create(:dossier, :en_construction, procedure: procedure_published) } + + it { expect(procedure.reload.close?).to be_truthy } + it { expect(procedure.reload.discarded?).to be_truthy } + it { expect(dossier.reload.discarded?).to be_truthy } + end + end + + context 'when procedure is closed' do + let(:dossier) { create(:dossier, :en_instruction, procedure: procedure_closed) } + + before { subject } + + it { expect(response.status).to eq 403 } + + context 'when dossier is en_construction' do + let(:dossier) { create(:dossier, :en_construction, procedure: procedure_published) } + + it { expect(procedure.reload.discarded?).to be_truthy } + it { expect(dossier.reload.discarded?).to be_truthy } + end + end + + context "when administrateur does not own the procedure" do + let(:dossier) { create(:dossier) } + + it { expect { subject }.to raise_error(ActiveRecord::RecordNotFound) } + end + end + describe 'PATCH #monavis' do let!(:procedure) { create(:procedure, administrateur: admin) } let(:procedure_params) { diff --git a/spec/features/instructeurs/instructeur_creation_spec.rb b/spec/features/instructeurs/instructeur_creation_spec.rb index 776bb027b..978b068c3 100644 --- a/spec/features/instructeurs/instructeur_creation_spec.rb +++ b/spec/features/instructeurs/instructeur_creation_spec.rb @@ -5,13 +5,14 @@ feature 'As an instructeur', js: true do before do login_as administrateur.user, scope: :user - visit admin_instructeurs_path - fill_in :instructeur_email, with: instructeur_email + visit admin_procedure_path(procedure) + find('#groupe-instructeurs').click - perform_enqueued_jobs do - click_button 'Ajouter' - end + find("input[aria-label='email instructeur'").send_keys(instructeur_email, :enter) + perform_enqueued_jobs { click_on 'Affecter' } + + expect(page).to have_text("Les instructeurs ont bien été affectés à la démarche") end scenario 'I can register' do diff --git a/spec/features/users/brouillon_spec.rb b/spec/features/users/brouillon_spec.rb index 30c127051..0b460aecc 100644 --- a/spec/features/users/brouillon_spec.rb +++ b/spec/features/users/brouillon_spec.rb @@ -28,7 +28,7 @@ feature 'The user' do select_multi_combobox('multiple_choice_drop_down_list_long', 'alp', 'alpha') select_multi_combobox('multiple_choice_drop_down_list_long', 'cha', 'charly') - select_combobox('pays', 'aust', 'AUSTRALIE') + select_combobox('pays', 'aust', 'Australie') select_combobox('regions', 'Ma', 'Martinique') select_combobox('departements', 'Ai', '02 - Aisne') select_combobox('communes', 'Ambl', 'Ambléon (01300)') @@ -57,7 +57,7 @@ feature 'The user' do expect(champ_value_for('simple_choice_drop_down_list_long')).to eq('bravo') expect(JSON.parse(champ_value_for('multiple_choice_drop_down_list_long'))).to match(['alpha', 'charly']) expect(JSON.parse(champ_value_for('multiple_drop_down_list'))).to match(['val1', 'val3']) - expect(champ_value_for('pays')).to eq('AUSTRALIE') + expect(champ_value_for('pays')).to eq('Australie') expect(champ_value_for('regions')).to eq('Martinique') expect(champ_value_for('departements')).to eq('02 - Aisne') expect(champ_value_for('communes')).to eq('Ambléon (01300)') @@ -82,7 +82,7 @@ feature 'The user' do expect(page).to have_checked_field('val3') expect(page).to have_selected_value('simple_choice_drop_down_list_long', selected: 'bravo') check_selected_values('multiple_choice_drop_down_list_long', ['alpha', 'charly']) - expect(page).to have_hidden_field('pays', with: 'AUSTRALIE') + expect(page).to have_hidden_field('pays', with: 'Australie') expect(page).to have_hidden_field('regions', with: 'Martinique') expect(page).to have_hidden_field('departements', with: '02 - Aisne') expect(page).to have_hidden_field('communes', with: 'Ambléon (01300)') diff --git a/spec/mailers/dossier_mailer_spec.rb b/spec/mailers/dossier_mailer_spec.rb index e68a073ee..dccd67abb 100644 --- a/spec/mailers/dossier_mailer_spec.rb +++ b/spec/mailers/dossier_mailer_spec.rb @@ -202,8 +202,8 @@ RSpec.describe DossierMailer, type: :mailer do subject { described_class.notify_groupe_instructeur_changed(instructeur, dossier) } - it { expect(subject.subject).to eq("Un dossier a changé de groupe instructeur") } - it { expect(subject.body).to include("n°#{dossier.id}") } + it { expect(subject.subject).to eq("Le dossier nº #{dossier.id} a changé de groupe instructeur") } + it { expect(subject.body).to include("n° #{dossier.id}") } it { expect(subject.body).to include(dossier.procedure.libelle) } it { expect(subject.body).to include("Suite à cette modification, vous ne suivez plus ce dossier.") } end diff --git a/spec/models/champs/linked_drop_down_list_champ_spec.rb b/spec/models/champs/linked_drop_down_list_champ_spec.rb index 9d0977716..bf53cc1b4 100644 --- a/spec/models/champs/linked_drop_down_list_champ_spec.rb +++ b/spec/models/champs/linked_drop_down_list_champ_spec.rb @@ -14,6 +14,14 @@ describe Champs::LinkedDropDownListChamp do it { expect(champ.value).to eq('["tata","tutu"]') } end + describe '#primary_value=' do + let!(:champ) { described_class.new(primary_value: 'tata', secondary_value: 'tutu') } + + before { champ.primary_value = '' } + + it { expect(champ.value).to eq('["",""]') } + end + describe '#to_s' do let(:champ) { described_class.new(primary_value: primary_value, secondary_value: secondary_value) } let(:primary_value) { nil } diff --git a/spec/views/admin/instructeurs/index.html.haml_spec.rb b/spec/views/admin/instructeurs/index.html.haml_spec.rb deleted file mode 100644 index 96d3c4c91..000000000 --- a/spec/views/admin/instructeurs/index.html.haml_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -describe 'admin/instructeurs/index.html.haml', type: :view do - let(:admin) { create(:administrateur) } - - before do - assign(:instructeurs, (smart_listing_create :instructeurs, - admin.instructeurs, - partial: "admin/instructeurs/list", - array: true)) - assign(:instructeur, create(:instructeur)) - end - - context 'Aucun instructeur' do - before do - render - end - it { expect(rendered).to have_content('Aucun instructeur') } - end - - context 'Ajout d\'un instructeur' do - before do - create(:instructeur, administrateurs: [admin]) - admin.reload - assign(:instructeurs, (smart_listing_create :instructeurs, - admin.instructeurs, - partial: "admin/instructeurs/list", - array: true)) - render - end - it { expect(rendered).to match(/inst\d+@inst.com/) } - end -end diff --git a/yarn.lock b/yarn.lock index 8f106ae1f..6ea75bb39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43,6 +43,13 @@ dependencies: "@analytics/cookie-utils" "^0.2.3" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -91,19 +98,12 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== - dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.5" "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" @@ -199,12 +199,12 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.5" "@babel/helper-module-imports@^7.8.3": version "7.8.3" @@ -238,15 +238,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== -"@babel/helper-plugin-utils@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" - integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== "@babel/helper-regex@^7.8.3": version "7.8.3" @@ -291,21 +286,21 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -325,6 +320,15 @@ "@babel/traverse" "^7.9.6" "@babel/types" "^7.9.6" +"@babel/highlight@^7.10.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -447,12 +451,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" @@ -681,38 +685,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== +"@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.12.12": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.16.tgz#af187e749d123b54ae49bc7e034057a0c1d4d568" - integrity sha512-GOp5SkMC4zhHwLbOSYhF+WpIZSf5bGzaKQTT9jWkemJRDM/CE6FtPydXjEYO3pHcna2Zjvg4mQ1lfjOR/4jsaQ== +"@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.16" + "@babel/plugin-transform-react-jsx" "^7.14.5" -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.16.tgz#07c341e02a3e4066b00413534f30c42519923230" - integrity sha512-dNu0vAbIk8OkqJfGtYF6ADk6jagoyAl+Ks5aoltbAlfoKv8d6yooi3j+kObeSQaCj9PgN6KMZPB90wWyek5TmQ== +"@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-regenerator@^7.8.7": version "7.8.7" @@ -860,16 +864,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== +"@babel/preset-react@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" "@babel/runtime@^7.12.5": version "7.12.13" @@ -916,22 +921,12 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" - integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== +"@babel/types@^7.14.5", "@babel/types@^7.14.9": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" - integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": @@ -1005,6 +1000,21 @@ enabled "2.0.x" kuler "^2.0.0" +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@headlessui/react@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.3.0.tgz#62287c92604923e5dfb394483e5ec2463e1baea6" @@ -1015,6 +1025,20 @@ resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.1.tgz#66d25f6441920bd5c2146ea27fd33995885452dd" integrity sha512-uikw2gKCmqnvjVxitecWfFLMOKyL9BTFcU4VM3hHj9OMwpkCr5Ke+MRMyY2/aQVmsYs4VTq7NCFX05MYwAHi3g== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@jest/types@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" @@ -1577,24 +1601,31 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== -"@rails/actiontext@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.0.3.tgz#71dacd49df7c16a363e20aa89a53efcad8fcecde" - integrity sha512-z6NtXRd/Scoqkf8ZRThEZhAUPh/+Yk8knsLgqlGBRXqxth1LToEWubzSeac4b26TDNgVbbTTm7BtLE/R5R4wbA== +"@rails/actiontext@^6.1.4-1": + version "6.1.4-1" + resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.1.4-1.tgz#c75fbeeb7860c2f508150ad003c0c0d0c97c7584" + integrity sha512-dS7AdkJtSyuX2PXipCTNOKEg5G/ftwS+FmM5+8Zxbo35tgs08hfYFPh0muoj5eEkshwV67kEEV/iHgX8PMLh4w== dependencies: - "@rails/activestorage" "^6.0.0-alpha" + "@rails/activestorage" "^6.0.0" -"@rails/activestorage@^6.0.0-alpha", "@rails/activestorage@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.0.3.tgz#401d2a28ecb7167cdb5e830ffddaa17c308c31aa" - integrity sha512-YdNwyfryHlcKj7Ruix89wZ2aiN3KTYULdW1Y/hNlHJlrY2/PXjT2YBTzZiVd+dcjrwHBsXV2rExdy+Z/lsrlEg== +"@rails/activestorage@^6.0.0": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.1.4.tgz#7772f539cc846df5f4364fc57ccb48860f9e966e" + integrity sha512-1Tm8uaVBhLTDEG4YaFPvqguhjbUGSPVItm0CfkRpIFZIkybWzFAxatIrk4YVOOxB8ZdXS7GdeYa1qVwjdiDkgQ== dependencies: spark-md5 "^3.0.0" -"@rails/ujs@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3.tgz#e68a03278e30daea6a110aac5dfa33c60c53055d" - integrity sha512-CM9OEvoN9eXkaX7PXEnbsQLULJ97b9rVmwliZbz/iBOERLJ68Rk3ClJe+fQEMKU4CBZfky2lIRnfslOdUs9SLQ== +"@rails/activestorage@^6.1.4-1": + version "6.1.4-1" + resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.1.4-1.tgz#5088854f536716c54566b530a97491d4b885528f" + integrity sha512-G8L/3o1T8wJXrn24uoBi92XX/S/qPVgP1polNJ5ao03mdU/8tbtW0wWr0MTro4W/zGL23gjZjp2oge4qUTZjDw== + dependencies: + spark-md5 "^3.0.0" + +"@rails/ujs@^6.1.4-1": + version "6.1.4-1" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4-1.tgz#37507fe288a1c7c3a593602aa4dea42e5cb5797f" + integrity sha512-Fewm2wHk1n6Kf4E86dzzHDJOFg4EWcSHH3FsMEGs59bTdmf7099mjkOssOQtBqju4R39iaAOQNui7r8P+Q5Dgg== "@rails/webpacker@5.1.1": version "5.1.1" @@ -1748,56 +1779,56 @@ prop-types "^15.7.2" tslib "^2.3.0" -"@sentry/browser@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.9.0.tgz#b75ac1a6ff8fe60d451b14aea94d66f9dcd5570f" - integrity sha512-4JnEPcwoNs6JqeEd4wscBq+hxpotEJ0DJ4eOIsaNZIMyqEHXBHTXCk/gfrSsiZFrkHM4PgvUHOxaC0HcZ92oBA== +"@sentry/browser@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.11.0.tgz#9e90bbc0488ebcdd1e67937d8d5b4f13c3f6dee0" + integrity sha512-Qr2QRA0t5/S9QQqxzYKvM9W8prvmiWuldfwRX4hubovXzcXLgUi4WK0/H612wSbYZ4dNAEcQbtlxFWJNN4wxdg== dependencies: - "@sentry/core" "6.9.0" - "@sentry/types" "6.9.0" - "@sentry/utils" "6.9.0" + "@sentry/core" "6.11.0" + "@sentry/types" "6.11.0" + "@sentry/utils" "6.11.0" tslib "^1.9.3" -"@sentry/core@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.9.0.tgz#43b25290f3b1eb2c23f665e1c0fcbadd06d06012" - integrity sha512-oFX2qQcMLujCeIuCQGlhpTUIOXiU5n6V2lqDnvMXUV8gKpplBPalwdlR9bgbSi+VO8u7LjHR1IKM0RAPWgNHWw== +"@sentry/core@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.11.0.tgz#40e94043afcf6407a109be26655c77832c64e740" + integrity sha512-09TB+f3pqEq8LFahFWHO6I/4DxHo+NcS52OkbWMDqEi6oNZRD7PhPn3i14LfjsYVv3u3AESU8oxSEGbFrr2UjQ== dependencies: - "@sentry/hub" "6.9.0" - "@sentry/minimal" "6.9.0" - "@sentry/types" "6.9.0" - "@sentry/utils" "6.9.0" + "@sentry/hub" "6.11.0" + "@sentry/minimal" "6.11.0" + "@sentry/types" "6.11.0" + "@sentry/utils" "6.11.0" tslib "^1.9.3" -"@sentry/hub@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.9.0.tgz#21068e12769cc745825e8d122c7e81858f609708" - integrity sha512-5mors7ojbo7G85ZmoVPQBgFBMONAJwyZfV0LNLy14GenoaVNuxTPyvAQiJb1FYq+x6YZ3CvqGX6r74KRKQU87w== +"@sentry/hub@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.11.0.tgz#ddf9ddb0577d1c8290dc02c0242d274fe84d6c16" + integrity sha512-pT9hf+ZJfVFpoZopoC+yJmFNclr4NPqPcl2cgguqCHb69DklD1NxgBNWK8D6X05qjnNFDF991U6t1mxP9HrGuw== dependencies: - "@sentry/types" "6.9.0" - "@sentry/utils" "6.9.0" + "@sentry/types" "6.11.0" + "@sentry/utils" "6.11.0" tslib "^1.9.3" -"@sentry/minimal@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.9.0.tgz#e6201eb237753994be83ec33866e3fdae9a79bf3" - integrity sha512-GBZ6wG2Rc1wInYEl2BZTZc/t57O1Da876ifLsSPpEQAEnGWbqZWb8RLjZskH09ZIL/K4XCIDDi5ySzN8kFUWJw== +"@sentry/minimal@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.11.0.tgz#806d5512658370e40827b3e3663061db708fff33" + integrity sha512-XkZ7qrdlGp4IM/gjGxf1Q575yIbl5RvPbg+WFeekpo16Ufvzx37Mr8c2xsZaWosISVyE6eyFpooORjUlzy8EDw== dependencies: - "@sentry/hub" "6.9.0" - "@sentry/types" "6.9.0" + "@sentry/hub" "6.11.0" + "@sentry/types" "6.11.0" tslib "^1.9.3" -"@sentry/types@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.9.0.tgz#ef1a541c4240df6a7c6f5f31d7cdddd7d92c15f1" - integrity sha512-v52HJqLoLapEnqS2NdVtUXPvT+aezQgNXQkp8hiQ3RUdTm5cffwBVG7wlbpE6OsOOIZxd6p1zKylFkwCypiIIA== +"@sentry/types@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.11.0.tgz#5122685478d32ddacd3a891cbcf550012df85f7c" + integrity sha512-gm5H9eZhL6bsIy/h3T+/Fzzz2vINhHhqd92CjHle3w7uXdTdFV98i2pDpErBGNTSNzbntqOMifYEB5ENtZAvcg== -"@sentry/utils@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.9.0.tgz#6bf0bf290a6d37a27078b7c1331a06d8a7e313c5" - integrity sha512-PimDr6KAi4cCp5hQZ8Az2/pDcdfhTu7WAU30Dd9MZwknpHSTmD4G6QvkdrB5er6kMMnNQOC7rMo6w/Do3m6X3w== +"@sentry/utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.11.0.tgz#d1dee4faf4d9c42c54bba88d5a66fb96b902a14c" + integrity sha512-IOvyFHcnbRQxa++jO+ZUzRvFHEJ1cZjrBIQaNVc0IYF0twUOB5PTP6joTcix38ldaLeapaPZ9LGfudbvYvxkdg== dependencies: - "@sentry/types" "6.9.0" + "@sentry/types" "6.11.0" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -2188,10 +2219,10 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.1.1" @@ -2208,6 +2239,11 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -2251,6 +2287,26 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -2289,12 +2345,17 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: +ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== @@ -2473,15 +2534,6 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - array-includes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" @@ -2493,6 +2545,17 @@ array-includes@^3.1.2: get-intrinsic "^1.0.1" is-string "^1.0.5" +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2515,7 +2578,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flatmap@^1.2.3: +array.prototype.flatmap@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== @@ -2574,10 +2637,10 @@ ast-module-types@^2.3.1, ast-module-types@^2.3.2, ast-module-types@^2.4.0, ast-m resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.6.0.tgz#f9f367fd273bbe01e52f2c51b5f46b65801d5d7f" integrity sha512-zXSoVaMrf2R+r+ISid5/9a8SXm1LLdkhHzh6pSRhj9jklzruOOl1hva1YmFT33wAstg/f9ZndJAlq1BSrFLSGA== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: version "1.0.3" @@ -4261,10 +4324,10 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debounce@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" - integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" @@ -4655,10 +4718,10 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" -dom4@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.5.tgz#f98a94eb67b340f0fa5b42b0ee9c38cda035428e" - integrity sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ== +dom4@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.6.tgz#c90df07134aa0dbd81ed4d6ba1237b36fc164770" + integrity sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA== domain-browser@^1.1.1: version "1.2.0" @@ -4846,6 +4909,13 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" @@ -4877,23 +4947,6 @@ error-stack-parser@^2.0.2, error-stack-parser@^2.0.3: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.0, es-abstract@^1.17.2: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: version "1.17.6" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" @@ -4911,6 +4964,23 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" +es-abstract@^1.17.2: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + es-abstract@^1.18.0-next.0: version "1.18.0-next.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" @@ -4949,6 +5019,29 @@ es-abstract@^1.18.0-next.1: string.prototype.trimend "^1.0.3" string.prototype.trimstart "^1.0.3" +es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19" + integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5000,17 +5093,15 @@ escodegen@^1.8.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== -eslint-plugin-prettier@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" - integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -5019,22 +5110,24 @@ eslint-plugin-react-hooks@^4.2.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== -eslint-plugin-react@^7.22.0: - version "7.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" - integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== +eslint-plugin-react@^7.25.1: + version "7.25.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz#9286b7cd9bf917d40309760f403e53016eda8331" + integrity sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" doctrine "^2.1.0" + estraverse "^5.2.0" has "^1.0.3" jsx-ast-utils "^2.4.1 || ^3.0.0" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.values "^1.1.4" prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.5" eslint-scope@^4.0.3: version "4.0.3" @@ -5044,18 +5137,18 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" @@ -5064,36 +5157,50 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08" - integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg== +eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.1.0" - espree "^7.0.0" - esquery "^1.2.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.14" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -5102,28 +5209,28 @@ eslint@^7.0.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e" - integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -5134,6 +5241,13 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" @@ -5144,6 +5258,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5354,7 +5473,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -5465,12 +5584,12 @@ figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-loader@^6.0.0: version "6.0.0" @@ -5620,20 +5739,24 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0, flatted@^2.0.1: +flatted@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -5888,7 +6011,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -5997,13 +6120,20 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -6078,12 +6208,12 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globby@^10.0.1, globby@^10.0.2: version "10.0.2" @@ -6249,6 +6379,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-color@~0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" @@ -6286,6 +6421,11 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -6293,6 +6433,13 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6633,6 +6780,14 @@ import-fresh@^3.0.0, import-fresh@^3.1.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -6748,25 +6903,6 @@ inquirer@^6.5.1: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -6775,14 +6911,14 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" + side-channel "^1.0.4" interpret@1.2.0: version "1.2.0" @@ -6868,6 +7004,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -6882,6 +7025,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -6902,6 +7053,11 @@ is-callable@^1.2.2: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -7066,6 +7222,13 @@ is-npm@^4.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7141,6 +7304,14 @@ is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.1: dependencies: has-symbols "^1.0.1" +is-regex@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -7166,6 +7337,13 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -7180,6 +7358,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -7353,6 +7538,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -7784,6 +7974,11 @@ lodash.transform@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -8801,6 +8996,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + object-inspect@^1.7.0, object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" @@ -8856,24 +9056,23 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== +object.entries@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.18.2" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" object.getownpropertydescriptors@^2.1.0: @@ -8891,7 +9090,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: +object.values@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -8901,6 +9100,15 @@ object.values@^1.1.0, object.values@^1.1.1: function-bind "^1.1.1" has "^1.0.3" +object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -10196,10 +10404,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +prettier@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== pretty-format@^24.9.0: version "24.9.0" @@ -10693,7 +10901,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: +regexp.prototype.flags@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -10701,6 +10909,14 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -10807,6 +11023,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -10866,14 +11087,6 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1 dependencies: path-parse "^1.0.6" -resolve@^1.18.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - resolve@^2.0.0-next.1: version "2.0.0-next.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.1.tgz#4d96ccb89bf82d54ab037241ae053db4e92bb5f1" @@ -10881,6 +11094,14 @@ resolve@^2.0.0-next.1: dependencies: path-parse "^1.0.6" +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -10936,13 +11157,6 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: dependencies: glob "^7.1.3" -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -10992,13 +11206,6 @@ rxjs@^6.4.0, rxjs@^6.6.2: dependencies: tslib "^1.9.0" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -11272,13 +11479,14 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" @@ -11302,14 +11510,14 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" slug@^0.9.1: version "0.9.4" @@ -11669,17 +11877,19 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== +string.prototype.matchall@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1: version "1.0.1" @@ -11697,6 +11907,14 @@ string.prototype.trimend@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string.prototype.trimleft@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" @@ -11731,6 +11949,14 @@ string.prototype.trimstart@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -11831,6 +12057,11 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -11950,15 +12181,17 @@ tabbable@^4.0.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-4.0.0.tgz#5bff1d1135df1482cf0f0206434f15eadbeb9261" integrity sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -12336,6 +12569,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.3.0, type-fest@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -12383,6 +12621,16 @@ uid-safe@2.1.5: dependencies: random-bytes "~1.0.0" +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unbzip2-stream@^1.0.9: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -12975,6 +13223,17 @@ whatwg-fetch@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -13108,13 +13367,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^6.0.0, ws@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"