diff --git a/.github/ISSUE_TEMPLATE/am-lioration.md b/.github/ISSUE_TEMPLATE/am-lioration.md new file mode 100644 index 000000000..4780dd3ef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/am-lioration.md @@ -0,0 +1,17 @@ +--- +name: Amélioration +about: Suggérer une amélioration ou une nouvelle fonctionnalité +title: '' +labels: idea +assignees: '' + +--- + +**Votre amélioration est liée à un problème spécifique ?** +Si oui, décrivez brièvement quel est le problème que vous rencontrez. Par exemple : Sur demarches-simplifiees.fr, je suis agacé quand je dois […] + +**Décrivez la solution proposée** +Une description rapide de la manière dont vous voudriez résoudre le problème. + +**Plus de contexte** +Ajoutez éventuellement des éléments de contexte concernant votre proposition d'amélioration, ou des captures d'écran. diff --git a/.github/ISSUE_TEMPLATE/rapport-de-bug.md b/.github/ISSUE_TEMPLATE/rapport-de-bug.md new file mode 100644 index 000000000..24208d7ac --- /dev/null +++ b/.github/ISSUE_TEMPLATE/rapport-de-bug.md @@ -0,0 +1,27 @@ +--- +name: Rapport de bug +about: Remonter une erreur ou un plantage +title: '' +labels: bug +assignees: '' + +--- + +**Décrivez le bug** +Une description claire et concise du problème, en une phrase ou deux. + +**Reproduction** +Comment reproduire le problème : +1. Aller sur la page '...' +2. Cliquez sur '...' +3. Une erreur '.....' apparaît + +**Comportement attendu** +Comment le site aurait-il dû se comporter ? + +**Capture d'écran** +Si besoin, ajoutez une capture d'écran de votre problème. Cela nous aide à identifier plus rapidement le souci. + +**Appareil et navigateur utilisé** + - Appareil : [par exemple PC, Mac, iPhone, Android] + - Navigateur : [par exemple Firefox, Chrome, Safari] diff --git a/Gemfile b/Gemfile index 455fe2e23..a7b346436 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ gem 'active_model_serializers' gem 'activestorage-openstack', git: 'https://github.com/fredZen/activestorage-openstack.git', branch: 'frederic/fix_upload_signature' gem 'administrate' gem 'after_party' +gem 'anchored' gem 'axlsx', '~> 3.0.0.pre' # https://github.com/randym/axlsx/issues/501#issuecomment-373640365 gem 'bcrypt' gem 'bootstrap-sass', '>= 3.4.1' @@ -67,7 +68,6 @@ gem 'sassc-rails' # Use SCSS for stylesheets gem 'scenic' gem 'select2-rails' gem 'sentry-raven' -gem 'simple_form' gem 'skylight' gem 'smart_listing' gem 'spreadsheet_architect' diff --git a/Gemfile.lock b/Gemfile.lock index fdc04cea0..1336fb19c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -95,6 +95,7 @@ GEM selectize-rails (~> 0.6) aes_key_wrap (1.0.1) after_party (1.10.0) + anchored (1.1.0) arel (9.0.0) ast (2.4.0) attr_required (1.0.1) @@ -574,7 +575,7 @@ GEM ruby_dep (1.5.0) ruby_parser (3.12.0) sexp_processor (~> 4.9) - rubyzip (1.2.2) + rubyzip (1.3.0) safe_yaml (1.0.4) sanitize-url (0.1.4) sass (3.7.3) @@ -615,9 +616,6 @@ GEM shellany (0.0.1) shoulda-matchers (4.0.1) activesupport (>= 4.2.0) - simple_form (4.1.0) - actionpack (>= 5.0) - activemodel (>= 5.0) simple_xlsx_reader (1.0.4) nokogiri rubyzip @@ -722,6 +720,7 @@ DEPENDENCIES activestorage-openstack! administrate after_party + anchored axlsx (~> 3.0.0.pre) bcrypt bootstrap-sass (>= 3.4.1) @@ -807,7 +806,6 @@ DEPENDENCIES select2-rails sentry-raven shoulda-matchers - simple_form simple_xlsx_reader skylight smart_listing diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9927b5b81..5dc25e5dd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -262,6 +262,12 @@ class ApplicationController < ActionController::Base def crisp_config crisp = Rails.application.secrets.crisp + nb_demarches_by_state = if current_administrateur.present? + current_administrateur.procedures.group(:aasm_state).count + else + {} + end + { key: crisp[:client_key], enabled: crisp[:enabled], @@ -270,10 +276,9 @@ class ApplicationController < ActionController::Base DS_SIGN_IN_COUNT: current_user&.sign_in_count, DS_CREATED_AT: current_administrateur&.created_at, DS_ID: current_administrateur&.id, - DS_NB_DEMARCHES_BROUILLONS: current_administrateur&.procedures&.brouillons&.count, - DS_NB_DEMARCHES_ACTIVES: current_administrateur&.procedures&.publiees&.count, - DS_NB_DEMARCHES_ARCHIVES: current_administrateur&.procedures&.archivees&.count - + DS_NB_DEMARCHES_BROUILLONS: nb_demarches_by_state['brouillon'], + DS_NB_DEMARCHES_ACTIVES: nb_demarches_by_state['publiee'], + DS_NB_DEMARCHES_ARCHIVES: nb_demarches_by_state['archivee'] } } end diff --git a/app/controllers/instructeurs/dossiers_controller.rb b/app/controllers/instructeurs/dossiers_controller.rb index 400c06eb5..f707d1950 100644 --- a/app/controllers/instructeurs/dossiers_controller.rb +++ b/app/controllers/instructeurs/dossiers_controller.rb @@ -112,12 +112,8 @@ module Instructeurs if dossier.en_instruction? flash.notice = 'Le dossier est déjà en instruction.' else - if dossier.accepte? - flash.notice = 'Il n’est pas possible de repasser un dossier accepté en instruction.' - else - flash.notice = "Le dossier #{dossier.id} a été repassé en instruction." - dossier.repasser_en_instruction!(current_instructeur) - end + flash.notice = "Le dossier #{dossier.id} a été repassé en instruction." + dossier.repasser_en_instruction!(current_instructeur) end render partial: 'state_button_refresh', locals: { dossier: dossier } @@ -183,7 +179,7 @@ module Instructeurs end def telecharger_pjs - return head(:forbidden) if !feature_enabled?(:instructeur_download_as_zip) || !dossier.attachments_downloadable? + return head(:forbidden) if !dossier.attachments_downloadable? files = ActiveStorage::DownloadableFile.create_list_from_dossier(dossier) diff --git a/app/helpers/champ_helper.rb b/app/helpers/champ_helper.rb index ba376d8bb..b761e914d 100644 --- a/app/helpers/champ_helper.rb +++ b/app/helpers/champ_helper.rb @@ -17,4 +17,12 @@ module ChampHelper { type_de_champ_id: champ.type_de_champ_id } end end + + def format_text_value(text) + sanitized_text = sanitize(text) + auto_linked_text = Anchored::Linker.auto_link(sanitized_text, target: '_blank', rel: 'noopener') do |link_href| + truncate(link_href, length: 60) + end + simple_format(auto_linked_text, {}, sanitize: false) + end end diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb index c0a32352e..250953cdd 100644 --- a/app/models/administrateur.rb +++ b/app/models/administrateur.rb @@ -13,7 +13,7 @@ class Administrateur < ApplicationRecord before_validation -> { sanitize_email(:email) } - scope :inactive, -> { where(active: false) } + scope :inactive, -> { joins(:user).where(users: { last_sign_in_at: nil }) } scope :with_publiees_ou_archivees, -> { joins(:procedures).where(procedures: { aasm_state: [:publiee, :archivee] }) } # validate :password_complexity, if: Proc.new { |a| Devise.password_length.include?(a.password.try(:size)) } diff --git a/app/models/user.rb b/app/models/user.rb index 1f5217767..c49cd2718 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -21,6 +21,8 @@ class User < ApplicationRecord accepts_nested_attributes_for :france_connect_information + default_scope { eager_load(:instructeur, :administrateur) } + before_validation -> { sanitize_email(:email) } # Callback provided by Devise diff --git a/app/policies/application_policy.rb b/app/policies/application_policy.rb index 91d5d2e01..dfebff858 100644 --- a/app/policies/application_policy.rb +++ b/app/policies/application_policy.rb @@ -34,7 +34,7 @@ class ApplicationPolicy false end - class Scope + class ApplicationScope attr_reader :user, :instructeur, :administrateur, :scope def initialize(account, scope) diff --git a/app/policies/champ_policy.rb b/app/policies/champ_policy.rb index 26bd9a01a..81d2eb11b 100644 --- a/app/policies/champ_policy.rb +++ b/app/policies/champ_policy.rb @@ -1,13 +1,25 @@ class ChampPolicy < ApplicationPolicy - class Scope < Scope + class Scope < ApplicationScope def resolve - if user.present? - scope - .joins(:dossier) - .where({ dossiers: { user_id: user.id } }) - else - scope.none + if user.blank? + return scope.none end + + # Users can access public champs on their own dossiers. + resolved_scope = scope + .left_outer_joins(dossier: { groupe_instructeur: [:instructeurs] }) + .where('dossiers.user_id': user.id, private: false) + + if instructeur.present? + # Additionnaly, instructeurs can access private champs + # on dossiers they are allowed to instruct. + instructeur_clause = scope + .left_outer_joins(dossier: { groupe_instructeur: [:instructeurs] }) + .where('instructeurs.id': instructeur.id, private: true) + resolved_scope = resolved_scope.or(instructeur_clause) + end + + resolved_scope end end end diff --git a/app/policies/type_de_champ_policy.rb b/app/policies/type_de_champ_policy.rb index 3f8390014..98bd57ec6 100644 --- a/app/policies/type_de_champ_policy.rb +++ b/app/policies/type_de_champ_policy.rb @@ -1,5 +1,5 @@ class TypeDeChampPolicy < ApplicationPolicy - class Scope < Scope + class Scope < ApplicationScope def resolve if administrateur.present? scope diff --git a/app/views/admin/mail_templates/edit.html.haml b/app/views/admin/mail_templates/edit.html.haml index c423fe418..e515cf7f3 100644 --- a/app/views/admin/mail_templates/edit.html.haml +++ b/app/views/admin/mail_templates/edit.html.haml @@ -4,17 +4,23 @@ %h3 = @mail_template.class.const_get(:DISPLAYED_NAME) - = simple_form_for @mail_template, + = form_for @mail_template, as: 'mail_template', url: admin_procedure_mail_template_path(@procedure, @mail_template.class.const_get(:SLUG)), method: :put do |f| .row .col-md-6 - = f.input :subject, label: "Objet de l'email" - = f.input :body, label: "Corps de l'email", input_html: { class: 'wysihtml5' } + .form-group.string.optional.mail_template_subject + = f.label :subject, "Objet de l'email", class: 'control-label string optional' + = f.text_field :subject, class: 'form-control string optional' + + .form-group.text.optional.mail_template_body + = f.label :body, "Corps de l'email", class: 'control-label string optional' + = f.text_area :body, class: 'wysihtml5 form-control text optional' + .text-right = link_to "Annuler", admin_procedure_mail_templates_path(@procedure), class: "btn btn-default" - = f.button :submit, 'Mettre à jour', class: "btn-success" + = f.submit 'Mettre à jour', class: "btn btn-default btn-success" = link_to "Prévisualiser", preview_procedure_mail_template_path(@procedure, @mail_template.class.const_get(:SLUG)), class: "btn btn-primary", target: "_blank" .row diff --git a/app/views/instructeurs/dossiers/_header_actions.html.haml b/app/views/instructeurs/dossiers/_header_actions.html.haml index 27c428f59..1df589d7a 100644 --- a/app/views/instructeurs/dossiers/_header_actions.html.haml +++ b/app/views/instructeurs/dossiers/_header_actions.html.haml @@ -7,7 +7,7 @@ %li = link_to "Uniquement cet onglet", "#", onclick: "window.print()", class: "menu-item menu-link" -- if feature_enabled?(:instructeur_download_as_zip) && !PiecesJustificativesService.liste_pieces_justificatives(dossier).empty? +- if !PiecesJustificativesService.liste_pieces_justificatives(dossier).empty? %span.dropdown.print-menu-opener %button.button.dropdown-button.icon-only %span.icon.attachment diff --git a/app/views/instructeurs/dossiers/_state_button.html.haml b/app/views/instructeurs/dossiers/_state_button.html.haml index fb732382a..9574d6987 100644 --- a/app/views/instructeurs/dossiers/_state_button.html.haml +++ b/app/views/instructeurs/dossiers/_state_button.html.haml @@ -1,4 +1,4 @@ -- if dossier.en_construction? || dossier.en_instruction? +- if dossier.en_construction? || dossier.en_instruction? || dossier.accepte? %span.dropdown %button.button.primary.dropdown-button = dossier_display_state dossier @@ -17,6 +17,13 @@ %h4 Passer en instruction L'usager ne pourra plus modifier le formulaire + - if dossier.accepte? + %li + = link_to repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote: true, confirm: "Confirmez-vous le passage en instruction de ce dossier ?" } do + %span.icon.in-progress + .dropdown-description + %h4 Passer en instruction + L'usager ne pourra plus modifier le formulaire - if dossier.en_instruction? %li = link_to repasser_en_construction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Confirmez-vous le passage en construction de ce dossier ?" } do diff --git a/app/views/shared/champs/textarea/_show.html.haml b/app/views/shared/champs/textarea/_show.html.haml index cd7684777..5e5b33245 100644 --- a/app/views/shared/champs/textarea/_show.html.haml +++ b/app/views/shared/champs/textarea/_show.html.haml @@ -1 +1 @@ -= simple_format(champ.to_s) += format_text_value(champ.to_s) diff --git a/app/views/shared/dossiers/_champ_row.html.haml b/app/views/shared/dossiers/_champ_row.html.haml index 66d5b4807..8670a15c0 100644 --- a/app/views/shared/dossiers/_champ_row.html.haml +++ b/app/views/shared/dossiers/_champ_row.html.haml @@ -35,7 +35,7 @@ - when TypeDeChamp.type_champs.fetch(:datetime) = c.to_s - else - = sanitize(c.to_s) + = format_text_value(c.to_s) - if c.type_champ != TypeDeChamp.type_champs.fetch(:header_section) %td.updated-at diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index 53d6f2820..e8172d0da 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -30,7 +30,6 @@ features = [ :administrateur_web_hook, :insee_api_v3, :instructeur_bypass_email_login_token, - :instructeur_download_as_zip, :maintenance_mode, :mini_profiler, :operation_log_serialize_subject, diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb deleted file mode 100644 index f306c195a..000000000 --- a/config/initializers/simple_form.rb +++ /dev/null @@ -1,169 +0,0 @@ -# Use this setup block to configure all options available in SimpleForm. -SimpleForm.setup do |config| - # Wrappers are used by the form builder to generate a - # complete input. You can remove any component from the - # wrapper, change the order or even add your own to the - # stack. The options given below are used to wrap the - # whole input. - config.wrappers :default, class: :input, - hint_class: :field_with_hint, error_class: :field_with_errors do |b| - ## Extensions enabled by default - # Any of these extensions can be disabled for a - # given input by passing: `f.input EXTENSION_NAME => false`. - # You can make any of these extensions optional by - # renaming `b.use` to `b.optional`. - - # Determines whether to use HTML5 (:email, :url, ...) - # and required attributes - b.use :html5 - - # Calculates placeholders automatically from I18n - # You can also pass a string as f.input placeholder: "Placeholder" - b.use :placeholder - - ## Optional extensions - # They are disabled unless you pass `f.input EXTENSION_NAME => true` - # to the input. If so, they will retrieve the values from the model - # if any exists. If you want to enable any of those - # extensions by default, you can change `b.optional` to `b.use`. - - # Calculates maxlength from length validations for string inputs - # and/or database column lengths - b.optional :maxlength - - # Calculate minlength from length validations for string inputs - b.optional :minlength - - # Calculates pattern from format validations for string inputs - b.optional :pattern - - # Calculates min and max from length validations for numeric inputs - b.optional :min_max - - # Calculates readonly automatically from readonly attributes - b.optional :readonly - - ## Inputs - b.use :label_input - b.use :hint, wrap_with: { tag: :span, class: :hint } - b.use :error, wrap_with: { tag: :span, class: :error } - - ## full_messages_for - # If you want to display the full error message for the attribute, you can - # use the component :full_error, like: - # - # b.use :full_error, wrap_with: { tag: :span, class: :error } - end - - # The default wrapper to be used by the FormBuilder. - config.default_wrapper = :default - - # Define the way to render check boxes / radio buttons with labels. - # Defaults to :nested for bootstrap config. - # inline: input + label - # nested: label > input - config.boolean_style = :nested - - # Default class for buttons - config.button_class = 'btn' - - # Method used to tidy up errors. Specify any Rails Array method. - # :first lists the first message for each field. - # Use :to_sentence to list all errors for each field. - # config.error_method = :first - - # Default tag used for error notification helper. - config.error_notification_tag = :div - - # CSS class to add for error notification helper. - config.error_notification_class = 'error_notification' - - # ID to add for error notification helper. - # config.error_notification_id = nil - - # Series of attempts to detect a default label method for collection. - # config.collection_label_methods = [ :to_label, :name, :title, :to_s ] - - # Series of attempts to detect a default value method for collection. - # config.collection_value_methods = [ :id, :to_s ] - - # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none. - # config.collection_wrapper_tag = nil - - # You can define the class to use on all collection wrappers. Defaulting to none. - # config.collection_wrapper_class = nil - - # You can wrap each item in a collection of radio/check boxes with a tag, - # defaulting to :span. - # config.item_wrapper_tag = :span - - # You can define a class to use in all item wrappers. Defaulting to none. - # config.item_wrapper_class = nil - - # How the label text should be generated altogether with the required text. - # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" } - - # You can define the class to use on all labels. Default is nil. - # config.label_class = nil - - # You can define the default class to be used on forms. Can be overriden - # with `html: { :class }`. Defaulting to none. - # config.default_form_class = nil - - # You can define which elements should obtain additional classes - # config.generate_additional_classes_for = [:wrapper, :label, :input] - - # Whether attributes are required by default (or not). Default is true. - # config.required_by_default = true - - # Tell browsers whether to use the native HTML5 validations (novalidate form option). - # These validations are enabled in SimpleForm's internal config but disabled by default - # in this configuration, which is recommended due to some quirks from different browsers. - # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations, - # change this configuration to true. - config.browser_validations = false - - # Collection of methods to detect if a file type was given. - # config.file_methods = [ :mounted_as, :file?, :public_filename ] - - # Custom mappings for input types. This should be a hash containing a regexp - # to match as key, and the input type that will be used when the field name - # matches the regexp as value. - # config.input_mappings = { /count/ => :integer } - - # Custom wrappers for input types. This should be a hash containing an input - # type as key and the wrapper that will be used for all inputs with specified type. - # config.wrapper_mappings = { string: :prepend } - - # Namespaces where SimpleForm should look for custom input classes that - # override default inputs. - # config.custom_inputs_namespaces << "CustomInputs" - - # Default priority for time_zone inputs. - # config.time_zone_priority = nil - - # Default priority for country inputs. - # config.country_priority = nil - - # When false, do not use translations for labels. - # config.translate_labels = true - - # Automatically discover new inputs in Rails' autoload path. - # config.inputs_discovery = true - - # Cache SimpleForm inputs discovery - # config.cache_discovery = !Rails.env.development? - - # Default class for inputs - # config.input_class = nil - - # Define the default class of the input wrapper of the boolean input. - config.boolean_label_class = 'checkbox' - - # Defines if the default input wrapper class should be included in radio - # collection wrappers. - # config.include_default_input_wrapper_class = true - - # Defines which i18n scope will be used in Simple Form. - # config.i18n_scope = 'simple_form' -end diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb deleted file mode 100644 index c7705e8e7..000000000 --- a/config/initializers/simple_form_bootstrap.rb +++ /dev/null @@ -1,154 +0,0 @@ -# Use this setup block to configure all options available in SimpleForm. -SimpleForm.setup do |config| - config.error_notification_class = 'alert alert-danger' - config.button_class = 'btn btn-default' - config.boolean_label_class = nil - - config.wrappers :vertical_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.use :placeholder - b.optional :maxlength - b.optional :minlength - b.optional :pattern - b.optional :min_max - b.optional :readonly - b.use :label, class: 'control-label' - - b.use :input, class: 'form-control' - b.use :error, wrap_with: { tag: 'span', class: 'help-block' } - b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - - config.wrappers :vertical_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.use :placeholder - b.optional :maxlength - b.optional :minlength - b.optional :readonly - b.use :label, class: 'control-label' - - b.use :input - b.use :error, wrap_with: { tag: 'span', class: 'help-block' } - b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - - config.wrappers :vertical_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.optional :readonly - - b.wrapper tag: 'div', class: 'checkbox' do |ba| - ba.use :label_input - end - - b.use :error, wrap_with: { tag: 'span', class: 'help-block' } - b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - - config.wrappers :vertical_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.optional :readonly - b.use :label, class: 'control-label' - b.use :input - b.use :error, wrap_with: { tag: 'span', class: 'help-block' } - b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - - config.wrappers :horizontal_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.use :placeholder - b.optional :maxlength - b.optional :minlength - b.optional :pattern - b.optional :min_max - b.optional :readonly - b.use :label, class: 'col-sm-3 control-label' - - b.wrapper tag: 'div', class: 'col-sm-9' do |ba| - ba.use :input, class: 'form-control' - ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } - ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - end - - config.wrappers :horizontal_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.use :placeholder - b.optional :maxlength - b.optional :minlength - b.optional :readonly - b.use :label, class: 'col-sm-3 control-label' - - b.wrapper tag: 'div', class: 'col-sm-9' do |ba| - ba.use :input - ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } - ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - end - - config.wrappers :horizontal_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.optional :readonly - - b.wrapper tag: 'div', class: 'col-sm-offset-3 col-sm-9' do |wr| - wr.wrapper tag: 'div', class: 'checkbox' do |ba| - ba.use :label_input - end - - wr.use :error, wrap_with: { tag: 'span', class: 'help-block' } - wr.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - end - - config.wrappers :horizontal_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.optional :readonly - - b.use :label, class: 'col-sm-3 control-label' - - b.wrapper tag: 'div', class: 'col-sm-9' do |ba| - ba.use :input - ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } - ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - end - - config.wrappers :inline_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.use :placeholder - b.optional :maxlength - b.optional :minlength - b.optional :pattern - b.optional :min_max - b.optional :readonly - b.use :label, class: 'sr-only' - - b.use :input, class: 'form-control' - b.use :error, wrap_with: { tag: 'span', class: 'help-block' } - b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - - config.wrappers :multi_select, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| - b.use :html5 - b.optional :readonly - b.use :label, class: 'control-label' - b.wrapper tag: 'div', class: 'form-inline' do |ba| - ba.use :input, class: 'form-control' - ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } - ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } - end - end - # Wrappers for forms and inputs using the Bootstrap toolkit. - # Check the Bootstrap docs (http://getbootstrap.com) - # to learn about the different styles for forms and inputs, - # buttons and other elements. - config.default_wrapper = :vertical_form - config.wrapper_mappings = { - check_boxes: :vertical_radio_and_checkboxes, - radio_buttons: :vertical_radio_and_checkboxes, - file: :vertical_file_input, - boolean: :vertical_boolean, - datetime: :multi_select, - date: :multi_select, - time: :multi_select - } -end diff --git a/lib/tasks/cloud_storage.rake b/lib/tasks/cloud_storage.rake index c37e8798f..2a276ac55 100644 --- a/lib/tasks/cloud_storage.rake +++ b/lib/tasks/cloud_storage.rake @@ -1,3 +1,5 @@ +require Rails.root.join("lib", "tasks", "task_helper") + namespace :cloudstorage do task init: :environment do os_config = (YAML.load_file(Fog.credentials_path))['default'] @@ -28,7 +30,7 @@ namespace :cloudstorage do if !(content.current_path.nil? || File.exist?(File.dirname(content.current_path) + '/uploaded')) secure_token = SecureRandom.uuid filename = "#{entry.class.to_s.underscore}-#{secure_token}#{File.extname(content.current_path)}" - puts "Uploading #{content.current_path}" + rake_puts "Uploading #{content.current_path}" begin @cont.create_object(filename, {}, File.open(content.current_path)) @@ -39,7 +41,7 @@ namespace :cloudstorage do entry.update_column(c == Procedure ? :logo : :content, filename) entry.update_column(c == Procedure ? :logo_secure_token : :content_secure_token, secure_token) rescue Errno::ENOENT - puts "ERROR: #{content.current_path} does not exist!" + rake_puts "ERROR: #{content.current_path} does not exist!" File.open('upload_errors.report', "a+") { |f| f.write(content.current_path) } error_count += 1 end @@ -51,15 +53,15 @@ namespace :cloudstorage do entry.update_column(c == Procedure ? :logo : :content, filename) entry.update_column(c == Procedure ? :logo_secure_token : :content_secure_token, secure_token) - puts "RESTORE IN DATABASE: #{filename} " + rake_puts "RESTORE IN DATABASE: #{filename} " elsif content.current_path.present? - puts "Skipping #{content.current_path}" + rake_puts "Skipping #{content.current_path}" end end end end - puts "There were #{error_count} errors while uploading files. See upload_errors.report file for details." + rake_puts "There were #{error_count} errors while uploading files. See upload_errors.report file for details." puts 'Enf of migration' end @@ -77,7 +79,7 @@ namespace :cloudstorage do entry.update_column(c == Procedure ? :logo : :content, previous_filename) entry.update_column(c == Procedure ? :logo_secure_token : :content_secure_token, nil) - puts "restoring #{content.current_path} db data to #{previous_filename}" + rake_puts "restoring #{content.current_path} db data to #{previous_filename}" @cont.delete_object(File.open(File.dirname(content.current_path) + '/filename_cloudstorage', "r").read) @@ -95,7 +97,7 @@ namespace :cloudstorage do Rake::Task['cloudstorage:init'].invoke @cont.objects.each do |object| - puts "Removing #{object}" + rake_puts "Removing #{object}" @cont.delete_object(object) end end diff --git a/lib/tasks/deployment/20181219122438_fix_email_templates_subjects.rake b/lib/tasks/deployment/20181219122438_fix_email_templates_subjects.rake index fb3677251..1ab01d810 100644 --- a/lib/tasks/deployment/20181219122438_fix_email_templates_subjects.rake +++ b/lib/tasks/deployment/20181219122438_fix_email_templates_subjects.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: fix_email_templates_subjects' task fix_email_templates_subjects: :environment do - puts "Running deploy task 'fix_email_templates_subjects'" + rake_puts "Running deploy task 'fix_email_templates_subjects'" klasses = [ Mails::ClosedMail, diff --git a/lib/tasks/deployment/20181219175043_migrate_types_de_champ_options_to_json.rake b/lib/tasks/deployment/20181219175043_migrate_types_de_champ_options_to_json.rake index c27d5d3b5..15a55e931 100644 --- a/lib/tasks/deployment/20181219175043_migrate_types_de_champ_options_to_json.rake +++ b/lib/tasks/deployment/20181219175043_migrate_types_de_champ_options_to_json.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: migrate_types_de_champ_options_to_json' task migrate_types_de_champ_options_to_json: :environment do - puts "Running deploy task 'migrate_types_de_champ_options_to_json'" + rake_puts "Running deploy task 'migrate_types_de_champ_options_to_json'" dirty_tdcs = TypeDeChamp.where.not(options: nil) progress = ProgressReport.new(dirty_tdcs.count) diff --git a/lib/tasks/deployment/20190212164238_fix_macedonia.rake b/lib/tasks/deployment/20190212164238_fix_macedonia.rake index f16deedcc..7ecb2f501 100644 --- a/lib/tasks/deployment/20190212164238_fix_macedonia.rake +++ b/lib/tasks/deployment/20190212164238_fix_macedonia.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: fix_macedonia' task fix_macedonia: :environment do - puts "Running deploy task 'fix_macedonia'" + rake_puts "Running deploy task 'fix_macedonia'" # Put your task implementation HERE. diff --git a/lib/tasks/deployment/20190306172842_create_default_path_for_brouillons.rake b/lib/tasks/deployment/20190306172842_create_default_path_for_brouillons.rake index 295bc5a84..1a14f49ba 100644 --- a/lib/tasks/deployment/20190306172842_create_default_path_for_brouillons.rake +++ b/lib/tasks/deployment/20190306172842_create_default_path_for_brouillons.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: create_default_path_for_brouillons' task create_default_path_for_brouillons: :environment do - puts "Running deploy task 'create_default_path_for_brouillons'" + rake_puts "Running deploy task 'create_default_path_for_brouillons'" # Put your task implementation HERE. diff --git a/lib/tasks/deployment/20190410131747_migrate_mail_body_to_actiontext.rake b/lib/tasks/deployment/20190410131747_migrate_mail_body_to_actiontext.rake index d466d35a1..36b92bd94 100644 --- a/lib/tasks/deployment/20190410131747_migrate_mail_body_to_actiontext.rake +++ b/lib/tasks/deployment/20190410131747_migrate_mail_body_to_actiontext.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: migrate_mail_body_to_actiontext' task migrate_mail_body_to_actiontext: :environment do - puts "Running deploy task 'migrate_mail_body_to_actiontext'" + rake_puts "Running deploy task 'migrate_mail_body_to_actiontext'" # Put your task implementation HERE. diff --git a/lib/tasks/deployment/20190418144354_add_missing_dossier_id_to_repetitions.rake b/lib/tasks/deployment/20190418144354_add_missing_dossier_id_to_repetitions.rake index 06538ea05..9c4b442ff 100644 --- a/lib/tasks/deployment/20190418144354_add_missing_dossier_id_to_repetitions.rake +++ b/lib/tasks/deployment/20190418144354_add_missing_dossier_id_to_repetitions.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: add_missing_dossier_id_to_repetitions' task add_missing_dossier_id_to_repetitions: :environment do - puts "Running deploy task 'add_missing_dossier_id_to_repetitions'" + rake_puts "Running deploy task 'add_missing_dossier_id_to_repetitions'" champs = Champ.where(dossier_id: nil) progress = ProgressReport.new(champs.count) diff --git a/lib/tasks/deployment/20190523122639_set_declarative_procedures.rake b/lib/tasks/deployment/20190523122639_set_declarative_procedures.rake index ba2c11d7a..56503b5c7 100644 --- a/lib/tasks/deployment/20190523122639_set_declarative_procedures.rake +++ b/lib/tasks/deployment/20190523122639_set_declarative_procedures.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: set_declarative_procedures' task set_declarative_procedures: :environment do - puts "Running deploy task 'set_declarative_procedures'" + rake_puts "Running deploy task 'set_declarative_procedures'" Delayed::Job.where.not(cron: nil).find_each do |job| job_data = YAML.load_dj(job.handler).job_data diff --git a/lib/tasks/deployment/20190704133852_create_dummy_paths_for_archived_and_hidden_procedures.rake b/lib/tasks/deployment/20190704133852_create_dummy_paths_for_archived_and_hidden_procedures.rake index 5562087a5..355686953 100644 --- a/lib/tasks/deployment/20190704133852_create_dummy_paths_for_archived_and_hidden_procedures.rake +++ b/lib/tasks/deployment/20190704133852_create_dummy_paths_for_archived_and_hidden_procedures.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: create_dummy_paths_for_archived_and_hidden_procedures' task create_dummy_paths_for_archived_and_hidden_procedures: :environment do - puts "Running deploy task 'create_dummy_paths_for_archived_procedures'" + rake_puts "Running deploy task 'create_dummy_paths_for_archived_procedures'" Procedure.unscoped.archivees.where(path: nil).each do |p| p.update_column(:path, SecureRandom.uuid) diff --git a/lib/tasks/deployment/20190731152733_migrate_geo_area_data.rake b/lib/tasks/deployment/20190731152733_migrate_geo_area_data.rake index 43cde414b..e5821d722 100644 --- a/lib/tasks/deployment/20190731152733_migrate_geo_area_data.rake +++ b/lib/tasks/deployment/20190731152733_migrate_geo_area_data.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: migrate_geo_area_data' task migrate_geo_area_data: :environment do - puts "Running deploy task 'migrate_geo_area_data'" + rake_puts "Running deploy task 'migrate_geo_area_data'" progress = ProgressReport.new(Champs::CarteChamp.count) diff --git a/lib/tasks/deployment/20190828130014_rename_active_storage_attachments.rake b/lib/tasks/deployment/20190828130014_rename_active_storage_attachments.rake index 11e5fd671..c54ce5708 100644 --- a/lib/tasks/deployment/20190828130014_rename_active_storage_attachments.rake +++ b/lib/tasks/deployment/20190828130014_rename_active_storage_attachments.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: rename_active_storage_attachments' task rename_active_storage_attachments: :environment do - puts "Running deploy task 'rename_active_storage_attachments'" + rake_puts "Running deploy task 'rename_active_storage_attachments'" ActiveStorage::Attachment.where(name: 'logo_active_storage').update_all(name: 'logo') ActiveStorage::Attachment.where(name: 'signature_active_storage').update_all(name: 'signature') diff --git a/lib/tasks/deployment/20190829065022_migrate_flipflop_to_flipper.rake b/lib/tasks/deployment/20190829065022_migrate_flipflop_to_flipper.rake index 6d1a3c9a8..4892d71de 100644 --- a/lib/tasks/deployment/20190829065022_migrate_flipflop_to_flipper.rake +++ b/lib/tasks/deployment/20190829065022_migrate_flipflop_to_flipper.rake @@ -1,7 +1,7 @@ namespace :after_party do desc 'Deployment task: migrate_flipflop_to_flipper' task migrate_flipflop_to_flipper: :environment do - puts "Running deploy task 'migrate_flipflop_to_flipper'" + rake_puts "Running deploy task 'migrate_flipflop_to_flipper'" Instructeur.includes(:user).find_each do |instructeur| if instructeur.features['download_as_zip_enabled'] diff --git a/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake b/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake new file mode 100644 index 000000000..45218712a --- /dev/null +++ b/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake @@ -0,0 +1,17 @@ +namespace :after_party do + desc 'Deployment task: update_admin_last_sign_in_at' + task update_admin_last_sign_in_at: :environment do + sql = <<-SQL + UPDATE users + SET last_sign_in_at = administrateurs.updated_at + FROM administrateurs + WHERE administrateur_id = administrateurs.id + AND users.last_sign_in_at IS NULL + AND administrateurs.active = true + SQL + + ActiveRecord::Base.connection.execute(sql) + + AfterParty::TaskRecord.create version: '20191007124230' + end +end diff --git a/lib/tasks/superadmin.rake b/lib/tasks/superadmin.rake index 67c2dabbf..b9673a2b7 100644 --- a/lib/tasks/superadmin.rake +++ b/lib/tasks/superadmin.rake @@ -1,9 +1,11 @@ +require Rails.root.join("lib", "tasks", "task_helper") + namespace :superadmin do desc <<~EOD List all super-admins EOD task list: :environment do - puts "All Administrations:" + rake_puts "All Administrations:" Administration.all.pluck(:email).each do |a| puts a end @@ -15,13 +17,13 @@ namespace :superadmin do task :create, [:email] => :environment do |_t, args| email = args[:email] - puts "Creating Administration for #{email}" + rake_puts "Creating Administration for #{email}" a = Administration.new(email: email, password: Devise.friendly_token[0, 20]) if a.save - puts "#{a.email} created" + rake_puts "#{a.email} created" else - puts "An error occured: #{a.errors.full_messages}" + rake_puts "An error occured: #{a.errors.full_messages}" end end @@ -30,9 +32,9 @@ namespace :superadmin do EOD task :delete, [:email] => :environment do |_t, args| email = args[:email] - puts "Deleting Administration for #{email}" + rake_puts "Deleting Administration for #{email}" a = Administration.find_by(email: email) a.destroy - puts "#{a.email} deleted" + rake_puts "#{a.email} deleted" end end diff --git a/package.json b/package.json index 986da2f62..be0c54d60 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "dependencies": { "@babel/preset-react": "^7.0.0", - "@fortawesome/fontawesome-svg-core": "^1.2.19", - "@fortawesome/free-solid-svg-icons": "^5.9.0", - "@fortawesome/react-fontawesome": "^0.1.4", - "@rails/actiontext": "^6.0.0-alpha", - "@rails/activestorage": "^6.0.0-alpha", - "@rails/ujs": "^6.0.0-alpha", + "@fortawesome/fontawesome-svg-core": "^1.2.25", + "@fortawesome/free-solid-svg-icons": "^5.11.2", + "@fortawesome/react-fontawesome": "^0.1.5", + "@rails/actiontext": "^6.0.0", + "@rails/activestorage": "^6.0.0", + "@rails/ujs": "^6.0.0", "@rails/webpacker": "4.0.7", - "@sentry/browser": "^5.4.3", + "@sentry/browser": "^5.6.3", "@turf/area": "^6.0.1", - "autocomplete.js": "^0.36.0", + "autocomplete.js": "^0.37.0", "babel-plugin-macros": "^2.6.1", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "chartkick": "^3.0.2", + "chartkick": "^3.1.1", "core-js": "^2.0.0", "debounce": "^1.2.0", "dom4": "^2.1.5", @@ -30,19 +30,20 @@ "react-scroll-to-component": "^1.0.2", "react-sortable-hoc": "^1.9.1", "react_ujs": "^2.5.0", - "select2": "^4.0.7", + "select2": "^4.0.10", + "trix": "^1.2.0", "turbolinks": "^5.2.0" }, "devDependencies": { - "babel-eslint": "^10.0.2", + "babel-eslint": "^10.0.3", "eclint": "^2.8.1", - "eslint": "^5.16.0", - "eslint-config-prettier": "^4.2.0", - "eslint-plugin-prettier": "^3.1.0", - "eslint-plugin-react": "^7.14.2", - "eslint-plugin-react-hooks": "^1.6.1", + "eslint": "^6.5.1", + "eslint-config-prettier": "^6.3.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-react": "^7.15.1", + "eslint-plugin-react-hooks": "^2.1.1", "prettier": "^1.18.2", - "webpack-dev-server": "^3.7.2" + "webpack-dev-server": "^3.8.2" }, "scripts": { "lint:ec": "eclint check $({ git ls-files | grep -v app/graphql/schema.graphql ; find vendor -type f ; echo 'db/schema.rb' ; } | sort | uniq -u)", diff --git a/spec/controllers/instructeurs/dossiers_controller_spec.rb b/spec/controllers/instructeurs/dossiers_controller_spec.rb index e3fae8012..d5587ec87 100644 --- a/spec/controllers/instructeurs/dossiers_controller_spec.rb +++ b/spec/controllers/instructeurs/dossiers_controller_spec.rb @@ -169,18 +169,10 @@ describe Instructeurs::DossiersController, type: :controller do context 'when the dossier is accepte' do let(:dossier) { create(:dossier, :accepte, procedure: procedure) } - it 'it is not possible to go back to en_instruction as instructeur' do - expect(dossier.reload.state).to eq(Dossier.states.fetch(:accepte)) + it 'it is possible to go back to en_instruction as instructeur' do + expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_instruction)) expect(response).to have_http_status(:ok) end - - context 'as superadmin' do - let (:current_user) { administration } - it 'it is not possible to go back to en_instruction' do - expect(dossier.reload.state).to eq(Dossier.states.fetch(:accepte)) - expect(response).to have_http_status(:ok) - end - end end end diff --git a/spec/features/instructeurs/instructeur_spec.rb b/spec/features/instructeurs/instructeur_spec.rb index d6ce007a5..4514b9084 100644 --- a/spec/features/instructeurs/instructeur_spec.rb +++ b/spec/features/instructeurs/instructeur_spec.rb @@ -185,9 +185,9 @@ feature 'The instructeur part' do click_on 'Personnes impliquées' first('.select2-container', minimum: 1).click - find('li.select2-results__option[role="treeitem"]', text: instructeur_2.email).click + find('li.select2-results__option[role="option"]', text: instructeur_2.email).click first('.select2-container', minimum: 1).click - find('li.select2-results__option[role="treeitem"]', text: instructeur_3.email).click + find('li.select2-results__option[role="option"]', text: instructeur_3.email).click click_on 'Envoyer' diff --git a/spec/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake_spec.rb b/spec/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake_spec.rb new file mode 100644 index 000000000..a671a535e --- /dev/null +++ b/spec/lib/tasks/deployment/20191007124230_update_admin_last_sign_in_at.rake_spec.rb @@ -0,0 +1,27 @@ +describe '20191007124230_update_admin_last_sign_in_at.rake' do + let(:rake_task) { Rake::Task['after_party:update_admin_last_sign_in_at'] } + + subject { rake_task.invoke } + after { rake_task.reenable } + + context 'with 2 administrateurs' do + let!(:admin) { create(:administrateur, active: true) } + let(:user) { admin.user } + let!(:admin2) { create(:administrateur, active: false) } + let(:user2) { admin2.user } + + before do + end + + it do + expect(admin.active).to be true + expect(user.last_sign_in_at).to be_nil + expect(admin.updated_at).not_to be_nil + + subject + + expect(user.reload.last_sign_in_at).to eq(admin.reload.updated_at) + expect(user2.reload.last_sign_in_at).to be_nil + end + end +end diff --git a/spec/policies/champ_policy_spec.rb b/spec/policies/champ_policy_spec.rb index 4dec03f29..441133bb7 100644 --- a/spec/policies/champ_policy_spec.rb +++ b/spec/policies/champ_policy_spec.rb @@ -1,25 +1,76 @@ require 'spec_helper' describe ChampPolicy do - let(:user) { create(:user) } - let(:dossier) { create(:dossier, user: user) } - let!(:champ) { create(:champ_text, dossier: dossier) } + let(:champ) { create(:champ_text, private: private, dossier: dossier) } + let(:dossier) { create(:dossier, user: dossier_owner) } + let(:dossier_owner) { create(:user) } - let(:account) { { user: user } } + let(:signed_in_user) { create(:user) } + let(:account) { { user: signed_in_user } } subject { Pundit.policy_scope(account, Champ) } - context 'when the user has only user rights' do - context 'cannot access champs for other dossiers' do - let(:account) { { user: create(:user) } } + shared_examples_for 'they can access a public champ' do + let(:private) { false } + it { expect(subject.find_by(id: champ.id)).to eq(champ) } + end - it { expect(subject.find_by(id: champ.id)).to eq(nil) } + shared_examples_for 'they can’t access a public champ' do + let(:private) { false } + it { expect(subject.find_by(id: champ.id)).to eq(nil) } + end + + shared_examples_for 'they can access a private champ' do + let(:private) { true } + it { expect(subject.find_by(id: champ.id)).to eq(champ) } + end + + shared_examples_for 'they can’t access a private champ' do + let(:private) { true } + it { expect(subject.find_by(id: champ.id)).to eq(nil) } + end + + context 'when an user only has user rights' do + context 'as the dossier owner' do + let(:signed_in_user) { dossier_owner } + + it_behaves_like 'they can access a public champ' + it_behaves_like 'they can’t access a private champ' end - context 'can access champs for its own dossiers' do - it { - expect(subject.find(champ.id)).to eq(champ) - } + context 'as another user' do + let(:signed_in_user) { create(:user) } + + it_behaves_like 'they can’t access a public champ' + it_behaves_like 'they can’t access a private champ' + end + end + + context 'when the user also has instruction rights' do + let(:instructeur) { create(:instructeur, email: signed_in_user.email, password: signed_in_user.password) } + let(:account) { { user: signed_in_user, instructeur: instructeur } } + + context 'as the dossier instructeur and owner' do + let(:signed_in_user) { dossier_owner } + before { instructeur.assign_to_procedure(dossier.procedure) } + + it_behaves_like 'they can access a public champ' + it_behaves_like 'they can access a private champ' + end + + context 'as the dossier instructeur (but not owner)' do + let(:signed_in_user) { create(:user) } + before { instructeur.assign_to_procedure(dossier.procedure) } + + it_behaves_like 'they can’t access a public champ' + it_behaves_like 'they can access a private champ' + end + + context 'as an instructeur not assigned to the procedure' do + let(:signed_in_user) { create(:user) } + + it_behaves_like 'they can’t access a public champ' + it_behaves_like 'they can’t access a private champ' end end end diff --git a/spec/views/shared/dossiers/_champs.html.haml_spec.rb b/spec/views/shared/dossiers/_champs.html.haml_spec.rb index 81566f02a..dfce7ae25 100644 --- a/spec/views/shared/dossiers/_champs.html.haml_spec.rb +++ b/spec/views/shared/dossiers/_champs.html.haml_spec.rb @@ -40,6 +40,18 @@ describe 'shared/dossiers/champs.html.haml', type: :view do expect(subject).not_to include(champ3.libelle) expect(subject).not_to include(champ3.value) end + + context "with auto-link" do + let(:champ1) { create(:champ_text, value: "https://github.com/tchak") } + let(:champ2) { create(:champ_textarea, value: "https://github.com/LeSim") } + let(:link1) { 'https://github.com/tchak' } + let(:link2) { 'https://github.com/LeSim' } + + it "render links" do + expect(subject).to include(link1) + expect(subject).to include(link2) + end + end end context "with a dossier champ, but we are not authorized to acces the dossier" do diff --git a/yarn.lock b/yarn.lock index 5afa1da8b..233974a22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -824,40 +824,45 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@fortawesome/fontawesome-common-types@^0.2.19": - version "0.2.19" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz#754a0f85e1290858152e1c05700ab502b11197f1" - integrity sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ== +"@fortawesome/fontawesome-common-types@^0.2.25": + version "0.2.25" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.25.tgz#6df015905081f2762e5cfddeb7a20d2e9b16c786" + integrity sha512-3RuZPDuuPELd7RXtUqTCfed14fcny9UiPOkdr2i+cYxBoTOfQgxcDoq77fHiiHcgWuo1LoBUpvGxFF1H/y7s3Q== -"@fortawesome/fontawesome-svg-core@^1.2.19": - version "1.2.19" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz#0eca1ce9285c3d99e6e340633ee8f615f9d1a2e0" - integrity sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA== +"@fortawesome/fontawesome-svg-core@^1.2.25": + version "1.2.25" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.25.tgz#24b03391d14f0c6171e8cad7057c687b74049790" + integrity sha512-MotKnn53JKqbkLQiwcZSBJVYtTgIKFbh7B8+kd05TSnfKYPFmjKKI59o2fpz5t0Hzl35vVGU6+N4twoOpZUrqA== dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.19" + "@fortawesome/fontawesome-common-types" "^0.2.25" -"@fortawesome/free-solid-svg-icons@^5.9.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz#1c73e7bac17417d23f934d83f7fff5b100a7fda9" - integrity sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw== +"@fortawesome/free-solid-svg-icons@^5.11.2": + version "5.11.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.11.2.tgz#2f2f1459743a27902b76655a0d0bc5ec4d945631" + integrity sha512-zBue4i0PAZJUXOmLBBvM7L0O7wmsDC8dFv9IhpW5QL4kT9xhhVUsYg/LX1+5KaukWq4/cbDcKT+RT1aRe543sg== dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.19" + "@fortawesome/fontawesome-common-types" "^0.2.25" -"@fortawesome/react-fontawesome@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.4.tgz#18d61d9b583ca289a61aa7dccc05bd164d6bc9ad" - integrity sha512-GwmxQ+TK7PEdfSwvxtGnMCqrfEm0/HbRHArbUudsYiy9KzVCwndxa2KMcfyTQ8El0vROrq8gOOff09RF1oQe8g== +"@fortawesome/react-fontawesome@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.5.tgz#8bc3cd5c617749534787a35e29caa7a6cff705c9" + integrity sha512-WYDKTgyAWOncujWhhzhW7k8sgO5Eo2pZTUL51yNzSQNBUwwr6rNKg/JUSE3iebaU1XShHw74aKc1kJ+jvtRNew== dependencies: - humps "^2.0.1" prop-types "^15.5.10" -"@rails/actiontext@^6.0.0-alpha": - version "6.0.0-alpha" - resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.0.0-alpha.tgz#fde304c363f7b941c92cd1b7904d8477024a2d4f" - integrity sha512-lgSVfrXHcDtWnmMKRkZ6EDM+XbNlFkXpZhL43eVOtWro2HfSOkiIZ9HG4NYa0SiSBNiaYRoz2fCk4s7PghXkKw== +"@rails/actiontext@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.0.0.tgz#ee7f70e916c6d7c4ff2e0832047b9c1c2dff0f62" + integrity sha512-0Koqw59xIMYMMri3ZIE1CaEEEkMQi16j+4FQwCRE5QG830Q1tnli0TrQrtJ0vE+D1vf1JuJfy7UHSGPbaspmRQ== dependencies: "@rails/activestorage" "^6.0.0-alpha" - trix "^1.0.0" + +"@rails/activestorage@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.0.0.tgz#6d9cc98f3dcf195c38ca65e80acd2e759336dd7a" + integrity sha512-RZqTVlUYSWcI88pSJ7ImuTtDYQvqVc2PNuOo+5R3hcVupD+d2TO8xmluqQ5TvByjPqKX4acEK0mjEIK5ip9kCg== + dependencies: + spark-md5 "^3.0.0" "@rails/activestorage@^6.0.0-alpha": version "6.0.0-alpha" @@ -866,10 +871,10 @@ dependencies: spark-md5 "^3.0.0" -"@rails/ujs@^6.0.0-alpha": - version "6.0.0-alpha" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.0-alpha.tgz#d5761d93e19215f5f342229f934d5ca8f6dd22a5" - integrity sha512-6AZcab77PeJQv8RdfryDYh6tAGcndcRnqYaciLiFclADBPFE9Ip978pGCPiKcKGgCg8S1P1nZII+1GNIrUrx+g== +"@rails/ujs@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.0.tgz#6c1957870ba075f7e82fdf875f5ed2181ff9355e" + integrity sha512-0oh/MnpZzluItU/vgaxZv+JtMXxOtA0HPK6ZiMoPd2sLH06q58QdCKPVlC36YMnP4451rcrvxO6xns3w97C1og== "@rails/webpacker@4.0.7": version "4.0.7" @@ -915,56 +920,56 @@ webpack-cli "^3.3.2" webpack-sources "^1.3.0" -"@sentry/browser@^5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.4.3.tgz#c9b56611c6b7de624962d2ea3fc0a9318f44a853" - integrity sha512-5fPlco0/65RpyNy9LMURrZhX1RT1+CAoR06yU65ZB81N3oRuAGDYE85Hs62t0T3EEGTKrMundINHcq8UD1V0xw== +"@sentry/browser@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.6.3.tgz#5cc37b0443eba55ad13c13d34d6b95ff30dfbfe3" + integrity sha512-bP1LTbcKPOkkmfJOAM6c7WZ0Ov0ZEW6B9keVZ9wH9fw/lBPd9UyDMDCwJ+FAYKz9M9S5pxQeJ4Ebd7WUUrGVAQ== dependencies: - "@sentry/core" "5.4.3" - "@sentry/types" "5.4.2" - "@sentry/utils" "5.4.2" + "@sentry/core" "5.6.2" + "@sentry/types" "5.6.1" + "@sentry/utils" "5.6.1" tslib "^1.9.3" -"@sentry/core@5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.4.3.tgz#c9e3a6cc9f5e296c5a5e19a7a925d9ee9125a95f" - integrity sha512-VjRv9BXip2BtCSohi/WQra+Ep4B8ajer1nU1VpKy5tUCjpVfXRpitY23EdEl+MVJH7h6YPZ45JsuFiKGgrtaFQ== +"@sentry/core@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.6.2.tgz#8c5477654a83ebe41a72e86a79215deb5025e418" + integrity sha512-grbjvNmyxP5WSPR6UobN2q+Nss7Hvz+BClBT8QTr7VTEG5q89TwNddn6Ej3bGkaUVbct/GpVlI3XflWYDsnU6Q== dependencies: - "@sentry/hub" "5.4.3" - "@sentry/minimal" "5.4.3" - "@sentry/types" "5.4.2" - "@sentry/utils" "5.4.2" + "@sentry/hub" "5.6.1" + "@sentry/minimal" "5.6.1" + "@sentry/types" "5.6.1" + "@sentry/utils" "5.6.1" tslib "^1.9.3" -"@sentry/hub@5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.4.3.tgz#d6936f976435dd552e06a6a3e9f8cd643e9b9b3f" - integrity sha512-97bnk2dDuCdFv2xhujogqPiDDpKOsHxBXH1jOJ5ezr3/uZNsMRr450FDxxJJYDLuSx+qZ/+vUFfdVNjprBsuSg== +"@sentry/hub@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.6.1.tgz#9f355c0abcc92327fbd10b9b939608aa4967bece" + integrity sha512-m+OhkIV5yTAL3R1+XfCwzUQka0UF/xG4py8sEfPXyYIcoOJ2ZTX+1kQJLy8QQJ4RzOBwZA+DzRKP0cgzPJ3+oQ== dependencies: - "@sentry/types" "5.4.2" - "@sentry/utils" "5.4.2" + "@sentry/types" "5.6.1" + "@sentry/utils" "5.6.1" tslib "^1.9.3" -"@sentry/minimal@5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.4.3.tgz#afaa8f7a3b5074efa8d70a2edac920b2e0cdbe15" - integrity sha512-xSCcKDtVtlmJIGmnlNH2fL++4l7iORJ+pOOfTz1Yjm/Il7Tz9wLVodbEfplXmAbOvgG/x9oilbW0MBSnrwKPfQ== +"@sentry/minimal@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.6.1.tgz#09d92b26de0b24555cd50c3c33ba4c3e566009a1" + integrity sha512-ercCKuBWHog6aS6SsJRuKhJwNdJ2oRQVWT2UAx1zqvsbHT9mSa8ZRjdPHYOtqY3DoXKk/pLUFW/fkmAnpdMqRw== dependencies: - "@sentry/hub" "5.4.3" - "@sentry/types" "5.4.2" + "@sentry/hub" "5.6.1" + "@sentry/types" "5.6.1" tslib "^1.9.3" -"@sentry/types@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.4.2.tgz#4ab327bced2cfd961dc7a29f0ff43398f913f6a6" - integrity sha512-yh1fd7x5lLOIZ8W3A1I792B3jowJVCWp4HcTRikjTsjbF8lcURY62m+hiLYUFPTIX99AlFRIPiApDkWiwMGYMA== +"@sentry/types@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.6.1.tgz#5915e1ee4b7a678da3ac260c356b1cb91139a299" + integrity sha512-Kub8TETefHpdhvtnDj3kKfhCj0u/xn3Zi2zIC7PB11NJHvvPXENx97tciz4roJGp7cLRCJsFqCg4tHXniqDSnQ== -"@sentry/utils@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.4.2.tgz#c88c6c08d635e1744a443cfefe9e2ed7fa250e4e" - integrity sha512-AW7/TGt2HiPQB8lJ8NgMgaFAIDQpKDF+wV8nENRbC1CP1zzcvb1QBF4zBL2auDT4fhkhVa817064s7vlDiJVLQ== +"@sentry/utils@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.6.1.tgz#69d9e151e50415bc91f2428e3bcca8beb9bc2815" + integrity sha512-rfgha+UsHW816GqlSRPlniKqAZylOmQWML2JsujoUP03nPu80zdN43DK9Poy/d9OxBxv0gd5K2n+bFdM2kqLQQ== dependencies: - "@sentry/types" "5.4.2" + "@sentry/types" "5.6.1" tslib "^1.9.3" "@turf/area@^6.0.1": @@ -1198,16 +1203,21 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== +acorn-jsx@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== -acorn@^6.0.5, acorn@^6.0.7: +acorn@^6.0.5: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1228,6 +1238,16 @@ ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.0: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + 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" @@ -1479,6 +1499,11 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1494,10 +1519,10 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autocomplete.js@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.36.0.tgz#94fe775fe64b6cd42e622d076dc7fd26bedd837b" - integrity sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q== +autocomplete.js@^0.37.0: + version "0.37.0" + resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.37.0.tgz#bcfbfd7bcabe90e90fad4c2b1aaa931379a10c38" + integrity sha512-MxYfNb89sl7IRhNdEJv6z8dSfA7lVeU7Dk6m/+/ih0/tPLsbxIM7uPVsnWEUh4j7dFqJktlM7hCeU7jmx6VC8A== dependencies: immediate "^3.2.3" @@ -1531,17 +1556,17 @@ axios@^0.18.0: follow-redirects "1.5.10" is-buffer "^2.0.2" -babel-eslint@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456" - integrity sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q== +babel-eslint@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" babel-loader@^8.0.6: version "8.0.6" @@ -2014,10 +2039,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chartkick@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/chartkick/-/chartkick-3.1.0.tgz#1c330028b84d5580d5884c00d901e5934ecc2e31" - integrity sha512-45ALBwI9KCZR+bMue/xxhnO6i04cGhM98hVnHH/gKDQRc/2TPbskZEYbAQL1nxbGrlO6NQZBlRIHPNyOnP/zsw== +chartkick@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/chartkick/-/chartkick-3.1.1.tgz#c0ac91383f7c3a05dc67493b5c7f4a1469c87878" + integrity sha512-7M8VR99o0W0feas1HP/yc7pXnZElqNn2V6RMEU2TfYr/Emb5PMIL4GeuNbui8idaZ0en29cz5cbynuRcAFieDA== checkstyle-formatter@^1.1.0: version "1.1.0" @@ -2045,10 +2070,10 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -3173,49 +3198,41 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-config-prettier@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz#c55c1fcac8ce4518aeb77906984e134d9eb5a4f0" - integrity sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA== +eslint-config-prettier@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.3.0.tgz#e73b48e59dc49d950843f3eb96d519e2248286a3" + integrity sha512-EWaGjlDAZRzVFveh2Jsglcere2KK5CJBhkNSa1xs3KfMUGdRiT7lG089eqPdvlzWHpAqaekubOsOMu8W8Yk71A== dependencies: get-stdin "^6.0.0" -eslint-plugin-prettier@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#8695188f95daa93b0dc54b249347ca3b79c4686d" - integrity sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA== +eslint-plugin-prettier@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" + integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz#3c66a5515ea3e0a221ffc5d4e75c971c217b1a4c" - integrity sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA== +eslint-plugin-react-hooks@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.1.1.tgz#b416390b642113f444ee175b667c3222a045a98e" + integrity sha512-AYitPYzwHyKpZKpzMH5sCkld68vP8wn29Lq716h4jk1ll9Gp4BBFoPq/iCjBBT35eXFJvOPjgMlvhIXFB0OhXg== -eslint-plugin-react@^7.14.2: - version "7.14.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz#94c193cc77a899ac0ecbb2766fbef88685b7ecc1" - integrity sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA== +eslint-plugin-react@^7.15.1: + version "7.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.15.1.tgz#db5f8ed66c6ba46922518f08e1df9dac52ccaa49" + integrity sha512-YotSItgMPwLGlr3df44MGVyXnHkmKcpkHTzpte3QwJtocr3nFqCXCuoxFZeBtnT8RHdj038NlTvam3dcAFrMcA== dependencies: array-includes "^3.0.3" doctrine "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.1.0" + jsx-ast-utils "^2.2.1" object.entries "^1.1.0" object.fromentries "^2.0.0" object.values "^1.1.0" prop-types "^15.7.2" - resolve "^1.10.1" + resolve "^1.12.0" -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.0, eslint-scope@^4.0.3: +eslint-scope@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -3223,68 +3240,77 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.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== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== dependencies: eslint-visitor-keys "^1.0.0" -eslint-visitor-keys@^1.0.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "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@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== +eslint@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" + integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" + ajv "^6.10.0" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" + eslint-scope "^5.0.0" + eslint-utils "^1.4.2" + eslint-visitor-keys "^1.1.0" + espree "^6.1.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" + glob-parent "^5.0.0" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" + inquirer "^6.4.1" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.11" + lodash "^4.17.14" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.2" progress "^2.0.0" regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" table "^5.2.3" text-table "^0.2.0" + v8-compile-cache "^2.0.3" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== +espree@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" + integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^7.0.0" + acorn-jsx "^5.0.2" + eslint-visitor-keys "^1.1.0" esprima@^4.0.0: version "4.0.1" @@ -3869,6 +3895,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob-stream@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" @@ -4243,7 +4276,7 @@ http-parser-js@>=0.4.0: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== -http-proxy-middleware@^0.19.1: +http-proxy-middleware@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== @@ -4276,11 +4309,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -humps@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" - integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao= - iconv-lite@0.4.24, iconv-lite@^0.4.15, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4429,10 +4457,10 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== +inquirer@^6.4.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -4440,7 +4468,7 @@ inquirer@^6.2.2: cli-width "^2.0.0" external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.4.0" @@ -4503,6 +4531,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -4654,7 +4687,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -4920,12 +4953,13 @@ jsts@1.1.2: resolved "https://registry.yarnpkg.com/jsts/-/jsts-1.1.2.tgz#d205d2cc8393081d9e484ae36282110695edc230" integrity sha1-0gXSzIOTCB2eSErjYoIRBpXtwjA= -jsx-ast-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz#0ee4e2c971fb9601c67b5641b71be80faecf0b36" - integrity sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA== +jsx-ast-utils@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" + integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== dependencies: array-includes "^3.0.3" + object.assign "^4.1.0" junit-report-builder@^1.3.1: version "1.3.2" @@ -5120,10 +5154,15 @@ lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5, lodash@~4.17.10 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -loglevel@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" - integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== +lodash@^4.17.12, lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" + integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -5314,7 +5353,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.2: +mime@^2.4.4: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -5531,10 +5570,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== node-gyp@^3.8.0: version "3.8.0" @@ -6202,10 +6241,10 @@ pnp-webpack-plugin@^1.4.3: dependencies: ts-pnp "^1.1.2" -portfinder@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== +portfinder@^1.0.24: + version "1.0.24" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" + integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== dependencies: async "^1.5.2" debug "^2.2.0" @@ -7393,10 +7432,10 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" -resolve@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" @@ -7546,17 +7585,17 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -select2@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.7.tgz#7b80473ef7900f4dc2b988623275fe569204ae8d" - integrity sha512-t46Z2nkEEYnBYdRpLNw5dj9qqO+YTiTlWKnpJ/B5e1Q3hPND00JRgcLJxYRzqpeLZd+ZkszkHEMagLKIfbTjVA== +select2@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.10.tgz#c8d4e3e2504f49956b3dfd9018ab1d7bc601a41b" + integrity sha512-g9fWMdEif4eQ901eiJV3os0MG5y20/3E2WNy0PfYf0T6Q/zZB/NOroJwAxcfE6uv5x0/BGeCDGNtoj9PqCdQEg== -selfsigned@^1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== dependencies: - node-forge "0.7.5" + node-forge "0.9.0" "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.0" @@ -7568,6 +7607,11 @@ semver@^6.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== +semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -7752,10 +7796,10 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" - integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== dependencies: debug "^3.2.5" eventsource "^1.0.7" @@ -7868,10 +7912,10 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" - integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== +spdy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" + integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -8062,7 +8106,12 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +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" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -8357,10 +8406,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -trix@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/trix/-/trix-1.1.1.tgz#ca8a3fab4d23d960a17e88441d601cb22a86f5d5" - integrity sha512-dNHTcryRK0EmwCyJDOBrG6OznL8HNEVVlecq/xzxLj3M9Eht5DV4yl+eCYX8RKyfrtBcNki+mpKIxESgXaGGZA== +trix@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/trix/-/trix-1.2.0.tgz#b314101abd1d8d3d5da22ae5b866a719a73a6e21" + integrity sha512-gJ7edoWzcnc9DBjsgeGkmotVpyVhFQTlSOmUYjwFn71NlGixAhNgsu8pVIq/jkIkbk6om0PSetc9cRJm+qU3+A== "true-case-path@^1.0.2": version "1.0.3" @@ -8606,6 +8655,11 @@ v8-compile-cache@2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -8739,51 +8793,54 @@ webpack-cli@^3.3.2: v8-compile-cache "2.0.3" yargs "13.2.4" -webpack-dev-middleware@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" - integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== dependencies: memory-fs "^0.4.1" - mime "^2.4.2" + mime "^2.4.4" + mkdirp "^0.5.1" range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz#f79caa5974b7f8b63268ef5421222a8486d792f5" - integrity sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew== +webpack-dev-server@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz#3292427bf6510da9a3ac2d500b924a4197667ff9" + integrity sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.1.6" + chokidar "^2.1.8" compression "^1.7.4" connect-history-api-fallback "^1.6.0" debug "^4.1.1" del "^4.1.1" express "^4.17.1" html-entities "^1.2.1" - http-proxy-middleware "^0.19.1" + http-proxy-middleware "0.19.1" import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" + is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.3" + loglevel "^1.6.4" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.20" + portfinder "^1.0.24" schema-utils "^1.0.0" - selfsigned "^1.10.4" - semver "^6.1.1" + selfsigned "^1.10.7" + semver "^6.3.0" serve-index "^1.9.1" sockjs "0.3.19" - sockjs-client "1.3.0" - spdy "^4.0.0" + sockjs-client "1.4.0" + spdy "^4.0.1" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" - webpack-dev-middleware "^3.7.0" + webpack-dev-middleware "^3.7.2" webpack-log "^2.0.0" + ws "^6.2.1" yargs "12.0.5" webpack-log@^2.0.0: @@ -8917,6 +8974,13 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + xml-escape@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xml-escape/-/xml-escape-1.1.0.tgz#3904c143fa8eb3a0030ec646d2902a2f1b706c44"