diff --git a/.gitignore b/.gitignore index 2d5e10349..9ed0f7c5d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ /vendor/bundle /.env /docker-compose.*.yaml +.rubocop.yml +Guardfile +coverage diff --git a/Capfile b/Capfile deleted file mode 100644 index f3634e86a..000000000 --- a/Capfile +++ /dev/null @@ -1,2 +0,0 @@ -load 'deploy' -load 'config/deploy' diff --git a/Gemfile b/Gemfile index eee3e6c02..f1466633a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,48 +1,47 @@ -source 'https://rubygems.org' +source "https://rubygems.org" git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" end -gem "rails", "~>5.2" -gem "nio4r", "2.5.2" # 2.5.3 is not compatible with ruby 2.3 +gem "rails", "~>7.1" -gem "actionpack-page_caching", github: "linuxfrorg/actionpack-page_caching" -gem "ansi", "~>1.4", require: false +gem "actionpack-page_caching" gem "acts_as_list", "~>0.4" +gem "ansi", "~>1.4", require: false gem "bitfields", "~>0.4" gem "bootsnap", "~>1.3", require: false gem "canable", "~>0.1" gem "carrierwave", "~>1.1" gem "devise", "~>4.3" gem "diff_match_patch", github: "nono/diff_match_patch-ruby", require: "diff_match_patch" -gem "doorkeeper", "~>4.2" +gem "doorkeeper" gem "ffi-hunspell", github: "postmodern/ffi-hunspell" -gem "french_rails", "~>0.4" +gem "french_rails", "~>0.5", github: "linuxfrorg/french-rails" gem "friendly_id", "~>5.1" gem "haml", "~>5.0" -gem "html-pipeline-linuxfr", "~>0.15" +gem "htmlentities", "~>4.3" +gem "html-pipeline-linuxfr", "~>0.17", github: "linuxfrorg/html-pipeline-linuxfr" gem "html_spellchecker", "~>0.1" gem "html_truncator", "~>0.4" -gem "htmlentities", "~>4.3" gem "inherited_resources", "~>1.8" gem "kaminari", "~>1.2" gem "mini_magick", "~>4.9" gem "mysql2", "~>0.5.0" gem "nokogiri", "~>1.10" +gem "redis", "~>5.0" gem "rinku", "~>2.0" -gem "redis", "~>4.0" gem "sitemap_generator", "~>2.1" -gem "state_machine", "~>1.2" +gem "state_machines-activerecord" # Gems used for assets assets = !%w(production alpha).include?(ENV['RAILS_ENV']) assets = true if ENV['RAILS_GROUPS'] == "assets" -gem "jquery-rails", "~>4.0", require: assets gem "coffee-rails", "~>4.1", require: assets +gem "jquery-rails", "~>4.0", require: assets +gem "normalize-rails", "~>8.0", require: assets gem "sass-rails", "~>5.0", require: assets -gem "rails-sass-images", require: assets gem "uglifier", require: assets group :development, :test do @@ -54,25 +53,17 @@ group :development do gem "annotate" gem "better_errors" gem "binding_of_caller" - gem "capistrano", "~>2.15", github: 'capistrano', branch: 'legacy-v2' - gem "capistrano-maintenance" gem "letter_opener" gem "listen", github: "guard/listen" - gem "mo" - gem "pry-rails" + gem "puma" gem "spring" - gem "sushi" - gem "thin" gem "web-console" end group :test do - # Adds support for Capybara system testing and selenium driver - gem "capybara", ">= 2.15" - gem "selenium-webdriver" + gem "simplecov" end group :production, :alpha do - gem "unicorn", "~>5.1" - gem "gctools", "~>0.2" + gem "unicorn", "~>5.1" end diff --git a/Gemfile.lock b/Gemfile.lock index e1732fcd3..50e6431a4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,30 @@ -GIT - remote: https://github.com/capistrano/capistrano.git - revision: 08a82f3618425eae7539e2bbd34a87e35bac2800 - branch: legacy-v2 - specs: - capistrano (2.15.9) - highline - net-scp (>= 1.0.0) - net-sftp (>= 2.0.0) - net-ssh (>= 2.0.14) - net-ssh-gateway (>= 1.1.0) - GIT remote: https://github.com/guard/listen.git - revision: 587f4a7edb75fac80faa3408c4513af715dace87 + revision: fd85e1cb2375767e3cbc4b5743ff50061e8a6c75 specs: - listen (3.1.5) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) GIT - remote: https://github.com/linuxfrorg/actionpack-page_caching.git - revision: 13a51101deb396eeb089a0d36a06653bd0d046a9 + remote: https://github.com/linuxfrorg/french-rails.git + revision: 9fd86a206d4ee90eed0205eb0e9047934dcb20bb specs: - actionpack-page_caching (1.2.2) - actionpack (>= 5.0.0) + french_rails (0.6.0) + rails (~> 7.0) + +GIT + remote: https://github.com/linuxfrorg/html-pipeline-linuxfr.git + revision: 5d3b7a41555a63c23fdd51bd1d2cb5107a2b9d5f + specs: + html-pipeline-linuxfr (0.17.0) + activesupport (~> 7.0) + escape_utils (~> 1.2) + nokogiri (~> 1.6) + patron (~> 0.8) + pygments.rb (~> 1.1) + redcarpet (~> 3.4) + sanitize (~> 5.0) GIT remote: https://github.com/nono/diff_match_patch-ruby.git @@ -33,86 +34,119 @@ GIT GIT remote: https://github.com/postmodern/ffi-hunspell.git - revision: e5dd37ea70f9dc73ab21b68fa20ad567e9ae9b18 + revision: 07d9e925d9d747c88b2c3b9d66cc5c457dff3e89 specs: - ffi-hunspell (0.4.0) + ffi-hunspell (0.6.1) ffi (~> 1.0) GEM remote: https://rubygems.org/ specs: - actioncable (5.2.5) - actionpack (= 5.2.5) + actioncable (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.5) - actionpack (= 5.2.5) - actionview (= 5.2.5) - activejob (= 5.2.5) + zeitwerk (~> 2.6) + actionmailbox (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.1) + actionpack (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activesupport (= 7.1.1) mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (5.2.5) - actionview (= 5.2.5) - activesupport (= 5.2.5) - rack (~> 2.0, >= 2.0.8) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.1) + actionview (= 7.1.1) + activesupport (= 7.1.1) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.5) - activesupport (= 5.2.5) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actionpack-page_caching (1.2.4) + actionpack (>= 4.0.0) + actiontext (7.1.1) + actionpack (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.1.1) + activesupport (= 7.1.1) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.2.5) - activesupport (= 5.2.5) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.1) + activesupport (= 7.1.1) globalid (>= 0.3.6) - activemodel (5.2.5) - activesupport (= 5.2.5) - activerecord (5.2.5) - activemodel (= 5.2.5) - activesupport (= 5.2.5) - arel (>= 9.0) - activestorage (5.2.5) - actionpack (= 5.2.5) - activerecord (= 5.2.5) - marcel (~> 1.0.0) - activesupport (5.2.5) + activemodel (7.1.1) + activesupport (= 7.1.1) + activerecord (7.1.1) + activemodel (= 7.1.1) + activesupport (= 7.1.1) + timeout (>= 0.4.0) + activestorage (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activesupport (= 7.1.1) + marcel (~> 1.0) + activesupport (7.1.1) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - acts_as_list (0.9.15) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + acts_as_list (0.9.19) activerecord (>= 3.0) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - annotate (2.7.4) - activerecord (>= 3.2, < 6.0) - rake (>= 10.4, < 13.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + annotate (3.2.0) + activerecord (>= 3.2, < 8.0) + rake (>= 10.4, < 14.0) ansi (1.5.0) - arel (9.0.0) - bcrypt (3.1.12) - better_errors (2.5.0) - coderay (>= 1.0.0) + base64 (0.1.1) + bcrypt (3.1.19) + better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) - bindex (0.5.0) - binding_of_caller (0.8.0) + rouge (>= 1.0.0) + bigdecimal (3.1.4) + bindex (0.8.1) + binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bitfields (0.8.0) - bootsnap (1.4.6) - msgpack (~> 1.0) - boson (1.3.0) + bitfields (0.14.0) + activerecord (>= 5.1) + bootsnap (1.16.0) + msgpack (~> 1.2) builder (3.2.4) - byebug (10.0.2) + byebug (11.1.3) canable (0.3.0) - capistrano-maintenance (0.0.5) - capistrano (~> 2.0) - carrierwave (1.2.3) + carrierwave (1.3.4) activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) - coderay (1.1.2) + ssrf_filter (~> 1.0, < 1.1.0) coffee-rails (4.2.2) coffee-script (>= 2.2.0) railties (>= 4.0.0) @@ -120,221 +154,243 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.1.8) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) crass (1.0.6) - daemons (1.2.6) - debug_inspector (0.0.3) - devise (4.6.2) + date (3.3.3) + debug_inspector (1.1.0) + devise (4.9.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0, < 6.0) + railties (>= 4.1.0) responders warden (~> 1.2.3) - dimensions (1.3.0) - doorkeeper (4.4.2) - railties (>= 4.2) - erubi (1.9.0) - escape_utils (1.2.1) - eventmachine (1.2.7) - execjs (2.7.0) - ffi (1.12.2) - french_rails (0.4.0) - rails (~> 5.0) - friendly_id (5.2.4) + docile (1.4.0) + doorkeeper (5.6.6) + railties (>= 5) + drb (2.1.1) + ruby2_keywords + erubi (1.12.0) + escape_utils (1.3.0) + execjs (2.9.1) + ffi (1.16.3) + friendly_id (5.5.0) activerecord (>= 4.0.0) - gctools (0.2.4) - globalid (0.4.2) - activesupport (>= 4.2.0) - haml (5.0.4) + globalid (1.2.1) + activesupport (>= 6.1) + haml (5.2.2) temple (>= 0.8.0) tilt - has_scope (0.7.2) - actionpack (>= 4.1) - activesupport (>= 4.1) - highline (2.0.0) - html-pipeline-linuxfr (0.15.7) - activesupport (~> 5.0) - escape_utils (~> 1.2) - nokogiri (~> 1.6) - patron (~> 0.8) - pygments.rb (~> 1.1) - redcarpet (~> 3.4) - sanitize (~> 4.0) + has_scope (0.8.2) + actionpack (>= 5.2) + activesupport (>= 5.2) html_spellchecker (0.1.9) ffi-hunspell (~> 0.4) nokogiri (~> 1.4) html_truncator (0.4.2) nokogiri (~> 1.5) htmlentities (4.3.4) - i18n (1.8.10) + i18n (1.14.1) concurrent-ruby (~> 1.0) - inherited_resources (1.9.0) - actionpack (>= 4.2, < 5.3) - has_scope (~> 0.6) - railties (>= 4.2, < 5.3) - responders - jquery-rails (4.3.3) + inherited_resources (1.14.0) + actionpack (>= 6.0) + has_scope (>= 0.6) + railties (>= 6.0) + responders (>= 2) + io-console (0.6.0) + irb (1.8.3) + rdoc + reline (>= 0.3.8) + jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - kaminari (1.2.1) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) - kgio (2.11.2) - launchy (2.4.3) - addressable (~> 2.3) - letter_opener (1.6.0) - launchy (~> 2.2) - loofah (2.7.0) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + kgio (2.11.4) + launchy (2.5.2) + addressable (~> 2.8) + letter_opener (1.8.1) + launchy (>= 2.2, < 3) + loofah (2.21.4) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) - marcel (1.0.1) - method_source (0.9.2) - mime-types (3.2.2) + net-imap + net-pop + net-smtp + marcel (1.0.2) + mime-types (3.5.1) mime-types-data (~> 3.2015) - mime-types-data (3.2018.0812) - mini_magick (4.9.4) - mini_mime (1.0.3) - mini_portile2 (2.4.0) - minitest (5.14.4) - mo (1.4.0) - boson - msgpack (1.3.3) - multi_json (1.13.1) - mysql2 (0.5.2) - net-scp (1.2.1) - net-ssh (>= 2.6.5) - net-sftp (2.1.2) - net-ssh (>= 2.6.5) - net-ssh (5.0.2) - net-ssh-gateway (2.0.0) - net-ssh (>= 4.0.0) - nio4r (2.5.2) - nokogiri (1.10.10) - mini_portile2 (~> 2.4.0) - nokogumbo (1.5.0) - nokogiri + mime-types-data (3.2023.1003) + mini_magick (4.12.0) + mini_mime (1.1.5) + minitest (5.20.0) + msgpack (1.7.2) + multi_json (1.15.0) + mutex_m (0.1.2) + mysql2 (0.5.5) + net-imap (0.4.1) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.4.0) + net-protocol + nio4r (2.5.9) + nokogiri (1.15.4-x86_64-linux) + racc (~> 1.4) + nokogumbo (2.0.5) + nokogiri (~> 1.8, >= 1.8.4) + normalize-rails (8.0.1) orm_adapter (0.5.0) - patron (0.13.1) - pry (0.11.3) - coderay (~> 1.1.0) - method_source (~> 0.9.0) - pry-rails (0.3.6) - pry (>= 0.10.4) - public_suffix (3.0.3) + patron (0.13.3) + psych (5.1.1.1) + stringio + public_suffix (5.0.3) + puma (6.4.0) + nio4r (~> 2.0) pygments.rb (1.2.1) multi_json (>= 1.0.0) - rack (2.2.3) - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (5.2.5) - actioncable (= 5.2.5) - actionmailer (= 5.2.5) - actionpack (= 5.2.5) - actionview (= 5.2.5) - activejob (= 5.2.5) - activemodel (= 5.2.5) - activerecord (= 5.2.5) - activestorage (= 5.2.5) - activesupport (= 5.2.5) - bundler (>= 1.3.0) - railties (= 5.2.5) - sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + racc (1.7.1) + rack (2.2.8) + rack-session (1.0.1) + rack (< 3) + rack-test (2.1.0) + rack (>= 1.3) + rackup (1.0.0) + rack (< 3) + webrick + rails (7.1.1) + actioncable (= 7.1.1) + actionmailbox (= 7.1.1) + actionmailer (= 7.1.1) + actionpack (= 7.1.1) + actiontext (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activemodel (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) + bundler (>= 1.15.0) + railties (= 7.1.1) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.3.0) - loofah (~> 2.3) - rails-sass-images (1.0.3) - dimensions (> 0) - mime-types (> 0) - sass (> 0) - railties (5.2.5) - actionpack (= 5.2.5) - activesupport (= 5.2.5) - method_source - rake (>= 0.8.7) - thor (>= 0.19.0, < 2.0) - raindrops (0.19.0) - rake (12.3.3) - rb-fsevent (0.10.3) - rb-inotify (0.10.0) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + raindrops (0.20.1) + rake (13.0.6) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) ffi (~> 1.0) - redcarpet (3.4.0) - redis (4.0.2) - responders (2.4.1) - actionpack (>= 4.2.0, < 6.0) - railties (>= 4.2.0, < 6.0) - rinku (2.0.4) - sanitize (4.6.6) + rdoc (6.5.0) + psych (>= 4.0.0) + redcarpet (3.6.0) + redis (5.0.7) + redis-client (>= 0.9.0) + redis-client (0.17.0) + connection_pool + reline (0.3.9) + io-console (~> 0.5) + responders (3.1.1) + actionpack (>= 5.2) + railties (>= 5.2) + rinku (2.0.6) + rouge (4.1.3) + ruby2_keywords (0.0.5) + sanitize (5.2.3) crass (~> 1.0.2) - nokogiri (>= 1.4.4) - nokogumbo (~> 1.4) - sass (3.5.7) + nokogiri (>= 1.8.0) + nokogumbo (~> 2.0) + sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.0.7) - railties (>= 4.0.0, < 6) + sass-rails (5.1.0) + railties (>= 5.2.0) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.4) sitemap_generator (2.2.1) - spring (2.0.2) - activesupport (>= 4.2) + spring (4.1.1) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - state_machine (1.2.0) - sushi (0.0.4) - temple (0.8.0) - thin (1.7.2) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0, >= 1.0.4) - rack (>= 1, < 3) - thor (1.0.1) - thread_safe (0.3.6) - tilt (2.0.8) - tzinfo (1.2.9) - thread_safe (~> 0.1) - uglifier (4.1.18) + ssrf_filter (1.0.8) + state_machines (0.6.0) + state_machines-activemodel (0.9.0) + activemodel (>= 6.0) + state_machines (>= 0.6.0) + state_machines-activerecord (0.9.0) + activerecord (>= 6.0) + state_machines-activemodel (>= 0.9.0) + stringio (3.0.8) + temple (0.10.3) + thor (1.2.2) + tilt (2.3.0) + timeout (0.4.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) - unicorn (5.4.1) + unicorn (5.8.0) kgio (~> 2.6) raindrops (~> 0.7) - warden (1.2.8) - rack (>= 2.0.6) - web-console (3.6.2) - actionview (>= 5.0) - activemodel (>= 5.0) + warden (1.2.9) + rack (>= 2.0.9) + web-console (4.2.1) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) bindex (>= 0.4.0) - railties (>= 5.0) - websocket-driver (0.7.3) + railties (>= 6.0.0) + webrick (1.8.1) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) + zeitwerk (2.6.12) PLATFORMS - ruby + x86_64-linux DEPENDENCIES - actionpack-page_caching! + actionpack-page_caching acts_as_list (~> 0.4) annotate ansi (~> 1.4) @@ -344,19 +400,16 @@ DEPENDENCIES bootsnap (~> 1.3) byebug canable (~> 0.1) - capistrano (~> 2.15)! - capistrano-maintenance carrierwave (~> 1.1) coffee-rails (~> 4.1) devise (~> 4.3) diff_match_patch! - doorkeeper (~> 4.2) + doorkeeper ffi-hunspell! - french_rails (~> 0.4) + french_rails (~> 0.5)! friendly_id (~> 5.1) - gctools (~> 0.2) haml (~> 5.0) - html-pipeline-linuxfr (~> 0.15) + html-pipeline-linuxfr (~> 0.17)! html_spellchecker (~> 0.1) html_truncator (~> 0.4) htmlentities (~> 4.3) @@ -366,24 +419,21 @@ DEPENDENCIES letter_opener listen! mini_magick (~> 4.9) - mo mysql2 (~> 0.5.0) - nio4r (= 2.5.2) nokogiri (~> 1.10) - pry-rails - rails (~> 5.2) - rails-sass-images - redis (~> 4.0) + normalize-rails (~> 8.0) + puma + rails (~> 7.1) + redis (~> 5.0) rinku (~> 2.0) sass-rails (~> 5.0) + simplecov sitemap_generator (~> 2.1) spring - state_machine (~> 1.2) - sushi - thin + state_machines-activerecord uglifier unicorn (~> 5.1) web-console BUNDLED WITH - 1.17.3 + 2.4.20 diff --git a/INSTALL.md b/INSTALL.md index 693d0e999..30691a892 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -5,16 +5,6 @@ Debian Stretch development machine. Note that all commands which require root access are prefixed by `sudo`. -# Use stretch-backports - -LinuxFr.org requires to add `stretch-backports` source package as it -needs the `npm`package. - -``` -~ $ sudo bash -c "echo 'deb http://deb.debian.org/debian stretch-backports main' >> /etc/apt/sources.list.d/linuxfr.list" -~ $ sudo apt update -``` - # Install Debian packages Packages to install from main Stretch source: @@ -31,12 +21,6 @@ Note: * you can use libcurl4-gnutls-dev instead of libcurl4-openssl-dev. * the `mysql` packages will install MariaDB on Debian Stretch -Packages to install from backports: - -``` -~ $ sudo apt install -t stretch-backports nodejs npm -``` - # Get LinuxFr.org code and external resources Use git to get LinuxFr.org sources: @@ -70,12 +54,6 @@ Now, we can reach external Ruby resources: The `check` command above should say you there's no problem. -LinuxFr.org uses also some nodejs resources: - -``` -~/linuxfr.org $ npm install -``` - ## Install the LinuxFr.org board The `board-linuxfr` gem server is used to allow users chat on the `/boards` and diff --git a/app/assets/stylesheets/RonRonnement.scss b/app/assets/stylesheets/RonRonnement.scss index c83676ab1..233575694 100644 --- a/app/assets/stylesheets/RonRonnement.scss +++ b/app/assets/stylesheets/RonRonnement.scss @@ -2,7 +2,7 @@ /* Copyright 2010 Nicolas Schoonbroodt (css) */ /* Distributed under GNU AGPL v3 License */ -@import "normalize.css/normalize"; +@import "normalize-rails/normalize.css"; /* Pixel size constants */ $PX_MARGE_GAUCHE: 42px; diff --git a/app/assets/stylesheets/parts/buttons.scss b/app/assets/stylesheets/parts/buttons.scss index 62ebd61bb..51e8eccb3 100644 --- a/app/assets/stylesheets/parts/buttons.scss +++ b/app/assets/stylesheets/parts/buttons.scss @@ -45,7 +45,7 @@ button { padding-left: 28px; background: no-repeat 3px 3px $C_CLAIR; background-size: 20px; - background-image: inline("feather-icons/dist/icons/check"); + background-image: url("feather-icons/dist/icons/check"); cursor: pointer; &[disabled] { cursor: default; @@ -69,7 +69,7 @@ button { line-height: 1.6; background: no-repeat 2px 2px $C_CLAIR; background-size: 20px; - background-image: inline("feather-icons/dist/icons/shuffle"); + background-image: url("feather-icons/dist/icons/shuffle"); &:hover { background-color: $C_FONCE; } @@ -90,54 +90,54 @@ input[type="submit"] { &.delete_button, &.remove, &.erase_news { - background-image: inline("feather-icons/dist/icons/trash-2.svg"); + background-image: url("feather-icons/dist/icons/trash-2.svg"); } &.change_role { - background-image: inline("feather-icons/dist/icons/arrow-right-circle.svg"); + background-image: url("feather-icons/dist/icons/arrow-right-circle.svg"); } &.cancel, &.refuse_oauth { - background-image: inline("feather-icons/dist/icons/slash.svg"); + background-image: url("feather-icons/dist/icons/slash.svg"); } &.ppp_news { - background-image: inline("feather-icons/dist/icons/sunrise.svg"); + background-image: url("feather-icons/dist/icons/sunrise.svg"); } &.submit_board { - background-image: inline("feather-icons/dist/icons/message-square.svg"); + background-image: url("feather-icons/dist/icons/message-square.svg"); } &.submit_news, &.submit { - background-image: inline("feather-icons/dist/icons/send.svg"); + background-image: url("feather-icons/dist/icons/send.svg"); } &.urgent_news { - background-image: inline("feather-icons/dist/icons/zap.svg"); + background-image: url("feather-icons/dist/icons/zap.svg"); } &.add_para, &.add_link, &.create_news { - background-image: inline("feather-icons/dist/icons/plus.svg"); + background-image: url("feather-icons/dist/icons/plus.svg"); } &.vote_for { - background-image: inline("feather-icons/dist/icons/thumbs-up.svg"); + background-image: url("feather-icons/dist/icons/thumbs-up.svg"); } &.vote_against { - background-image: inline("feather-icons/dist/icons/thumbs-down.svg"); + background-image: url("feather-icons/dist/icons/thumbs-down.svg"); } &.plonk, &.block { - background-image: inline("feather-icons/dist/icons/volume-x.svg"); + background-image: url("feather-icons/dist/icons/volume-x.svg"); } &#admin_49_3, &.archive_button, &.reopen_button { - background-image: inline("feather-icons/dist/icons/crosshair.svg"); + background-image: url("feather-icons/dist/icons/crosshair.svg"); } &.reset_news, &.reset_password { - background-image: inline("feather-icons/dist/icons/refresh-cw.svg"); + background-image: url("feather-icons/dist/icons/refresh-cw.svg"); } &.reassign_news { - background-image: inline("feather-icons/dist/icons/user-check.svg"); + background-image: url("feather-icons/dist/icons/user-check.svg"); background-size: 14px; width: 20px; height: 20px; @@ -145,16 +145,16 @@ input[type="submit"] { text-indent: -9999em; } &.rewrite_news { - background-image: inline("feather-icons/dist/icons/edit.svg"); + background-image: url("feather-icons/dist/icons/edit.svg"); } .tag_in_place & { - background-image: inline("feather-icons/dist/icons/tag.svg"); + background-image: url("feather-icons/dist/icons/tag.svg"); } &#followup { - background-image: inline("feather-icons/dist/icons/at-sign.svg"); + background-image: url("feather-icons/dist/icons/at-sign.svg"); } #trackers-index .new_tracker & { - background-image: inline("feather-icons/dist/icons/filter.svg"); + background-image: url("feather-icons/dist/icons/filter.svg"); } } @@ -172,18 +172,18 @@ a.edit_client_app, .new_content a { background: no-repeat 3px 3px $C_CLAIR; background-size: 16px; - background-image: inline("feather-icons/dist/icons/edit-3.svg"); + background-image: url("feather-icons/dist/icons/edit-3.svg"); } .toolbox .follow_feed a, #comments #follow-feed a { background: no-repeat 3px 3px $C_CLAIR; background-size: 16px; - background-image: inline("feather-icons/dist/icons/rss.svg"); + background-image: url("feather-icons/dist/icons/rss.svg"); } #comments #send-comment a { background: no-repeat 3px 3px $C_CLAIR; background-size: 18px; - background-image: inline("feather-icons/dist/icons/message-circle.svg"); + background-image: url("feather-icons/dist/icons/message-circle.svg"); } #stylesheets-edit button { diff --git a/app/assets/stylesheets/parts/redaction.scss b/app/assets/stylesheets/parts/redaction.scss index 87141e684..ed44e60b1 100644 --- a/app/assets/stylesheets/parts/redaction.scss +++ b/app/assets/stylesheets/parts/redaction.scss @@ -16,7 +16,7 @@ html.chat_n_edit { position: relative; top: -1em; &::before { - content: inline("feather-icons/dist/icons/scissors.svg"); + content: url("feather-icons/dist/icons/scissors.svg"); position: relative; top: 20em; left: -6em; @@ -43,7 +43,7 @@ html.chat_n_edit { .content a[href*="/redaction/"] { padding-left: 3px; border-left: 16px; - border-image: inline("feather-icons/dist/icons/eye-off") 0 0 0 32; + border-image: url("feather-icons/dist/icons/eye-off") 0 0 0 32; border-style: solid; } } @@ -482,7 +482,7 @@ body#redaction-index { padding: 0; border-radius: 15px; background: no-repeat 6px 6px / 16px $C_CLAIR; - background-image: inline("feather-icons/dist/icons/edit-3.svg"); + background-image: url("feather-icons/dist/icons/edit-3.svg"); text-indent: -9999em; } .actions { diff --git a/app/controllers/bookmarks_controller.rb b/app/controllers/bookmarks_controller.rb index 91aa89629..c54d98a53 100644 --- a/app/controllers/bookmarks_controller.rb +++ b/app/controllers/bookmarks_controller.rb @@ -5,7 +5,7 @@ class BookmarksController < ApplicationController before_action :authenticate_account!, except: [:index, :show] before_action :find_bookmark, except: [:index, :new, :create] after_action :marked_as_read, only: [:show], if: :account_signed_in? - after_action :expire_cache, only: [:create, :update, :destroy, :move] + after_action :expire_cache, only: [:create, :update, :destroy] caches_page :index, if: Proc.new { |c| c.request.format.atom? && c.request.ssl? && c.request.host == c.request.host.downcase } respond_to :html, :atom, :md diff --git a/app/controllers/moderation/block_controller.rb b/app/controllers/moderation/block_controller.rb index 2aabe22d6..6ba60b9a0 100644 --- a/app/controllers/moderation/block_controller.rb +++ b/app/controllers/moderation/block_controller.rb @@ -1,5 +1,6 @@ # encoding: UTF-8 class Moderation::BlockController < ModerationController + include ActionView::Helpers::NumberHelper include ActionView::Helpers::TextHelper def create diff --git a/app/controllers/moderation/news_controller.rb b/app/controllers/moderation/news_controller.rb index 7c9fa2eaa..8773e7380 100644 --- a/app/controllers/moderation/news_controller.rb +++ b/app/controllers/moderation/news_controller.rb @@ -23,7 +23,7 @@ def show flash.now[:alert] = "Attention, cette dépêche a été refusée et n’est visible que par l’équipe de modération" if @news.refused? respond_to do |wants| wants.html { render :show, layout: 'chat_n_edit' } - wants.js { render partial: 'short' } + wants.js { render partial: 'redaction/news/short' } wants.md { @news.put_paragraphs_together } end end @@ -39,7 +39,7 @@ def update @news.editor = current_account @news.save if request.xhr? - render partial: 'short' + render partial: 'redaction/news/short' else redirect_to @news, notice: "Modification enregistrée" end diff --git a/app/controllers/moderation/plonk_controller.rb b/app/controllers/moderation/plonk_controller.rb index c41605154..3b1772549 100644 --- a/app/controllers/moderation/plonk_controller.rb +++ b/app/controllers/moderation/plonk_controller.rb @@ -1,5 +1,6 @@ # encoding: UTF-8 class Moderation::PlonkController < ModerationController + include ActionView::Helpers::NumberHelper include ActionView::Helpers::TextHelper def create diff --git a/app/controllers/moderation_controller.rb b/app/controllers/moderation_controller.rb index 00f58a87c..5cbb5f5a2 100644 --- a/app/controllers/moderation_controller.rb +++ b/app/controllers/moderation_controller.rb @@ -1,8 +1,6 @@ # encoding: utf-8 class ModerationController < ApplicationController before_action :amr_required - append_view_path RedactionResolver.new - append_view_path NoNamespaceResolver.new def index redirect_to moderation_news_index_url diff --git a/app/controllers/redaction_controller.rb b/app/controllers/redaction_controller.rb index 2032b7a02..834d58b2f 100644 --- a/app/controllers/redaction_controller.rb +++ b/app/controllers/redaction_controller.rb @@ -1,7 +1,5 @@ # encoding: utf-8 class RedactionController < ApplicationController - append_view_path NoNamespaceResolver.new - def index @boards = Board.limit(25, Board.writing) @drafts = News.draft.sorted diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 5031897e7..fbe4db24f 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,8 +1,7 @@ +# Search on an external and specialized website class SearchController < ApplicationController - def index params.permit! - redirect_to "https://duckduckgo.com/?#{params.slice(:q).to_query}+site%3Alinuxfr.org" + redirect_to "https://duckduckgo.com/?#{params.slice(:q).to_query}+site%3Alinuxfr.org", allow_other_host: true end - end diff --git a/app/controllers/trackers_controller.rb b/app/controllers/trackers_controller.rb index 85689bebb..e554577cc 100644 --- a/app/controllers/trackers_controller.rb +++ b/app/controllers/trackers_controller.rb @@ -21,7 +21,7 @@ def index @tracker.state = @attrs["state"] @trackers = @trackers.where(state: @tracker.state) if @attrs["state"].present? @trackers = @trackers.where(category_id: @tracker.category_id) if @attrs["category_id"].present? - if @attrs["assigned_to_user_id"] == 0 + if @attrs["assigned_to_user_id"] == "0" @trackers = @trackers.where(assigned_to_user_id: nil) elsif @attrs["assigned_to_user_id"].present? @trackers = @trackers.where(assigned_to_user_id: @tracker.assigned_to_user_id) diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index 238b5aa6f..3cc66cad3 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -1,9 +1,7 @@ -# encoding: utf-8 module AdminHelper - def abusers - file = Rails.root.join("tmp", "abusers.txt") - if File.exists?(file) + file = Rails.root.join("tmp/abusers.txt") + if File.exist?(file) content_tag(:ul, class: "abusers") do File.readlines(file).map do |l| content_tag(:li, l) @@ -13,5 +11,4 @@ def abusers content_tag(:p, "aucun") end end - end diff --git a/app/helpers/board_helper.rb b/app/helpers/board_helper.rb index d07ac9016..b26b4a2da 100644 --- a/app/helpers/board_helper.rb +++ b/app/helpers/board_helper.rb @@ -1,11 +1,9 @@ # encoding: utf-8 module BoardHelper - def norloge(board, box) format = :norloge2 format = :norloge if board.object_type == Board.free format = :norloge if box - board.created_at.to_s format + board.created_at.to_fs format end - end diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index cc0581864..e0218843b 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -6,8 +6,8 @@ def messages_on_error(object) content_tag(:div, class: "errors") do content_tag(:h2, pluralize(object.errors.count, "erreur") + ' : ') + content_tag(:ul) do - object.errors.values.flatten.map do |err| - content_tag(:li, err) + object.errors.map do |err| + content_tag(:li, err.message) end.join.html_safe end end diff --git a/app/helpers/node_helper.rb b/app/helpers/node_helper.rb index d0750c780..4d8cefa2c 100644 --- a/app/helpers/node_helper.rb +++ b/app/helpers/node_helper.rb @@ -1,6 +1,5 @@ # encoding: utf-8 module NodeHelper - ContentPresenter = Struct.new(:record, :title, :meta, :tags, :notice, :image, :body, :actions, :css_class, :hidden) do def to_hash attrs = members.map(&:to_sym) @@ -117,8 +116,8 @@ def posted_by(content, user_link='Anonyme') end date_time = content.is_a?(Comment) ? content.created_at : content.node.try(:created_at) date_time ||= Time.now - date = content_tag(:span, "le #{date_time.to_s(:date)}", class: "date") - time = content_tag(:span, "à #{date_time.to_s(:time)}", class: "time") + date = content_tag(:span, "le #{date_time.to_fs(:date)}", class: "date") + time = content_tag(:span, "à #{date_time.to_fs(:time)}", class: "time") published_at = content_tag(:time, date + " " + time, datetime: date_time.iso8601, class: "updated") caption = content_tag(:span, "", class: "floating_spacer") + content_tag(:span, "Posté par #{ user_link } #{ published_at }.".html_safe, class: "posted_by_spanblock") diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 000000000..94e073dcc --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,3 @@ +# Top mailer class, from which all others are inheritors +class ApplicationMailer < ActionMailer::Base +end diff --git a/app/mailers/news_notifications.rb b/app/mailers/news_notifications.rb index 8bfb45aed..4afd5d807 100644 --- a/app/mailers/news_notifications.rb +++ b/app/mailers/news_notifications.rb @@ -2,7 +2,7 @@ # # This mailer is used to notify news writers when their news are accepted or refused. # -class NewsNotifications < ActionMailer::Base +class NewsNotifications < ApplicationMailer MODERATORS = "Équipe de modération de LinuxFr.org " EDITORS = "Équipe de rédaction de LinuxFr.org " diff --git a/app/models/account.rb b/app/models/account.rb index 8aacf8010..c755e1c04 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -45,13 +45,14 @@ # * editor -> they edit the news in the redaction space # * admin -> the almighty users # -class Account < ActiveRecord::Base +class Account < ApplicationRecord include Canable::Cans + include ActionView::Helpers::NumberHelper include ActionView::Helpers::TextHelper has_many :applications, class_name: 'Doorkeeper::Application', as: :owner has_many :logs, dependent: :destroy - belongs_to :user, inverse_of: :account, dependent: :delete + belongs_to :user, inverse_of: :account, dependent: :delete, optional: true accepts_nested_attributes_for :user, reject_if: :all_blank mount_uploader :uploaded_stylesheet, StylesheetUploader @@ -232,7 +233,7 @@ def tag(node, tags) def read(node) node.read_by(self.id) - $redis.srem "dashboard/#{self.id}", node.id + $redis.srem? "dashboard/#{self.id}", node.id end def notify_answer_on(node_id) @@ -301,7 +302,7 @@ def log_karma(points, who) ### Blocked for comments ### def blocked? - $redis.exists("block/#{self.id}") + $redis.exists?("block/#{self.id}") end def block(nb_days, user_id) @@ -321,7 +322,7 @@ def can_block? ### Plonk for the board ### def plonked? - $redis.exists("plonk/#{self.id}") + $redis.exists?("plonk/#{self.id}") end def plonk(nb_days, user_id) diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..23c70da48 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,4 @@ +# Base domain class +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/banner.rb b/app/models/banner.rb index bf976d07b..1f3ac1e69 100644 --- a/app/models/banner.rb +++ b/app/models/banner.rb @@ -8,9 +8,7 @@ # content :text(16777215) # active :boolean default(TRUE) # - -# -class Banner < ActiveRecord::Base +class Banner < ApplicationRecord scope :active, -> { where(active: true) } validates :title, presence: { message: "Le titre ne peut être vide" }, diff --git a/app/models/bookmark.rb b/app/models/bookmark.rb index 75e47a37f..118abd152 100644 --- a/app/models/bookmark.rb +++ b/app/models/bookmark.rb @@ -21,7 +21,7 @@ class Bookmark < Content self.table_name = "bookmarks" self.type = "Lien" - belongs_to :owner, class_name: 'User' + belongs_to :owner, class_name: 'User', optional: true validates :title, presence: { message: "Le titre est obligatoire" }, length: { maximum: 100, message: "Le titre est trop long" } diff --git a/app/models/category.rb b/app/models/category.rb index 4b9fab323..2f03ee42f 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -13,7 +13,7 @@ # The tracker entries are categorized, # for helping users browsing them. # -class Category < ActiveRecord::Base +class Category < ApplicationRecord has_many :trackers, dependent: :nullify validates :title, presence: { message: 'Les catégories ont obligatoirement un titre' }, diff --git a/app/models/comment.rb b/app/models/comment.rb index 32ba6b0d2..957da6143 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -20,10 +20,10 @@ # The users can comment any content. # Those comments are threaded and can be noted. # -class Comment < ActiveRecord::Base +class Comment < ApplicationRecord include Canable::Ables - belongs_to :user + belongs_to :user, optional: true belongs_to :node, counter_cache: :comments_count delegate :content, :content_type, to: :node diff --git a/app/models/content.rb b/app/models/content.rb index 9b49ef4b6..c4cfbf2ac 100644 --- a/app/models/content.rb +++ b/app/models/content.rb @@ -3,7 +3,7 @@ # It's use as the base class for each content type. # It defines some common methods, particulary for ACL. # -class Content < ActiveRecord::Base +class Content < ApplicationRecord self.abstract_class = true include Canable::Ables diff --git a/app/models/diary.rb b/app/models/diary.rb index 210fae821..aaaa4e585 100644 --- a/app/models/diary.rb +++ b/app/models/diary.rb @@ -24,7 +24,7 @@ class Diary < Content self.type = "Journal" belongs_to :owner, class_name: 'User' - belongs_to :converted_news, class_name: 'News' + belongs_to :converted_news, class_name: 'News', optional: true validates :title, presence: { message: "Le titre est obligatoire" }, length: { maximum: 100, message: "Le titre est trop long" } @@ -35,7 +35,7 @@ class Diary < Content wikify_attr :body truncate_attr :body -### SEO ### + ### SEO ### extend FriendlyId friendly_id @@ -44,7 +44,7 @@ def should_generate_new_friendly_id? title_changed? end -### ACL ### + ### ACL ### def creatable_by?(account) account.karma > 0 @@ -58,7 +58,7 @@ def destroyable_by?(account) account.moderator? || account.admin? end -### Moving ### + ### Moving ### def convert_only_cc_licensed_diary errors.add :base, :cannot_convert, message: "Le journal n’a pas été publié sous licence CC By-SA 4.0, il ne peut donc pas être proposé en dépêche." unless node.cc_licensed? end @@ -86,22 +86,20 @@ def move_to_forum(attrs) @post.wiki_body = wiki_body @post.transaction do @post.save! - # Note: the 2 nodes are swapped so that all references to the diairy + # The 2 nodes are swapped so that all references to the diairy # (comments, tags, etc.) are moved to the post. other = @post.node other.attributes = node.attributes.except("id", "content_id").merge(content_type: "XXX", public: false) - other.save! - stmt = <<-EOS + other.save!(validate: false) + Node.connection.update <<-SQL.squish UPDATE nodes SET content_id=(#{node.content_id + @post.node.content_id} - content_id), content_type=CASE content_type WHEN 'Diary' THEN 'Post' ELSE 'Diary' END WHERE id=#{node.id} OR id=#{@post.node.id} - EOS - Node.connection.update(stmt) + SQL node.compute_interest end end - end diff --git a/app/models/forum.rb b/app/models/forum.rb index 85423f9a4..3433c61bc 100644 --- a/app/models/forum.rb +++ b/app/models/forum.rb @@ -16,7 +16,7 @@ # The forums is the place where the users ask questions and answer them. # It'as all about helping each others. # -class Forum < ActiveRecord::Base +class Forum < ApplicationRecord acts_as_list has_many :posts, inverse_of: :forum diff --git a/app/models/friend_site.rb b/app/models/friend_site.rb index 798814f5e..3298af6bb 100644 --- a/app/models/friend_site.rb +++ b/app/models/friend_site.rb @@ -9,7 +9,7 @@ # position :integer # -class FriendSite < ActiveRecord::Base +class FriendSite < ApplicationRecord acts_as_list default_scope { order(position: :asc) } diff --git a/app/models/image.rb b/app/models/image.rb index 626218e67..e40e6c1bd 100644 --- a/app/models/image.rb +++ b/app/models/image.rb @@ -27,7 +27,7 @@ def self.original_link(link) end def register_in_redis - if $redis.exists "img/#{link}" + if $redis.exists? "img/#{link}" $redis.del "img/err/#{link}" return end diff --git a/app/models/link.rb b/app/models/link.rb index 52fde9b42..cd6e2e55d 100644 --- a/app/models/link.rb +++ b/app/models/link.rb @@ -16,7 +16,7 @@ # The news can have some important links. # We follow the number of clicks on each of these links. # -class Link < ActiveRecord::Base +class Link < ApplicationRecord PROTOCOLS = HTML::Pipeline::SanitizationFilter::WHITELIST[:protocols]['a']['href'] - [:relative] belongs_to :news diff --git a/app/models/log.rb b/app/models/log.rb index 258d8b6f2..87b14806d 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -13,7 +13,7 @@ # # The Log class is here to keep some facts about accounts like plonks. # -class Log < ActiveRecord::Base - belongs_to :account # The account that has been modified - belongs_to :user # The AMR or user who made the modification +class Log < ApplicationRecord + belongs_to :account # The account that has been modified + belongs_to :user, optional: true # The AMR or user who made the modification end diff --git a/app/models/news.rb b/app/models/news.rb index 67d5f4a45..18fd6926a 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -39,7 +39,7 @@ class News < Content self.type = "Dépêche" belongs_to :section - belongs_to :moderator, class_name: "User" + belongs_to :moderator, class_name: "User", optional: true has_many :links, dependent: :destroy, inverse_of: :news has_many :paragraphs, dependent: :destroy, inverse_of: :news accepts_nested_attributes_for :links, allow_destroy: true, reject_if: proc { |attrs| attrs['url'].blank? } @@ -314,8 +314,8 @@ def vote_on_candidate(value, account) word = value > 0 ? "pour" : "contre" who = account.login if value.abs == 2 - $redis.srem("news/#{self.id}/pour", who) - $redis.srem("news/#{self.id}/contre", who) + $redis.srem?("news/#{self.id}/pour", who) + $redis.srem?("news/#{self.id}/contre", who) else $redis.incr("users/#{who}/nb_votes") key = "users/#{who}/nb_votes/#{Date.today.yday}" @@ -359,7 +359,7 @@ def urgent! end def no_more_urgent! - $redis.srem("news/urgent", self.id) + $redis.srem?("news/urgent", self.id) end ### ACL ### diff --git a/app/models/news_version.rb b/app/models/news_version.rb index 1b1dcf13d..44cbfc949 100644 --- a/app/models/news_version.rb +++ b/app/models/news_version.rb @@ -13,11 +13,9 @@ # links :text(16777215) # created_at :datetime # - -# -class NewsVersion < ActiveRecord::Base +class NewsVersion < ApplicationRecord belongs_to :news - belongs_to :user + belongs_to :user, optional: true acts_as_list column: 'version', scope: :news diff --git a/app/models/node.rb b/app/models/node.rb index 5b4460f06..6fd64da5f 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -22,8 +22,8 @@ # It helps organizing some common stuff between the contents, # and facilitates the transformation of one content to another. # -class Node < ActiveRecord::Base - belongs_to :user # can be NULL +class Node < ApplicationRecord + belongs_to :user, optional: true # can be NULL belongs_to :content, polymorphic: true, inverse_of: :node has_many :comments, inverse_of: :node has_many :taggings, -> { includes(:tag) }, dependent: :destroy @@ -76,7 +76,7 @@ def make_visible ### Votes ### def vote_by?(account_id) - $redis.exists("nodes/#{self.id}/votes/#{account_id}") + $redis.exists?("nodes/#{self.id}/votes/#{account_id}") end def vote_for(account) diff --git a/app/models/page.rb b/app/models/page.rb index 4d7aeb88d..2404234d6 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -10,8 +10,7 @@ # created_at :datetime # updated_at :datetime # - -class Page < ActiveRecord::Base +class Page < ApplicationRecord validates :slug, presence: { message: "Le slug est obligatoire" } validates :title, presence: { message: "Le titre est obligatoire" }, length: { maximum: 255, message: "Le titre est trop long" } diff --git a/app/models/paragraph.rb b/app/models/paragraph.rb index 20679fb5c..fd17813ff 100644 --- a/app/models/paragraph.rb +++ b/app/models/paragraph.rb @@ -18,7 +18,7 @@ # # A paragraph can be split in several if it has a blank line in its body. # -class Paragraph < ActiveRecord::Base +class Paragraph < ApplicationRecord belongs_to :news attr_accessor :user, :after, :already_split diff --git a/app/models/poll.rb b/app/models/poll.rb index eced3d034..acf6c6663 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -113,7 +113,7 @@ def answerable_by?(ip) ### Voters IP ### def has_voted?(ip) - $redis.exists("polls/#{self.id}/#{ip}") + $redis.exists?("polls/#{self.id}/#{ip}") end def vote(ip) diff --git a/app/models/poll_answer.rb b/app/models/poll_answer.rb index 93e81e69b..0e097f3e6 100644 --- a/app/models/poll_answer.rb +++ b/app/models/poll_answer.rb @@ -11,9 +11,7 @@ # created_at :datetime # updated_at :datetime # - -# -class PollAnswer < ActiveRecord::Base +class PollAnswer < ApplicationRecord belongs_to :poll acts_as_list scope: :poll diff --git a/app/models/response.rb b/app/models/response.rb index 6a867f82e..755fd65a9 100644 --- a/app/models/response.rb +++ b/app/models/response.rb @@ -13,7 +13,7 @@ # too short, already proposed, should go in forum... # So, we keep response templates for theses emails. # -class Response < ActiveRecord::Base +class Response < ApplicationRecord validates :title, presence: { message: "Le titre est obligatoire" }, length: { maximum: 255, message: "Le titre est trop long" } end diff --git a/app/models/section.rb b/app/models/section.rb index fe8160a39..bf273955a 100644 --- a/app/models/section.rb +++ b/app/models/section.rb @@ -14,7 +14,7 @@ # # The news are classified in several sections. # -class Section < ActiveRecord::Base +class Section < ApplicationRecord has_many :news, inverse_of: :section scope :published, -> { where(state: "published").order("title") } diff --git a/app/models/statistics/contents.rb b/app/models/statistics/contents.rb index 777964076..74e929df1 100644 --- a/app/models/statistics/contents.rb +++ b/app/models/statistics/contents.rb @@ -63,7 +63,7 @@ def contents_by_month end def contents_by_day - select_all "SELECT DAYNAME(CONVERT_TZ(created_at, 'UTC', 'Europe/Paris')) AS d, WEEKDAY(CONVERT_TZ(created_at, 'UTC', 'Europe/Paris')) AS day, COUNT(*) AS cnt FROM nodes WHERE public=1 GROUP BY d ORDER BY day ASC" + select_all "SELECT DAYNAME(CONVERT_TZ(created_at, 'UTC', 'Europe/Paris')) AS d, WEEKDAY(CONVERT_TZ(created_at, 'UTC', 'Europe/Paris')) AS day, COUNT(*) AS cnt FROM nodes WHERE public=1 GROUP BY d, day ORDER BY day ASC" end def news_size diff --git a/app/models/statistics/moderation.rb b/app/models/statistics/moderation.rb index a7bc1c14d..881e0806b 100644 --- a/app/models/statistics/moderation.rb +++ b/app/models/statistics/moderation.rb @@ -9,7 +9,7 @@ def by_day COUNT(*) AS cnt FROM nodes WHERE (content_type='News' or content_type='Poll') AND public=1 - GROUP BY type,d + GROUP BY type, d, day ORDER BY type ASC, day ASC EOS end @@ -69,7 +69,7 @@ def top_amr(sql_criterion="") AND content_type='News' AND moderator_id=users.id #{sql_criterion} - GROUP BY moderator_id + GROUP BY name, users.cached_slug, login, moderator_id ORDER BY LOWER(login) ASC EOS end @@ -80,7 +80,7 @@ def top_am def created_on_the_last_nbdays(nbdays,prefix="") return "1=1" unless nbdays - "#{prefix}created_at >= '#{nbdays.days.ago.to_s :db}'" + "#{prefix}created_at >= '#{nbdays.days.ago.to_fs :db}'" end def nb_moderations_x_days(user_id,nbdays=nil) diff --git a/app/models/statistics/redaction.rb b/app/models/statistics/redaction.rb index 3366a8d4f..ecb396850 100644 --- a/app/models/statistics/redaction.rb +++ b/app/models/statistics/redaction.rb @@ -15,11 +15,11 @@ def top(sql_criterion="", limit=10) end def top_month(limit=10) - top "AND news_versions.created_at >= '#{1.month.ago.to_s :db}'", limit + top "AND news_versions.created_at >= '#{1.month.ago.to_fs :db}'", limit end def top_week(limit=10) - top "AND news_versions.created_at >= '#{7.days.ago.to_s :db}'", limit + top "AND news_versions.created_at >= '#{7.days.ago.to_fs :db}'", limit end def top_created(nb_days, limit) @@ -28,7 +28,7 @@ def top_created(nb_days, limit) FROM news JOIN nodes ON news.id = nodes.content_id AND nodes.content_type = 'News' JOIN users ON users.id = nodes.user_id - WHERE news.created_at >= '#{nb_days.days.ago.to_s :db}' + WHERE news.created_at >= '#{nb_days.days.ago.to_fs :db}' GROUP BY users.id ORDER BY cnt DESC LIMIT #{limit} @@ -40,7 +40,7 @@ def top_edited(nb_days, limit) SELECT users.name, users.cached_slug, COUNT(DISTINCT news_id) AS cnt FROM users JOIN news_versions ON users.id = news_versions.user_id - WHERE news_versions.created_at >= '#{nb_days.days.ago.to_s :db}' + WHERE news_versions.created_at >= '#{nb_days.days.ago.to_fs :db}' GROUP BY users.id ORDER BY cnt DESC LIMIT #{limit} diff --git a/app/models/statistics/tags.rb b/app/models/statistics/tags.rb index b74f3b7dd..92186e5c0 100644 --- a/app/models/statistics/tags.rb +++ b/app/models/statistics/tags.rb @@ -61,6 +61,6 @@ def taggings_by_month end def taggings_by_day - select_all "SELECT DAYNAME(CONVERT_TZ(taggings.created_at,'UTC','Europe/Paris')) AS d, WEEKDAY(CONVERT_TZ(taggings.created_at,'UTC','Europe/Paris')) AS day, COUNT(*) AS cnt FROM taggings,nodes WHERE taggings.node_id=nodes.id AND nodes.public=1 GROUP BY d ORDER BY day ASC" + select_all "SELECT DAYNAME(CONVERT_TZ(taggings.created_at,'UTC','Europe/Paris')) AS d, WEEKDAY(CONVERT_TZ(taggings.created_at,'UTC','Europe/Paris')) AS day, COUNT(*) AS cnt FROM taggings,nodes WHERE taggings.node_id=nodes.id AND nodes.public=1 GROUP BY d, day ORDER BY day ASC" end end diff --git a/app/models/tag.rb b/app/models/tag.rb index f9f64d916..a59dc9b11 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -8,8 +8,7 @@ # taggings_count :integer default(0), not null # public :boolean default(TRUE), not null # - -class Tag < ActiveRecord::Base +class Tag < ApplicationRecord has_many :taggings, dependent: :destroy, inverse_of: :tag has_many :nodes, -> { distinct }, through: :taggings diff --git a/app/models/tagging.rb b/app/models/tagging.rb index 09b364a1c..57ad36f3b 100644 --- a/app/models/tagging.rb +++ b/app/models/tagging.rb @@ -9,11 +9,10 @@ # user_id :integer # created_at :datetime # - -class Tagging < ActiveRecord::Base +class Tagging < ApplicationRecord belongs_to :tag, counter_cache: true belongs_to :node - belongs_to :user + belongs_to :user, optional: true validates_uniqueness_of :tag_id, :scope => [:node_id, :user_id] validates :tag_id, presence: true diff --git a/app/models/tracker.rb b/app/models/tracker.rb index f172cafd4..8613a2636 100644 --- a/app/models/tracker.rb +++ b/app/models/tracker.rb @@ -25,7 +25,7 @@ class Tracker < Content self.table_name = "trackers" self.type = "Suivi" - belongs_to :assigned_to_user, class_name: "User" + belongs_to :assigned_to_user, class_name: "User", optional: true belongs_to :category attr_accessor :pot_de_miel diff --git a/app/models/user.rb b/app/models/user.rb index f554210ec..0f55c1bed 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,7 +19,7 @@ # The users are the public informations about the people who create contents. # See accounts for the private ones, like authentication. # -class User < ActiveRecord::Base +class User < ApplicationRecord has_one :account, dependent: :destroy, inverse_of: :user has_many :nodes, inverse_of: :user has_many :diaries, dependent: :destroy, inverse_of: :owner, foreign_key: "owner_id" diff --git a/app/models/wiki_version.rb b/app/models/wiki_version.rb index ae800c99d..168927637 100644 --- a/app/models/wiki_version.rb +++ b/app/models/wiki_version.rb @@ -11,10 +11,8 @@ # body :text(4294967295) # created_at :datetime # - -# -class WikiVersion < ActiveRecord::Base - belongs_to :user +class WikiVersion < ApplicationRecord + belongs_to :user, optional: true belongs_to :wiki_page has_one :node, through: :wiki_page diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index d04cd196e..a0d38afcc 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -73,7 +73,7 @@ #{ (account.user.tags.count - account.user.tags.visible.count) } #{ image_tag "/images/icones/denied.png", alt: "masqués", title: "masqués", width: "16px" } %br - %td= account.created_at.to_s(:posted) + %td= account.created_at.to_fs(:posted) %td= account.display_last_seen_on %td - if account.inactive? && account.user_id != 1 diff --git a/app/views/boards/_large.html.haml b/app/views/boards/_large.html.haml index 315ab4c71..5f6519eb1 100644 --- a/app/views/boards/_large.html.haml +++ b/app/views/boards/_large.html.haml @@ -3,7 +3,7 @@ .inbox-container .inbox.large - boards.reverse.each do |board| - = render board, board: board, box: box, is_large: true + = render 'boards/board', board: board, box: box, is_large: true - if current_account && current_account.can_post_on_board? = form_tag "/board", class: 'chat' do = hidden_field :board, :object_type, value: board.object_type diff --git a/app/views/boards/show.tsv.erb b/app/views/boards/show.tsv.erb index cb5677abe..96707b2c7 100644 --- a/app/views/boards/show.tsv.erb +++ b/app/views/boards/show.tsv.erb @@ -1,3 +1,3 @@ <% @boards.reverse_each do |board| %> -<%= board.id %> <%= board.created_at.to_s(:timestamp) %> <%= raw board.remove_control_chars board.user_agent %> <%= board.user_name %> <%= raw board.remove_control_chars board.message %> +<%= board.id %> <%= board.created_at.to_fs(:timestamp) %> <%= raw board.remove_control_chars board.user_agent %> <%= board.user_name %> <%= raw board.remove_control_chars board.message %> <% end %> diff --git a/app/views/boards/show.xml.builder b/app/views/boards/show.xml.builder index 05263e303..cbe584ef6 100644 --- a/app/views/boards/show.xml.builder +++ b/app/views/boards/show.xml.builder @@ -2,7 +2,7 @@ xml.instruct! xml << "\n" xml.board(:site => "https://linuxfr.org/") do @boards.each do |board| - xml.post(:time => board.created_at.to_s(:timestamp), :id => board.id) do + xml.post(:time => board.created_at.to_fs(:timestamp), :id => board.id) do xml.info board.user_agent xml.message board.message xml.login board.user_name diff --git a/app/views/comments/_comment.html.haml b/app/views/comments/_comment.html.haml index 19c748b33..9c73223cb 100644 --- a/app/views/comments/_comment.html.haml +++ b/app/views/comments/_comment.html.haml @@ -15,7 +15,7 @@ \. - if comment.created_at != comment.updated_at %span.update> - Dernière modification le #{comment.updated_at.to_s :posted}. + Dernière modification le #{comment.updated_at.to_fs :posted}. %figure.image= avatar_img(comment.user) - if comment.deleted? .content.deleted diff --git a/app/views/comments/_thread.html.haml b/app/views/comments/_thread.html.haml index 3a6b2f5fc..e2a9831ab 100644 --- a/app/views/comments/_thread.html.haml +++ b/app/views/comments/_thread.html.haml @@ -1,5 +1,5 @@ %li.comment{comment_attr(thread.comment)} - = render thread.comment, hide_content_title: 1 + = render 'comments/comment', comment: thread.comment, hide_content_title: 1 - if thread.children.any? %ul - thread.children.each do |thread| diff --git a/app/views/dashboard/_comments.html.haml b/app/views/dashboard/_comments.html.haml index 3efcaf0ae..a7f6fd196 100644 --- a/app/views/dashboard/_comments.html.haml +++ b/app/views/dashboard/_comments.html.haml @@ -23,10 +23,10 @@ %tr %td #{translate_content_type comment.content_type} : #{link_to_content comment.content} %td= link_to comment.title, path_for_content(comment.node.content) + "#comment-#{comment.id}" - %td.date= comment.created_at.to_s(:posted) + %td.date= comment.created_at.to_fs(:posted) %td.number= comment.bound_score %td.number - if answer && !answer.read_by?(current_account) = image_tag "/images/icones/comment.png", alt: "Nouveaux commentaires !", class: "thread-new-comments" = comment.nb_answers - %td.date= answer ? answer.created_at.to_s(:posted) : " " + %td.date= answer ? answer.created_at.to_fs(:posted) : " " diff --git a/app/views/dashboard/_posts.html.haml b/app/views/dashboard/_posts.html.haml index 9b1b9bcdf..0fdbb24f7 100644 --- a/app/views/dashboard/_posts.html.haml +++ b/app/views/dashboard/_posts.html.haml @@ -18,4 +18,4 @@ %td= link_to post.title, [post.forum, post] %td.number= node.score %td.number= node.comments.count - %td.date= post.created_at.to_s(:posted) + %td.date= post.created_at.to_fs :posted diff --git a/app/views/dashboard/_trackers.html.haml b/app/views/dashboard/_trackers.html.haml index e99eb872b..75ca0840c 100644 --- a/app/views/dashboard/_trackers.html.haml +++ b/app/views/dashboard/_trackers.html.haml @@ -20,4 +20,4 @@ %td= tracker.state_name %td.number= node.score %td.number= node.comments.count - %td.date= tracker.created_at.to_s(:posted) + %td.date= tracker.created_at.to_fs(:posted) diff --git a/app/views/devise/registrations/_applications.html.haml b/app/views/devise/registrations/_applications.html.haml index 078021940..844f79aa6 100644 --- a/app/views/devise/registrations/_applications.html.haml +++ b/app/views/devise/registrations/_applications.html.haml @@ -17,7 +17,7 @@ - current_account.authorized_applications.each do |app| %tr %td= app.name - %td= app.created_at.to_s(:posted) + %td= app.created_at.to_fs(:posted) %td= button_to "Révoquer", api_authorized_application_path(app), method: :delete, data: { confirm: "Révoquer cette autorisation ?" }, class: "delete_button" - else %p Vous n’avez donné aucune autorisation à des applications. diff --git a/app/views/moderation/news/index.html.haml b/app/views/moderation/news/index.html.haml index 6d18c5b5f..4c1c9d2ef 100644 --- a/app/views/moderation/news/index.html.haml +++ b/app/views/moderation/news/index.html.haml @@ -37,4 +37,4 @@ = list_of(@polls) do |poll| = link_to poll.title, [:moderation, poll] -= render 'board' += render 'redaction/news/board' diff --git a/app/views/moderation/news/show.html.haml b/app/views/moderation/news/show.html.haml index 99cc55f97..170bc6640 100644 --- a/app/views/moderation/news/show.html.haml +++ b/app/views/moderation/news/show.html.haml @@ -1,20 +1,20 @@ - title @news.title - content_for :metadata do - = render 'metadata', news: @news + = render 'redaction/news/metadata', news: @news - content_for :toolpanel do - = render 'toolpanel', news: @news, boards: @boards, enable_reassign: true + = render 'redaction/news/toolpanel', news: @news, boards: @boards, enable_reassign: true - content_for :toolbar do - = render 'toolbar', news: @news + = render 'redaction/news/toolbar', news: @news -= render 'topbar', news: @news, show_backlink: true += render 'redaction/news/topbar', news: @news, show_backlink: true - if @news.paragraphs.any? = article_for @news do |c| - c.title = capture do - = render partial: 'short' + = render partial: 'redaction/news/short' - c.meta = news_posted_by(@news) - c.image = link_to(image_tag(@news.section.image, alt: @news.section.title), @news.section) - c.body = capture do diff --git a/app/views/moderation/news/show.md.erb b/app/views/moderation/news/show.md.erb new file mode 100644 index 000000000..99cbd8ef1 --- /dev/null +++ b/app/views/moderation/news/show.md.erb @@ -0,0 +1 @@ +<%= render template: 'news/show', :content => @news %> diff --git a/app/views/moderation/polls/show.html.haml b/app/views/moderation/polls/show.html.haml index a0a1903d8..1cc9eeced 100644 --- a/app/views/moderation/polls/show.html.haml +++ b/app/views/moderation/polls/show.html.haml @@ -5,4 +5,4 @@ = render 'edition' = render @poll - = render @poll.node + = render 'nodes/node', node: @poll.node diff --git a/app/views/redaction/index.html.haml b/app/views/redaction/index.html.haml index f932fdcde..8d5534141 100644 --- a/app/views/redaction/index.html.haml +++ b/app/views/redaction/index.html.haml @@ -45,7 +45,7 @@ - if n.nb_editors > 0 = "& #{pluralize n.nb_editors, "participant"}" %h3= link_to n.title, [:redaction, n] - Modifiée le #{n.updated_at.to_s :date} à #{n.updated_at.to_s :time} + Modifiée le #{n.updated_at.to_fs :date} à #{n.updated_at.to_fs :time} %h2 #{pluralize @news.count, "dépêche"} en cours de modération - feed "Flux Atom des dépêches en cours de modération", "/redaction/news/moderation.atom" diff --git a/app/views/redaction/news/_toolbar.html.haml b/app/views/redaction/news/_toolbar.html.haml index a21d8c334..c236e0f1b 100644 --- a/app/views/redaction/news/_toolbar.html.haml +++ b/app/views/redaction/news/_toolbar.html.haml @@ -5,6 +5,6 @@ #{news.second_part_toc} - else %p Un sommaire sera automatiquement créé quand le texte sera assez grand. -= image_tag("icones/toc.svg", id: "toolbar-show-toc-button", class: "button popup-event", "data-popup-id": "toolbar-toc", alt: "Sommaire", title: "Sommaire") -= image_tag("icones/slight_x.svg", id: "toolbar-hide-toc-button", class: "button popup-event", "data-popup-id": "toolbar-toc", alt: "Sommaire", title: "Sommaire") -= image_tag("icones/right_sidebar.svg", class: "button popup-event", "data-popup-id": "toolpanel", "data-popup-shown": true, alt: "Afficher les détails", title: "Afficher les détails") += image_tag("/images/icones/toc.svg", id: "toolbar-show-toc-button", class: "button popup-event", "data-popup-id": "toolbar-toc", alt: "Sommaire", title: "Sommaire") += image_tag("/images/icones/slight_x.svg", id: "toolbar-hide-toc-button", class: "button popup-event", "data-popup-id": "toolbar-toc", alt: "Sommaire", title: "Sommaire") += image_tag("/images/icones/right_sidebar.svg", class: "button popup-event", "data-popup-id": "toolpanel", "data-popup-shown": true, alt: "Afficher les détails", title: "Afficher les détails") diff --git a/app/views/redaction/news/_toolpanel.html.haml b/app/views/redaction/news/_toolpanel.html.haml index 0b8254c9b..e4e7f0f37 100644 --- a/app/views/redaction/news/_toolpanel.html.haml +++ b/app/views/redaction/news/_toolpanel.html.haml @@ -58,9 +58,9 @@ #{"caractère".pluralize(news_content.length)} %hr %p Participants - = render 'attendees', attendees: news.attendees, enable_reassign: enable_reassign + = render 'redaction/news/attendees', attendees: news.attendees, enable_reassign: enable_reassign #tab-history.tab-content - = render 'editions', news: news + = render 'redaction/news/editions', news: news #tab-help.tab-content - if current_page?(moderation_news_path(news)) %p Pour ajouter une note des modérateurs, commencez simplement une ligne par « N. D. M. : ». @@ -68,7 +68,7 @@ L’icône = image_tag "/images/icones/edit-cut.png", alt: "Suggestion de découpe" sert à suggérer où découper entre les première et seconde parties de la dépêche. - = render 'wiki_help' + = render 'redaction/news/wiki_help' .popup-event{"data-popup-id": "toolpanel"} - = image_tag("icones/arrow-right.svg", alt: "Afficher les détails", title: "Afficher les détails") + = image_tag("/images/icones/arrow-right.svg", alt: "Afficher les détails", title: "Afficher les détails") diff --git a/app/views/redaction/news/_topbar.html.haml b/app/views/redaction/news/_topbar.html.haml index 2f364d3c1..cd6935259 100644 --- a/app/views/redaction/news/_topbar.html.haml +++ b/app/views/redaction/news/_topbar.html.haml @@ -13,4 +13,4 @@ %br %span.revision-date = "le #{I18n.l(revision.created_at, :format => '%d %B %Y à %H:%M:%S')}" - = render 'attendees', attendees: news.attendees, enable_reassign: false + = render 'redaction/news/attendees', attendees: news.attendees, enable_reassign: false diff --git a/app/views/redaction/news/show.md.erb b/app/views/redaction/news/show.md.erb new file mode 100644 index 000000000..99cbd8ef1 --- /dev/null +++ b/app/views/redaction/news/show.md.erb @@ -0,0 +1 @@ +<%= render template: 'news/show', :content => @news %> diff --git a/app/views/trackers/index.html.haml b/app/views/trackers/index.html.haml index d55f193f2..458287dd8 100644 --- a/app/views/trackers/index.html.haml +++ b/app/views/trackers/index.html.haml @@ -50,7 +50,7 @@ %tr{class: tracker.state} %td= link_to tracker.id, tracker %td= link_to tracker.title, tracker - %td= tracker.created_at.to_s(:posted) + %td= tracker.created_at.to_fs(:posted) %td= tracker.assigned_to %td= tracker.user ? link_to(tracker.user.name, tracker.user) : "Anonyme" %td= link_to tracker.category_title, "/suivi?tracker%5Bcategory_id%5D=#{tracker.category_id}" diff --git a/bin/cap b/bin/cap deleted file mode 100755 index 30352d4d4..000000000 --- a/bin/cap +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by Bundler. -# -# The application 'cap' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('capistrano', 'cap') diff --git a/bin/rails b/bin/rails index 073966023..efc037749 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,4 @@ #!/usr/bin/env ruby -APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake index 17240489f..4fbf10b96 100755 --- a/bin/rake +++ b/bin/rake @@ -1,4 +1,4 @@ #!/usr/bin/env ruby -require_relative '../config/boot' -require 'rake' +require_relative "../config/boot" +require "rake" Rake.application.run diff --git a/bin/setup b/bin/setup index 9d46d1931..c1bd8fae5 100755 --- a/bin/setup +++ b/bin/setup @@ -1,33 +1,32 @@ #!/usr/bin/env ruby -require 'fileutils' -include FileUtils +require "fileutils" # path to your application root. -APP_ROOT = File.expand_path('..', __dir__) +APP_ROOT = File.expand_path("..", __dir__) def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") + system(*args, exception: true) end -chdir APP_ROOT do - # This script is a starting point to setup your application. +FileUtils.chdir APP_ROOT do + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') + puts "== Installing dependencies ==" + system! "gem install bundler --conservative" + system("bundle check") || system!("bundle install") - puts "\n== Installing npm modules ==" - system! 'npm install' - - # puts "\n== Copying sample files ==" - unless File.exist?('config/database.yml') - cp 'config/database.yml.sample', 'config/database.yml' - end - unless File.exist?('config/secrets.yml') - cp 'config/secrets.yml.sample', 'config/secrets.yml' - end + puts "\n== Copying sample files ==" + FileUtils.cp "config/database.yml.sample", "config/database.yml" unless File.exist?("config/database.yml") + FileUtils.cp "config/secrets.yml.sample", "config/secrets.yml" unless File.exist?("config/secrets.yml") puts "\n== Preparing database ==" - system! 'bin/rails db:setup' + system! "bin/rails db:prepare" + + puts "\n== Removing old logs and tempfiles ==" + system! "bin/rails log:clear tmp:clear" + + puts "\n== Restarting application server ==" + system! "bin/rails restart" end diff --git a/bin/spring b/bin/spring deleted file mode 100755 index 814ead74d..000000000 --- a/bin/spring +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require "rubygems" - require "bundler" - - if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m) - Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path - gem "spring", match[1] - require "spring/binstub" - end -end diff --git a/bin/update b/bin/update index 692cf21f2..0ecd84db4 100755 --- a/bin/update +++ b/bin/update @@ -1,9 +1,9 @@ #!/usr/bin/env ruby -require 'fileutils' +require "fileutils" include FileUtils # path to your application root. -APP_ROOT = File.expand_path('..', __dir__) +APP_ROOT = File.expand_path("..", __dir__) def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") @@ -13,16 +13,13 @@ chdir APP_ROOT do # This script is a way to update your development environment automatically. # Add necessary update steps to this file. - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - puts "\n== Installing npm modules ==" - system! 'npm install' + puts "== Installing dependencies ==" + system! "gem install bundler --conservative" + system("bundle check") || system!("bundle install") puts "\n== Updating database ==" - system! 'bin/rails db:migrate' + system! "bin/rails db:migrate" puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' + system! "bin/rails log:clear tmp:clear" end diff --git a/config.ru b/config.ru index 547e0f794..ed1b7d1db 100644 --- a/config.ru +++ b/config.ru @@ -8,3 +8,4 @@ if defined?(Unicorn::HttpRequest) end run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb index bd4033c13..c88976295 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,12 +1,18 @@ -# encoding: utf-8 -require_relative 'boot' +require_relative "boot" -require 'rails/all' +require "rails/all" +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module LinuxfrOrg class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 7.1 + + config.action_view.button_to_generates_button_tag = false + I18n.enforce_available_locales = true config.generators do |g| @@ -20,7 +26,18 @@ class Application < Rails::Application ActiveSupport::XmlMini.backend = "Nokogiri" end - config.time_zone = 'Paris' + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + config.autoload_lib(ignore: %w[assets tasks]) + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + config.time_zone = "Paris" + # config.eager_load_paths << Rails.root.join("extras") config.to_prepare do Doorkeeper::AuthorizationsController.layout "doorkeeper" diff --git a/config/boot.rb b/config/boot.rb index b9e460cef..988a5ddc4 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,4 +1,4 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +require "bundler/setup" # Set up gems listed in the Gemfile. +require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..89298772a --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: linuxfr_org_production diff --git a/config/deploy.rb b/config/deploy.rb deleted file mode 100644 index f43cad056..000000000 --- a/config/deploy.rb +++ /dev/null @@ -1,139 +0,0 @@ -# encoding: utf-8 - -# SSH to the servers -require 'sushi/ssh' - -# Bundler -require 'bundler/capistrano' - -# Maintenance -require 'capistrano/maintenance' -set :maintenance_template_path, File.expand_path("../templates/maintenance.rhtml", __FILE__) - -# Assets -set :public_children, %w(images) -load 'deploy/assets' - -# Common options -set :use_sudo, false -set :scm, :git -set :repository, "git://github.com/linuxfrorg/linuxfr.org.git" -set :deploy_via, :remote_cache - -default_run_options[:pty] = true - - -# We have two environments: alpha and prod. -# To make a deploy, precise on which environment, like this: -# $ cap prod deploy -desc "Alpha environment" -task :alpha do - set :vserver, "alpha" - set :user, "alpha" - set :branch, $1 if `git branch` =~ /\* (\S+)\s/m - set :rails_env, "alpha" -end - -desc "Production" -task :prod do - set :vserver, "prod" - set :user, "linuxfr" - set :branch, "master" - set :rails_env, "production" -end - -desc "[internal] Common stuff to alpha and production" -task :common do - set :application, "#{vserver}.linuxfr.org" - set :deploy_to, "/data/#{vserver}/#{user}/#{rails_env}" - server "#{user}@#{application}", :app, :web, :db, primary: true - depend :remote, :file, "#{shared_path}/config/database.yml" - depend :remote, :file, "#{shared_path}/config/secrets.yml" -end -after "alpha", "common" -after "prod", "common" - - -# Check that we have invoked an environment before deploying -before :deploy do - unless exists?(:deploy_to) - raise "Please invoke me like `cap env: deploy` where is prod or alpha" - end -end - - -# Symlinks to share files/dirs between deploys -namespace :fs do - desc "[internal] Install some symlinks to share files between deploys." - task :symlink, roles: :app, except: { no_release: true } do - symlinks = %w(config/database.yml config/secrets.yml node_modules public/pages tmp/sass-cache tmp/sockets uploads) - symlinks.each do |symlink| - run "ln -nfs #{shared_path}/#{symlink} #{release_path}/#{symlink}" - end - run "ln -nfs ~/historique #{release_path}/public/images/" - run "ln -nfs ~/load #{release_path}/public/images/" - end - - desc "[internal] Create the shared directories" - task :create_dirs, roles: :app do - run "mkdir -p #{shared_path}/config" - run "mkdir -p #{shared_path}/node_modules" - run "mkdir -p #{shared_path}/public/pages" - run "mkdir -p #{shared_path}/tmp/sass-cache" - run "mkdir -p #{shared_path}/tmp/sockets" - run "mkdir -p #{shared_path}/uploads/avatars" - run "mkdir -p #{shared_path}/uploads/stylesheets" - end -end -after "deploy:finalize_update", "fs:symlink" -after "deploy:setup", "fs:create_dirs" - - -# Install npm modules before compiling assets -namespace :npm do - desc "[internal] Install npm modules" - task :install, roles: :app, except: { no_release: true } do - run "cd #{release_path} && npm install --production" - end -end -before "deploy:assets:precompile", "npm:install" - - -# Redis cache -namespace :cache do - desc "Flush the redis cache" - task :flush, roles: :app do - run "redis-cli -n 1 flushdb" - end -end -after "deploy:finalize_update", "cache:flush" - - -# The hard-core deployment rules -namespace :deploy do - task :start, roles: :app do - run "cd #{current_path} && bundle exec unicorn -c config/unicorn.rb -E #{rails_env} -D" - end - - task :stop, roles: :app do - set :unicorn_pidfile, "#{shared_path}/pids/unicorn.pid" - run "if [ -e #{unicorn_pidfile} ] ; then kill -QUIT `cat #{unicorn_pidfile}` ; fi" - end - - task :restart, roles: :app, except: { no_release: true } do - set :unicorn_pid, capture("cat #{shared_path}/pids/unicorn.pid").chomp - run "kill -USR2 #{unicorn_pid}" - sleep 1 - run "kill -QUIT #{unicorn_pid}" - end - - task :cold, roles: :app do - stop - update - migrate - start - end -end -before "deploy:cold", "deploy:web:disable" -after "deploy:cold", "deploy:web:enable" -after "deploy:create_symlink", "deploy:cleanup" diff --git a/config/environment.rb b/config/environment.rb index 426333bb4..cac531577 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,5 @@ # Load the Rails application. -require_relative 'application' +require_relative "application" # Initialize the Rails application. Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index b8de73c14..a4f3867f2 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,23 +1,48 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - MY_DOMAIN = ENV["DOMAIN"] || 'dlfp.lo' - IMG_DOMAIN = ENV["IMAGE_DOMAIN"] || 'dlfp.lo' + MY_DOMAIN = ENV["DOMAIN"] || "dlfp.lo" + IMG_DOMAIN = ENV["IMAGE_DOMAIN"] || "dlfp.lo" + + config.hosts << MY_DOMAIN - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development + # In the development environment your application's code is reloaded any time + # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. - config.cache_classes = false + config.enable_reloading = true # Do not eager load code on boot. config.eager_load = false # Show full error reports. config.consider_all_requests_local = true - config.action_controller.perform_caching = false - config.cache_store = :null_store + + # Enable server timing + config.server_timing = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join("tmp/caching-dev.txt").exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + "Cache-Control" => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false + config.action_mailer.perform_caching = false config.action_mailer.delivery_method = :letter_opener config.action_mailer.default_url_options = { host: MY_DOMAIN } @@ -25,28 +50,39 @@ # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Highlight code that enqueued background job in logs. + config.active_job.verbose_enqueue_logs = true # Suppress logger output for asset requests. config.assets.quiet = true - # Adds additional error checking when serving assets at runtime. - # Checks for improperly declared sprockets dependencies. - # Raises helpful error messages. - config.assets.raise_runtime_errors = true + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker config.action_controller.action_on_unpermitted_parameters = :raise + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true end diff --git a/config/environments/production.rb b/config/environments/production.rb index fd686c098..1cea68058 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,10 +1,12 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - MY_DOMAIN = 'linuxfr.org' - IMG_DOMAIN = 'img.linuxfr.org' + MY_DOMAIN = "linuxfr.org" + IMG_DOMAIN = "img.linuxfr.org" # Code is not reloaded between requests. - config.cache_classes = true + config.enable_reloading = false # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers @@ -16,11 +18,14 @@ config.consider_all_requests_local = false config.action_controller.perform_caching = true - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment + # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Enable static file serving from the `/public` folder (turn off if using NGINX/Apache for it). + config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? - # Compress JavaScripts and CSS. + # Compress CSS using a preprocessor. config.assets.js_compressor = :uglifier config.assets.css_compressor = :sass @@ -30,54 +35,89 @@ # Set the page cache directory config.action_controller.page_cache_directory = "#{Rails.public_path}/pages" - # Version of your assets, change this if you want to expire all your assets. - config.assets.version = '1.0' + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.asset_host = "http://assets.example.com" # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache + # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX # Remove X-Frame-Options header config.action_dispatch.default_headers = { - 'X-XSS-Protection' => '1; mode=block', - 'X-Content-Type-Options' => 'nosniff' + "X-XSS-Protection" => "1; mode=block", + "X-Content-Type-Options" => "nosniff" } + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain. + # config.action_cable.mount_path = nil + # config.action_cable.url = "wss://example.com/cable" + # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ] + + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies. + # config.assume_ssl = true + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Set to :debug to see everything in the log. - config.log_level = :info + # Log to STDOUT by default + config.logger = ActiveSupport::Logger.new(STDOUT) + .tap { |logger| logger.formatter = Logger::Formatter.new } + .then { |logger| ActiveSupport::TaggedLogging.new(logger) } # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] + config.log_tags = [:request_id] + + # Info include generic and useful information about system operation, but avoids logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). If you + # want to log everything, set the level to "debug". + config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") # Use a different cache store in production. + # config.cache_store = :mem_cache_store config.cache_store = :redis_cache_store, { url: "redis://localhost:6379/1/cache", expires_in: 1.hour } - config.action_mailer.perform_caching = false + # Use a real queuing backend for Active Job (and separate queues per environment). + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "linuxfr_org_production" - # Precompile additional assets. - # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. - # config.assets.precompile += %w( search.js ) + config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false - config.action_mailer.default_url_options = { protocol: 'https', host: MY_DOMAIN } + config.action_mailer.default_url_options = { protocol: "https", host: MY_DOMAIN } config.action_mailer.delivery_method = :sendmail config.action_mailer.sendmail_settings = { location: "/usr/sbin/sendmail" } + config.action_mailer.perform_caching = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify + # Don't log any deprecations. + config.active_support.report_deprecations = false # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new + config.log_formatter = Logger::Formatter.new + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } end diff --git a/config/environments/test.rb b/config/environments/test.rb index 6eb6bad93..526a40a31 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,31 +1,44 @@ +require "active_support/core_ext/integer/time" + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - MY_DOMAIN = 'dlfp.lo' - IMG_DOMAIN = 'img.dlfp.lo' + MY_DOMAIN = "dlfp.lo" + IMG_DOMAIN = "img.dlfp.lo" - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. + config.eager_load = ENV["CI"].present? - # Configure static asset server for tests with Cache-Control for performance. - config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' } + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + "Cache-Control" => "public, max-age=#{1.hour.to_i}" + } # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false + config.cache_store = :null_store # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false + config.action_dispatch.show_exceptions = :rescuable # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + config.action_mailer.perform_caching = false # Tell Action Mailer not to deliver emails to the real world. @@ -37,11 +50,18 @@ # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true - unless ENV['RAILS_ENABLE_TEST_LOG'] - config.logger = Logger.new(nil) - config.log_level = :fatal - end + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 1a223960b..ac57b1269 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -1,19 +1,21 @@ # Be sure to restart your server when you modify this file. # Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' +Rails.application.config.assets.version = "1.0" -# Add additional assets to the asset load path -Rails.application.config.assets.paths << Rails.root.join('node_modules') +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path # SVG images -Rails.application.config.assets.precompile += %w(feather-icons/dist/icons/arrow-left.svg) +Rails.application.config.assets.precompile += %w[feather-icons/dist/icons/arrow-left.svg] # Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -Rails.application.config.assets.precompile += %w(sorttable.js) -Dir.chdir(Rails.root.join "app/assets/stylesheets") do - Rails.application.config.assets.precompile += Dir["contrib/*"].map {|s| s.sub '.scss', '.css' } - Rails.application.config.assets.precompile += Dir["common/*"].map {|s| s.sub '.scss', '.css' } - Rails.application.config.assets.precompile += Dir["pygments/*"].map {|s| s.sub '.scss', '.css' } +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) +Rails.application.config.assets.precompile += %w[sorttable.js] +Dir.chdir(Rails.root.join("app/assets/stylesheets")) do + Rails.application.config.assets.precompile += Dir["contrib/*"].map { |s| s.sub ".scss", ".css" } + Rails.application.config.assets.precompile += Dir["common/*"].map { |s| s.sub ".scss", ".css" } + Rails.application.config.assets.precompile += Dir["pygments/*"].map { |s| s.sub ".scss", ".css" } end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index e3042ab22..33699c309 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,5 +1,8 @@ +# Be sure to restart your server when you modify this file. + # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } +# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) } -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -Rails.backtrace_cleaner.remove_silencers! unless Rails.env.production? +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code +# by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". +Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index d3bcaa5ec..b3076b38f 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -1,25 +1,25 @@ # Be sure to restart your server when you modify this file. -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header -# Rails.application.config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https - -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" +# Rails.application.configure do +# config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end +# +# # Generate session nonces for permitted importmap, inline scripts, and inline styles. +# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } +# config.content_security_policy_nonce_directives = %w(script-src style-src) +# +# # Report violations without enforcing the policy. +# # config.content_security_policy_report_only = true # end - -# If you are using UJS then enable automatic nonce generation -# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } - -# Report CSP violations to a specified URI -# For further information see the following documentation: -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only -# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 10a2c9e3c..a429ccd90 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -1,2 +1,9 @@ -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password, :password_confirmation] +# Be sure to restart your server when you modify this file. + +# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. +# Use this to limit dissemination of sensitive information. +# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. +Rails.application.config.filter_parameters += %i[ + passw secret token _key crypt salt certificate otp ssn password password_confirmation +] + diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..3860f659e --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym "RESTful" +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 64cdb739e..f61a6b02d 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -1,2 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf Mime::Type.register "text/x-markdown", :md Mime::Type.register "text/tab-separated-values", :tsv diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb new file mode 100644 index 000000000..7db3b9577 --- /dev/null +++ b/config/initializers/permissions_policy.rb @@ -0,0 +1,13 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide HTTP permissions policy. For further +# information see: https://developers.google.com/web/updates/2018/06/feature-policy + +# Rails.application.config.permissions_policy do |policy| +# policy.camera :none +# policy.gyroscope :none +# policy.microphone :none +# policy.usb :none +# policy.fullscreen :self +# policy.payment :self, "https://secure.example.com" +# end diff --git a/config/initializers/require_libs.rb b/config/initializers/require_libs.rb index 31056a0f8..48f2ea48c 100644 --- a/config/initializers/require_libs.rb +++ b/config/initializers/require_libs.rb @@ -1,4 +1,3 @@ # encoding: utf-8 require "digest/md5" -require "resolvers" require "ar_base_ext" diff --git a/config/initializers/secrets.rb b/config/initializers/secrets.rb index 0db25c549..adf01fc3c 100644 --- a/config/initializers/secrets.rb +++ b/config/initializers/secrets.rb @@ -1,2 +1,4 @@ -Push.secret = Rails.application.secrets.push_secret -Devise.pepper = Rails.application.secrets.devise_pepper +Rails.application.reloader.to_prepare do + Push.secret = Rails.application.secrets.push_secret + Devise.pepper = Rails.application.secrets.devise_pepper +end diff --git a/config/initializers/state_machine.rb b/config/initializers/state_machine.rb deleted file mode 100644 index 9a0642f71..000000000 --- a/config/initializers/state_machine.rb +++ /dev/null @@ -1,2 +0,0 @@ -# encoding: utf-8 -StateMachine::Machine.ignore_method_conflicts = true diff --git a/config/initializers/state_machine_patch.rb b/config/initializers/state_machine_patch.rb deleted file mode 100644 index 73fdd0f18..000000000 --- a/config/initializers/state_machine_patch.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See https://github.com/pluginaweek/state_machine/issues/251 -module StateMachine - module Integrations - module ActiveModel - public :around_validation - end - - module ActiveRecord - public :around_save - end - end -end diff --git a/config/initializers/state_machines.rb b/config/initializers/state_machines.rb new file mode 100644 index 000000000..0b912b2aa --- /dev/null +++ b/config/initializers/state_machines.rb @@ -0,0 +1,2 @@ +# encoding: utf-8 +StateMachines::Machine.ignore_method_conflicts = true diff --git a/db/migrate/20230912132937_add_service_name_to_active_storage_blobs.active_storage.rb b/db/migrate/20230912132937_add_service_name_to_active_storage_blobs.active_storage.rb new file mode 100644 index 000000000..a15c6ce8e --- /dev/null +++ b/db/migrate/20230912132937_add_service_name_to_active_storage_blobs.active_storage.rb @@ -0,0 +1,22 @@ +# This migration comes from active_storage (originally 20190112182829) +class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] + def up + return unless table_exists?(:active_storage_blobs) + + unless column_exists?(:active_storage_blobs, :service_name) + add_column :active_storage_blobs, :service_name, :string + + if configured_service = ActiveStorage::Blob.service.name + ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) + end + + change_column :active_storage_blobs, :service_name, :string, null: false + end + end + + def down + return unless table_exists?(:active_storage_blobs) + + remove_column :active_storage_blobs, :service_name + end +end diff --git a/db/migrate/20230912132938_create_active_storage_variant_records.active_storage.rb b/db/migrate/20230912132938_create_active_storage_variant_records.active_storage.rb new file mode 100644 index 000000000..94ac83af0 --- /dev/null +++ b/db/migrate/20230912132938_create_active_storage_variant_records.active_storage.rb @@ -0,0 +1,27 @@ +# This migration comes from active_storage (originally 20191206030411) +class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + # Use Active Record's configured type for primary key + create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| + t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type + t.string :variation_digest, null: false + + t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end + + private + def primary_key_type + config = Rails.configuration.generators + config.options[config.orm][:primary_key_type] || :primary_key + end + + def blobs_primary_key_type + pkey_name = connection.primary_key(:active_storage_blobs) + pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name } + pkey_column.bigint? ? :bigint : pkey_column.type + end +end diff --git a/db/migrate/20230918152346_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/db/migrate/20230918152346_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb new file mode 100644 index 000000000..93c8b85ad --- /dev/null +++ b/db/migrate/20230918152346_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb @@ -0,0 +1,8 @@ +# This migration comes from active_storage (originally 20211119233751) +class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + change_column_null(:active_storage_blobs, :checksum, true) + end +end diff --git a/db/migrate/20231001132606_add_confidential_to_applications.rb b/db/migrate/20231001132606_add_confidential_to_applications.rb new file mode 100644 index 000000000..946d775cd --- /dev/null +++ b/db/migrate/20231001132606_add_confidential_to_applications.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class AddConfidentialToApplications < ActiveRecord::Migration[7.0] + def change + add_column( + :oauth_applications, + :confidential, + :boolean, + null: false, + default: true + ) + end +end diff --git a/db/schema.rb b/db/schema.rb index 79be629b7..be4b1e270 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,17 +2,16 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_05_06_121910) do - - create_table "accounts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| +ActiveRecord::Schema[7.1].define(version: 2023_10_01_132606) do + create_table "accounts", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "user_id" t.string "login", limit: 40, null: false, collation: "utf8mb4_bin" t.string "role", limit: 10, default: "visitor", null: false @@ -22,19 +21,19 @@ t.string "email", limit: 128, null: false t.string "encrypted_password", limit: 128, default: "", null: false t.string "confirmation_token", limit: 64 - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" + t.datetime "confirmed_at", precision: nil + t.datetime "confirmation_sent_at", precision: nil t.string "reset_password_token", limit: 64 - t.datetime "remember_created_at" + t.datetime "remember_created_at", precision: nil t.integer "sign_in_count", default: 0 - t.datetime "current_sign_in_at" - t.datetime "last_sign_in_at" + t.datetime "current_sign_in_at", precision: nil + t.datetime "last_sign_in_at", precision: nil t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.integer "preferences", default: 0, null: false - t.datetime "reset_password_sent_at" + t.datetime "reset_password_sent_at", precision: nil t.integer "min_karma", default: 20 t.integer "max_karma", default: 20 t.string "uploaded_stylesheet" @@ -47,31 +46,31 @@ t.index ["user_id"], name: "index_accounts_on_user_id" end - create_table "banners", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "banners", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title" - t.text "content", limit: 16777215 + t.text "content", size: :medium t.boolean "active", default: true end - create_table "bookmarks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "bookmarks", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title", limit: 160, null: false t.string "cached_slug", limit: 165, null: false t.integer "owner_id" t.string "link", null: false t.string "lang", limit: 2, null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["cached_slug"], name: "index_bookmarks_on_cached_slug" t.index ["owner_id"], name: "index_bookmarks_on_owner_id" end - create_table "categories", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "categories", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title", limit: 32, null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil end - create_table "comments", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "comments", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "node_id", null: false t.integer "user_id" t.string "state", limit: 10, default: "published", null: false @@ -79,10 +78,10 @@ t.integer "score", default: 0, null: false t.boolean "answered_to_self", default: false, null: false t.string "materialized_path", limit: 1022 - t.text "body", limit: 4294967295 - t.text "wiki_body", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :long + t.text "wiki_body", size: :medium + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["node_id"], name: "index_comments_on_node_id" t.index ["state", "created_at"], name: "index_comments_on_state_and_created_at" t.index ["state", "materialized_path"], name: "index_comments_on_state_and_materialized_path", length: { materialized_path: 120 } @@ -90,68 +89,68 @@ t.index ["user_id", "state", "created_at"], name: "index_comments_on_user_id_and_state_and_created_at" end - create_table "diaries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "diaries", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title", limit: 160, null: false t.string "cached_slug", limit: 165, null: false t.integer "owner_id" - t.text "body", limit: 4294967295 - t.text "wiki_body", limit: 16777215 - t.text "truncated_body", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :long + t.text "wiki_body", size: :medium + t.text "truncated_body", size: :medium + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.integer "converted_news_id" t.index ["cached_slug"], name: "index_diaries_on_cached_slug" t.index ["converted_news_id"], name: "fk_diaries_on_converted_news_id" t.index ["owner_id"], name: "index_diaries_on_owner_id" end - create_table "forums", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "forums", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "state", limit: 10, default: "active", null: false t.string "title", limit: 32, null: false t.string "cached_slug", limit: 32, null: false t.integer "position" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["cached_slug"], name: "index_forums_on_cached_slug" end - create_table "friend_sites", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "friend_sites", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title" t.string "url" t.integer "position" t.index ["position"], name: "index_friend_sites_on_position" end - create_table "friendly_id_slugs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "friendly_id_slugs", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "slug", limit: 190 t.integer "sluggable_id" t.string "sluggable_type", limit: 40 - t.datetime "created_at" + t.datetime "created_at", precision: nil t.index ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type" t.index ["sluggable_id"], name: "index_slugs_on_sluggable_id" t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type" end - create_table "links", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "links", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "news_id", null: false t.string "title", limit: 100, null: false t.string "url", null: false t.string "lang", limit: 2, null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["news_id"], name: "index_links_on_news_id" end - create_table "logs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "logs", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "account_id", null: false t.string "description" - t.datetime "created_at" + t.datetime "created_at", precision: nil t.integer "user_id" t.index ["account_id"], name: "index_logs_on_account_id" t.index ["user_id"], name: "fk_logs_on_user_id" end - create_table "news", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "news", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "state", limit: 10, default: "draft", null: false t.string "title", limit: 160, null: false t.string "cached_slug", limit: 165, null: false @@ -159,33 +158,33 @@ t.integer "section_id", null: false t.string "author_name", limit: 32, null: false t.string "author_email", limit: 64, null: false - t.text "body", limit: 4294967295 - t.text "second_part", limit: 4294967295 - t.datetime "created_at" - t.datetime "updated_at" - t.datetime "submitted_at" + t.text "body", size: :long + t.text "second_part", size: :long + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.datetime "submitted_at", precision: nil t.index ["cached_slug"], name: "index_news_on_cached_slug" t.index ["moderator_id"], name: "fk_news_on_moderator_id" t.index ["section_id"], name: "index_news_on_section_id" t.index ["state"], name: "index_news_on_state" end - create_table "news_versions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "news_versions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "news_id", null: false t.integer "user_id" t.integer "version" t.string "title" - t.text "body", limit: 4294967295 - t.text "second_part", limit: 4294967295 - t.text "links", limit: 16777215 - t.datetime "created_at" + t.text "body", size: :long + t.text "second_part", size: :long + t.text "links", size: :medium + t.datetime "created_at", precision: nil t.index ["created_at"], name: "index_news_versions_on_created_at" t.index ["news_id", "user_id"], name: "index_news_versions_on_news_id_and_user_id" t.index ["news_id", "version"], name: "index_news_versions_on_news_id_and_version" t.index ["user_id", "created_at"], name: "index_news_versions_on_user_id_and_created_at" end - create_table "nodes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "nodes", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "content_id" t.string "content_type", limit: 40 t.integer "user_id" @@ -194,9 +193,9 @@ t.integer "score", default: 0, null: false t.integer "interest", default: 0, null: false t.integer "comments_count", default: 0, null: false - t.datetime "last_commented_at" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "last_commented_at", precision: nil + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["content_id", "content_type"], name: "index_nodes_on_content_id_and_content_type", unique: true t.index ["content_type", "public", "interest"], name: "index_nodes_on_content_type_and_public_and_interest" t.index ["public", "created_at"], name: "index_nodes_on_public_and_created_at" @@ -206,28 +205,28 @@ t.index ["user_id"], name: "index_nodes_on_user_id" end - create_table "oauth_access_grants", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + create_table "oauth_access_grants", id: :integer, charset: "utf8mb3", force: :cascade do |t| t.integer "resource_owner_id", null: false t.integer "application_id", null: false t.string "token", null: false t.integer "expires_in", null: false t.text "redirect_uri", null: false - t.datetime "created_at", null: false - t.datetime "revoked_at" + t.datetime "created_at", precision: nil, null: false + t.datetime "revoked_at", precision: nil t.string "scopes" t.index ["application_id"], name: "fk_oauth_access_grants_on_application_id" t.index ["resource_owner_id"], name: "fk_oauth_access_grants_on_resource_owner_id" t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true end - create_table "oauth_access_tokens", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + create_table "oauth_access_tokens", id: :integer, charset: "utf8mb3", force: :cascade do |t| t.integer "resource_owner_id" t.integer "application_id", null: false t.string "token", null: false t.string "refresh_token" t.integer "expires_in" - t.datetime "revoked_at" - t.datetime "created_at", null: false + t.datetime "revoked_at", precision: nil + t.datetime "created_at", precision: nil, null: false t.string "scopes" t.index ["application_id"], name: "fk_oauth_access_tokens_on_application_id" t.index ["refresh_token"], name: "index_oauth_access_tokens_on_refresh_token", unique: true @@ -235,100 +234,101 @@ t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true end - create_table "oauth_applications", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + create_table "oauth_applications", id: :integer, charset: "utf8mb3", force: :cascade do |t| t.string "name", null: false t.string "uid", null: false t.string "secret", null: false t.text "redirect_uri", null: false t.integer "owner_id", null: false t.string "owner_type" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.string "scopes", default: "", null: false + t.boolean "confidential", default: true, null: false t.index ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type" t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true end - create_table "pages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "pages", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "slug", limit: 128 t.string "title" - t.text "body", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :medium + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["slug"], name: "index_pages_on_slug" end - create_table "paragraphs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "paragraphs", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "news_id", null: false t.integer "position" t.boolean "second_part" - t.text "body", limit: 16777215 - t.text "wiki_body", limit: 16777215 + t.text "body", size: :medium + t.text "wiki_body", size: :medium t.index ["news_id", "second_part", "position"], name: "index_paragraphs_on_news_id_and_more" end - create_table "poll_answers", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "poll_answers", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "poll_id", null: false t.string "answer", limit: 128, null: false t.integer "votes", default: 0, null: false t.integer "position" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["poll_id", "position"], name: "index_poll_answers_on_poll_id_and_position" end - create_table "polls", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "polls", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "state", limit: 10, default: "draft", null: false t.string "title", limit: 128, null: false t.string "cached_slug", limit: 128, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.text "wiki_explanations", limit: 16777215 - t.text "explanations", limit: 16777215 + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.text "wiki_explanations", size: :medium + t.text "explanations", size: :medium t.index ["cached_slug"], name: "index_polls_on_cached_slug" t.index ["state"], name: "index_polls_on_state" end - create_table "posts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "posts", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "forum_id", null: false t.string "title", limit: 160, null: false t.string "cached_slug", limit: 165, null: false - t.text "body", limit: 4294967295 - t.text "wiki_body", limit: 16777215 - t.text "truncated_body", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :long + t.text "wiki_body", size: :medium + t.text "truncated_body", size: :medium + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["cached_slug"], name: "index_posts_on_cached_slug" t.index ["forum_id"], name: "index_posts_on_forum_id" end - create_table "responses", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "responses", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title", null: false - t.text "content", limit: 16777215 + t.text "content", size: :medium end - create_table "sections", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "sections", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "state", limit: 10, default: "published", null: false t.string "title", limit: 32, null: false t.string "cached_slug", limit: 32, null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["cached_slug"], name: "index_sections_on_cached_slug" t.index ["state", "title"], name: "index_sections_on_state_and_title" end - create_table "taggings", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "taggings", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "tag_id", null: false t.integer "node_id", null: false t.integer "user_id" - t.datetime "created_at" + t.datetime "created_at", precision: nil t.index ["created_at", "tag_id"], name: "index_taggings_on_created_at_and_tag_id" t.index ["node_id"], name: "index_taggings_on_node_id" t.index ["tag_id"], name: "index_taggings_on_tag_id" t.index ["user_id"], name: "index_taggings_on_user_id" end - create_table "tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "tags", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "name", limit: 64, null: false t.integer "taggings_count", default: 0, null: false t.boolean "public", default: true, null: false @@ -336,30 +336,30 @@ t.index ["public", "taggings_count"], name: "index_tags_on_public_and_taggings_count" end - create_table "trackers", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "trackers", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "state", limit: 10, default: "opened", null: false t.string "title", limit: 100, null: false t.string "cached_slug", limit: 105, null: false t.integer "category_id", null: false t.integer "assigned_to_user_id" - t.text "body", limit: 4294967295 - t.text "wiki_body", limit: 16777215 - t.text "truncated_body", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :long + t.text "wiki_body", size: :medium + t.text "truncated_body", size: :medium + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.index ["assigned_to_user_id"], name: "index_trackers_on_assigned_to_user_id" t.index ["cached_slug"], name: "index_trackers_on_cached_slug" t.index ["category_id"], name: "index_trackers_on_category_id" t.index ["state"], name: "index_trackers_on_state" end - create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "users", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "name", limit: 40 t.string "homesite", limit: 100 t.string "jabber_id", limit: 32 t.string "cached_slug", limit: 32, null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.string "avatar" t.string "signature" t.string "custom_avatar_url" @@ -367,23 +367,23 @@ t.index ["cached_slug"], name: "index_users_on_cached_slug" end - create_table "wiki_pages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "wiki_pages", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.string "title", limit: 100, null: false t.string "cached_slug", limit: 105, null: false - t.text "body", limit: 4294967295 - t.datetime "created_at" - t.datetime "updated_at" + t.text "body", size: :long + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil t.text "truncated_body" t.index ["cached_slug"], name: "index_wiki_pages_on_cached_slug" end - create_table "wiki_versions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t| + create_table "wiki_versions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.integer "wiki_page_id", null: false t.integer "user_id" t.integer "version" t.string "message" - t.text "body", limit: 4294967295 - t.datetime "created_at" + t.text "body", size: :long + t.datetime "created_at", precision: nil t.index ["user_id"], name: "fk_wiki_versions_on_user_id" t.index ["wiki_page_id", "version"], name: "index_wiki_versions_on_wiki_page_id_and_version" end diff --git a/deployment/linuxfr.org/Dockerfile b/deployment/linuxfr.org/Dockerfile index 8506410aa..fbec932b5 100644 --- a/deployment/linuxfr.org/Dockerfile +++ b/deployment/linuxfr.org/Dockerfile @@ -18,18 +18,12 @@ RUN echo 'deb http://archive.debian.org/debian stretch main' > '/etc/apt/sources zlib1g-dev libssl-dev libxml2-dev libxslt-dev autoconf libgmp-dev libyaml-dev \ ncurses-dev bison automake libtool imagemagick libc6-dev hunspell \ hunspell-fr-comprehensive ruby ruby-dev ruby-rack \ - && apt-get install -t stretch-backports -y --no-install-recommends \ - nodejs npm \ && gem install bundler -v 1.17.3 \ && apt-get clean RUN mkdir /home/linuxfr.org ENV HOME /home/linuxfr.org -# Install node external dependencies -COPY package*.json ./ -RUN npm ci - # Install external dependencies COPY Gemfile* ./ diff --git a/lib/resolvers.rb b/lib/resolvers.rb deleted file mode 100644 index 834d1b4fd..000000000 --- a/lib/resolvers.rb +++ /dev/null @@ -1,23 +0,0 @@ -# encoding: utf-8 - -require 'action_view/template/resolver' - -class RedactionResolver < ::ActionView::FileSystemResolver - def initialize - super("app/views") - end - - def find_templates(name, prefix, partial, details, outside_app_allowed = false) - super(name, prefix.sub("moderation", "redaction"), partial, details, outside_app_allowed) - end -end - -class NoNamespaceResolver < ::ActionView::FileSystemResolver - def initialize - super("app/views") - end - - def find_templates(name, prefix, partial, details, outside_app_allowed = false) - super(name, prefix.gsub(/^\w+\//, ""), partial, details, outside_app_allowed) - end -end diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 098fd3545..000000000 --- a/package-lock.json +++ /dev/null @@ -1,3313 +0,0 @@ -{ - "name": "linuxfr.org", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - } - }, - "@babel/helpers": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.3.tgz", - "integrity": "sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q==", - "dev": true, - "requires": { - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", - "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", - "dev": true - }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" - } - }, - "@babel/traverse": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", - "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.0.tgz", - "integrity": "sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng==", - "dev": true - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", - "dev": true - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.0.tgz", - "integrity": "sha512-hMKcyHsZn5+qL6AUeP3c8OyuteZ4VaUlg+fWbyl8z7PqsKHF/Bf8/px3K6AT8aMzDkBo8Bc11245MM+itDBOxQ==", - "dev": true, - "requires": { - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000947", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.14", - "postcss-value-parser": "^3.3.1" - } - }, - "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browserslist": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", - "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000955", - "electron-to-chromium": "^1.3.122", - "node-releases": "^1.1.13" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000957", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz", - "integrity": "sha512-8wxNrjAzyiHcLXN/iunskqQnJquQQ6VX8JHfW5kLgAPRSiSuKZiNfmIkP5j7jgyXqAQBSoXyJxfnbCFS0ThSiQ==", - "dev": true - }, - "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", - "dev": true - }, - "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", - "dev": true - }, - "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "clone-regexp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", - "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", - "dev": true, - "requires": { - "is-regexp": "^1.0.0", - "is-supported-regexp-flag": "^1.0.0" - } - }, - "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" - }, - "cosmiconfig": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", - "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.0", - "parse-json": "^4.0.0" - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "electron-to-chromium": { - "version": "1.3.124", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz", - "integrity": "sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", - "dev": true, - "requires": { - "clone-regexp": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "feather-icons": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.21.0.tgz", - "integrity": "sha512-5RgyUH0J9NCRG5Z+aL8kJduMM4J6IAKlGqSrnkWW6rpY5jC9MyE0NkvgsKOmnedAZN2ORmdXTndPIHFWaMCf6w==", - "requires": { - "classnames": "^2.2.5", - "core-js": "^2.5.3" - } - }, - "file-entry-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", - "integrity": "sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "gonzales-pe": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.4.tgz", - "integrity": "sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==", - "dev": true, - "requires": { - "minimist": "1.1.x" - }, - "dependencies": { - "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", - "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "ignore": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.6.tgz", - "integrity": "sha512-/+hp3kUf/Csa32ktIaj0OlRqQxrgs30n62M90UBpNd9k+ENEch5S+hmbW3DtcJGz3sYFTh4F3A6fQ0q7KWsp4w==", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", - "dev": true - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", - "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-supported-regexp-flag": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", - "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", - "dev": true - }, - "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "known-css-properties": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", - "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", - "dev": true - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", - "dev": true - }, - "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", - "dev": true - }, - "mathml-tag-names": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", - "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", - "dev": true - }, - "mdast-util-compact": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz", - "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==", - "dev": true, - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "node-releases": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.13.tgz", - "integrity": "sha512-fKZGviSXR6YvVPyc011NHuJDSD8gFQvLPmc2d2V3BS4gr52ycyQ1Xzs7a8B+Ax3Ni/W+5h1h4SqmzeoA8WZRmA==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.1.tgz", - "integrity": "sha512-NBWYLQm1KSoDKk7GAHyioLTvCZ5QjdH/ASBBQTD3iLiAWJXS5bg1jEWI8nIJ+vgVvsceBVBcDGRWSo0KVQBvvg==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "requires": { - "htmlparser2": "^3.10.0" - } - }, - "postcss-jsx": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.0.tgz", - "integrity": "sha512-/lWOSXSX5jlITCKFkuYU2WLFdrncZmjSVyNpHAunEgirZXLwI8RjU556e3Uz4mv0WVHnJA9d3JWb36lK9Yx99g==", - "dev": true, - "requires": { - "@babel/core": ">=7.1.0" - } - }, - "postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-markdown": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz", - "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==", - "dev": true, - "requires": { - "remark": "^10.0.1", - "unist-util-find-all-after": "^1.0.2" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "postcss-reporter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", - "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "postcss": "^7.0.7" - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-sass": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.5.tgz", - "integrity": "sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==", - "dev": true, - "requires": { - "gonzales-pe": "^4.2.3", - "postcss": "^7.0.1" - } - }, - "postcss-scss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz", - "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "dev": true, - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", - "dev": true, - "requires": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "dev": true, - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylelint": { - "version": "9.10.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.10.1.tgz", - "integrity": "sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ==", - "dev": true, - "requires": { - "autoprefixer": "^9.0.0", - "balanced-match": "^1.0.0", - "chalk": "^2.4.1", - "cosmiconfig": "^5.0.0", - "debug": "^4.0.0", - "execall": "^1.0.0", - "file-entry-cache": "^4.0.0", - "get-stdin": "^6.0.0", - "global-modules": "^2.0.0", - "globby": "^9.0.0", - "globjoin": "^0.1.4", - "html-tags": "^2.0.0", - "ignore": "^5.0.4", - "import-lazy": "^3.1.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.11.0", - "leven": "^2.1.0", - "lodash": "^4.17.4", - "log-symbols": "^2.0.0", - "mathml-tag-names": "^2.0.1", - "meow": "^5.0.0", - "micromatch": "^3.1.10", - "normalize-selector": "^0.2.0", - "pify": "^4.0.0", - "postcss": "^7.0.13", - "postcss-html": "^0.36.0", - "postcss-jsx": "^0.36.0", - "postcss-less": "^3.1.0", - "postcss-markdown": "^0.36.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-reporter": "^6.0.0", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.0", - "postcss-sass": "^0.3.5", - "postcss-scss": "^2.0.0", - "postcss-selector-parser": "^3.1.0", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^3.3.0", - "resolve-from": "^4.0.0", - "signal-exit": "^3.0.2", - "slash": "^2.0.0", - "specificity": "^0.4.1", - "string-width": "^3.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^5.0.0" - } - }, - "stylelint-config-recommended": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz", - "integrity": "sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==", - "dev": true - }, - "stylelint-config-recommended-scss": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-3.2.0.tgz", - "integrity": "sha512-M8BFHMRf8KNz5EQPKJd8nMCGmBd2o5coDEObfHVbEkyLDgjIf1V+U5dHjaGgvhm0zToUxshxN+Gc5wpbOOew4g==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^2.0.0" - } - }, - "stylelint-scss": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.5.4.tgz", - "integrity": "sha512-hEdEOfFXVqxWcUbenBONW/cAw5cJcEDasY8tGwKNAAn1GDHoZO1ATdWpr+iIk325mPGIQqVb1sUxsRxuL70trw==", - "dev": true, - "requires": { - "lodash": "^4.17.11", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^5.0.0", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", - "dev": true, - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", - "dev": true - }, - "trough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", - "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", - "dev": true - }, - "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "xtend": "^4.0.1" - } - }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unist-util-find-all-after": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", - "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", - "dev": true, - "requires": { - "unist-util-is": "^2.0.0" - } - }, - "unist-util-is": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", - "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", - "dev": true - }, - "unist-util-remove-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", - "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", - "dev": true, - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", - "dev": true - }, - "unist-util-visit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", - "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", - "dev": true, - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", - "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", - "dev": true, - "requires": { - "unist-util-is": "^2.1.2" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "dev": true, - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } - } - }, - "vfile-location": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz", - "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==", - "dev": true - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "dev": true, - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3115c41c3..000000000 --- a/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "linuxfr.org", - "version": "1.0.0", - "description": "LinuxFr.org", - "repository": { - "type": "git", - "url": "git+https://github.com/linuxfrorg/linuxfr.org.git" - }, - "author": "Bruno Michel", - "license": "AGPL-3.0", - "bugs": { - "url": "https://github.com/linuxfrorg/linuxfr.org/issues" - }, - "homepage": "https://github.com/linuxfrorg/linuxfr.org#readme", - "dependencies": { - "feather-icons": "4.21.0", - "normalize.css": "8.0.1" - }, - "devDependencies": { - "prettier": "1.16.4", - "stylelint": "9.10.1", - "stylelint-config-recommended-scss": "3.2.0", - "stylelint-scss": "3.5.4" - }, - "scripts": { - "lint": "stylelint app/*/*/{,common/,parts/,responsive/}*.scss", - "pretty": "prettier --write app/*/*/{,common/,parts/,responsive/}*.scss" - }, - "stylelint": { - "extends": "stylelint-config-recommended-scss", - "rules": { - "no-descending-specificity": null - } - } -} diff --git a/test/controllers/admin/accounts_controller_test.rb b/test/controllers/admin/accounts_controller_test.rb new file mode 100644 index 000000000..0a9d4f8bb --- /dev/null +++ b/test/controllers/admin/accounts_controller_test.rb @@ -0,0 +1,68 @@ +require "test_helper" + +class Admin::AccountsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should not list accounts" do + sign_in accounts "visitor_0" + get admin_accounts_url + + assert_redirected_to account_session_url + end + + test "should list accounts" do + get admin_accounts_url + + assert_response :success + end + + test "should find accounts" do + get admin_accounts_url, params: { + login: "test", + date: "2016-01-01", + ip: "127.0.0.1", + email: "test@example.com", + inactive: "1" + } + + assert_response :success + end + + test "should send password reset" do + post password_admin_account_url(accounts(:anonymous)) + + assert_redirected_to admin_accounts_url + end + + test "should give karma" do + post karma_admin_account_url(accounts(:anonymous)) + + assert_redirected_to accounts(:anonymous).user + end + + test "should activate account" do + patch admin_account_url accounts(:anonymous) + + assert_nil flash[:alert] + assert_equal "Compte réactivé", flash[:notice] + assert_redirected_to admin_accounts_url + end + + test "should inactivate account" do + patch admin_account_url accounts("visitor_999") + + assert_nil flash[:alert] + assert_equal "Compte désactivé", flash[:notice] + assert_redirected_to admin_accounts_url + end + + test "should destroy account" do + delete admin_account_url(accounts(:anonymous)) + + assert_redirected_to admin_accounts_url + end +end diff --git a/test/controllers/admin/admins_controller_test.rb b/test/controllers/admin/admins_controller_test.rb new file mode 100644 index 000000000..39548bb2c --- /dev/null +++ b/test/controllers/admin/admins_controller_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +class Admin::AdminsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should create admin" do + post admin_account_admin_url(accounts("visitor_0")) + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to accounts("visitor_0").user + end + + test "should destroy admin" do + delete admin_account_admin_url(accounts("admin_0")) + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to accounts("admin_0").user + end +end diff --git a/test/controllers/admin/applications_controller_test.rb b/test/controllers/admin/applications_controller_test.rb new file mode 100644 index 000000000..93d4f2efe --- /dev/null +++ b/test/controllers/admin/applications_controller_test.rb @@ -0,0 +1,44 @@ +require "test_helper" + +class Admin::ApplicationsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list applications" do + get admin_applications_url + + assert_response :success + end + + test "should not update application" do + patch admin_application_url(Doorkeeper::Application.first), params: { + doorkeeper_application: { name: "New name" } + } + + assert_response :success + end + + test "should update application" do + app = Doorkeeper::Application.first + app.owner = accounts("admin_0") + app.save! + + patch admin_application_url(app), params: { + doorkeeper_application: { name: "New name" } + } + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to admin_applications_url + end + + test "should destroy application" do + assert_difference("Doorkeeper::Application.count", -1) do + delete admin_application_url(Doorkeeper::Application.first) + end + assert_redirected_to admin_applications_url + end +end diff --git a/test/controllers/admin/banners_controller_test.rb b/test/controllers/admin/banners_controller_test.rb new file mode 100644 index 000000000..003d5a92c --- /dev/null +++ b/test/controllers/admin/banners_controller_test.rb @@ -0,0 +1,92 @@ +require "test_helper" + +class Admin::BannersControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + teardown do + # Reset + Redis.new.del("banners") + end + + test "should list banners" do + get admin_banners_url + + assert_response :success + end + + test "should get new" do + get new_admin_banner_url + + assert_response :success + end + + test "should preview banner" do + assert_no_difference("Banner.count") do + post admin_banners_url, + params: { + banner: { + title: "Hello world", + content: "This is a banner" + }, + commit: "Prévisualiser" + } + end + assert_response :success + end + + test "should create banner" do + assert_difference("Banner.count") do + post admin_banners_url, + params: { + banner: { + title: "Hello world", + content: "This is a banner" + } + } + end + assert_redirected_to admin_banners_url + end + + test "should edit banner" do + get edit_admin_banner_url(banners(:one)) + + assert_response :success + end + + test "should preview update banner" do + assert_no_difference("Banner.count") do + patch admin_banner_url(banners(:one)), + params: { + banner: { + title: "Hello world", + content: "This is a banner" + }, + commit: "Prévisualiser" + } + end + assert_response :success + end + + test "should update banner" do + patch admin_banner_url(banners(:one)), + params: { + banner: { + title: "Hello world", + content: "This is a banner" + } + } + + assert_redirected_to admin_banners_url + end + + test "should destroy banner" do + assert_difference("Banner.count", -1) do + delete admin_banner_url(banners(:one)) + end + assert_redirected_to admin_banners_url + end +end diff --git a/test/controllers/admin/categories_controller_test.rb b/test/controllers/admin/categories_controller_test.rb new file mode 100644 index 000000000..1786d929c --- /dev/null +++ b/test/controllers/admin/categories_controller_test.rb @@ -0,0 +1,76 @@ +require "test_helper" + +class Admin::CategoriesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list categories" do + get admin_categories_url + + assert_response :success + end + + test "should get new" do + get new_admin_category_url + + assert_response :success + end + + test "should not create category" do + assert_no_difference("Category.count") do + post admin_categories_url, params: { + category: { title: "" } + } + + assert flash[:alert] + end + assert_response :success + end + + test "should create category" do + assert_difference("Category.count") do + post admin_categories_url, params: { + category: { title: "Hello world" } + } + + assert_nil flash[:alert] + end + assert_redirected_to admin_categories_url + end + + test "should get edit" do + get edit_admin_category_url(categories(:one)) + + assert_response :success + end + + test "should not update category" do + patch admin_category_url(categories(:one)), params: { + category: { title: "" } + } + + assert flash[:alert] + assert_response :success + end + + test "should update category" do + patch admin_category_url(categories(:one)), params: { + category: { title: "Hello world" } + } + + assert_nil flash[:alert] + assert_redirected_to admin_categories_url + end + + test "should destroy category" do + assert_difference("Category.count", -1) do + delete admin_category_url(categories(:two)) + + assert_nil flash[:alert] + end + assert_redirected_to admin_categories_url + end +end diff --git a/test/controllers/admin/editors_controller_test.rb b/test/controllers/admin/editors_controller_test.rb new file mode 100644 index 000000000..08dba5527 --- /dev/null +++ b/test/controllers/admin/editors_controller_test.rb @@ -0,0 +1,27 @@ +require "test_helper" + +class Admin::EditorsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should authorize editor" do + assert_difference "Account.editor.count" do + post admin_account_editor_url accounts("visitor_0") + + assert flash[:notice] + end + assert_redirected_to accounts("visitor_0").user + end + + test "should destroy editor" do + assert_difference "Account.editor.count", -1 do + delete admin_account_editor_url accounts("editor_0") + + assert flash[:notice] + end + assert_redirected_to accounts("editor_0").user + end +end diff --git a/test/controllers/admin/forums_controller_test.rb b/test/controllers/admin/forums_controller_test.rb new file mode 100644 index 000000000..8c83c3f95 --- /dev/null +++ b/test/controllers/admin/forums_controller_test.rb @@ -0,0 +1,107 @@ +require "test_helper" + +class Admin::ForumsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list forums" do + get admin_forums_url + + assert_response :success + end + + test "should get new" do + get new_admin_forum_url + + assert_response :success + end + + test "should not create forum" do + assert_no_difference("Forum.count") do + post admin_forums_url, params: { + forum: { title: "" } + } + end + assert_response :success + end + + test "should create forum" do + assert_difference("Forum.count") do + post admin_forums_url, params: { + forum: { + title: "Hello world", + cached_slug: "hello-world" + } + } + + assert flash[:notice] + end + assert_redirected_to admin_forums_url + end + + test "should get edit" do + get edit_admin_forum_url(forums(:one)) + + assert_response :success + end + + test "should not update forum" do + patch admin_forum_url(forums(:one)), params: { + forum: { title: "" } + } + + assert_response :success + end + + test "should update forum" do + patch admin_forum_url(forums(:one)), params: { + forum: { title: "Hello world" } + } + + assert flash[:notice] + assert_redirected_to admin_forums_url + end + + test "should archive forum" do + assert_difference "Forum.active.count", -1 do + post archive_admin_forum_url(forums(:one)) + + assert flash[:notice] + end + assert_redirected_to admin_forums_url + end + + test "should reopen forum" do + post reopen_admin_forum_url(forums(:one)) + + assert flash[:notice] + + assert_redirected_to admin_forums_url + end + + test "should destroy forum" do + assert_difference "Forum.count", -1 do + delete admin_forum_url(forums(:two)) + + assert flash[:notice] + end + assert_redirected_to admin_forums_url + end + + test "should lower forum" do + assert_difference "forums(:two).reload.position", -1 do + post lower_admin_forum_url forums(:one) + end + assert_redirected_to admin_forums_url + end + + test "should higher forum" do + assert_difference "forums(:one).reload.position", 1 do + post higher_admin_forum_url forums(:two) + end + assert_redirected_to admin_forums_url + end +end diff --git a/test/controllers/admin/friend_sites_controller_test.rb b/test/controllers/admin/friend_sites_controller_test.rb new file mode 100644 index 000000000..fd86077f3 --- /dev/null +++ b/test/controllers/admin/friend_sites_controller_test.rb @@ -0,0 +1,104 @@ +require "test_helper" + +class FriendSitesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list friend sites" do + get admin_friend_sites_url + + assert_response :success + end + + test "should get new" do + get new_admin_friend_site_url + + assert_response :success + end + + test "should create friend site" do + assert_difference("FriendSite.count") do + post admin_friend_sites_url, params: { + friend_site: { + title: "hello world my friend site", + url: "http://example.com" + } + } + + assert flash[:notice] + end + assert_response :redirect + end + + test "should not create friend site" do + assert_no_difference("FriendSite.count") do + post admin_friend_sites_url, params: { + friend_site: { + url: "http://example.com" + } + } + + assert flash[:alert] + end + assert_response :success + end + + test "should get edit" do + get edit_admin_friend_site_url(friend_sites(:one)) + + assert_response :success + end + + test "should update friend site" do + patch admin_friend_site_url(friend_sites(:one)), params: { + friend_site: { + title: "hello world my friend site", + url: "http://example.com" + } + } + + assert flash[:notice] + assert_response :redirect + end + + test "should not update friend site" do + patch admin_friend_site_url(friend_sites(:one)), params: { + friend_site: { + title: "" + } + } + + assert flash[:alert] + assert_response :success + end + + test "should destroy friend site" do + assert_difference("FriendSite.count", -1) do + delete admin_friend_site_url(friend_sites(:one)) + + assert flash[:notice] + end + assert_response :redirect + end + + test "should lower friend site" do + assert_difference("friend_sites(:one).reload.position") do + post lower_admin_friend_site_url(friend_sites(:one)) + + assert_nil flash[:alert] + end + assert_response :redirect + end + + test "should higher friend site" do + assert_no_difference("friend_sites(:one).position") do + post higher_admin_friend_site_url(friend_sites(:one)) + + assert_nil flash[:alert] + end + assert_response :redirect + end +end diff --git a/test/controllers/admin/logos_controller_test.rb b/test/controllers/admin/logos_controller_test.rb new file mode 100644 index 000000000..d4808b86d --- /dev/null +++ b/test/controllers/admin/logos_controller_test.rb @@ -0,0 +1,24 @@ +require "test_helper" + +class Admin::LogosControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should show logo" do + get admin_logo_url + + assert_response :success + end + + test "should create logo" do + post admin_logo_url, params: { + logo: fixture_file_upload("Logo.png", "image/png") + } + + assert flash[:notice] + assert_redirected_to admin_logo_url + end +end diff --git a/test/controllers/admin/maintainers_controller_test.rb b/test/controllers/admin/maintainers_controller_test.rb new file mode 100644 index 000000000..b468198d3 --- /dev/null +++ b/test/controllers/admin/maintainers_controller_test.rb @@ -0,0 +1,27 @@ +require "test_helper" + +class Admin::MaintainersControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + @account = accounts "visitor_0" + end + + test "should give maintainer rights" do + post admin_account_maintainer_url @account + + assert_redirected_to @account.user + assert_equal "Nouveau rôle : mainteneur", flash[:notice] + assert_predicate @account.reload, :maintainer? + end + + test "should remove maintainer rights" do + @account.give_maintainer_rights! + delete admin_account_maintainer_url @account + + assert_redirected_to @account.user + assert_equal "Rôle retiré : mainteneur", flash[:notice] + assert_not @account.reload.maintainer? + end +end diff --git a/test/controllers/admin/moderators_controller_test.rb b/test/controllers/admin/moderators_controller_test.rb new file mode 100644 index 000000000..f96a28f48 --- /dev/null +++ b/test/controllers/admin/moderators_controller_test.rb @@ -0,0 +1,27 @@ +require "test_helper" + +class Admin::ModeratorsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + @account = accounts "visitor_0" + end + + test "should give moderator rights" do + post admin_account_moderator_url @account + + assert_redirected_to @account.user + assert_equal "Nouveau rôle : modérateur", flash[:notice] + assert_predicate @account.reload, :moderator? + end + + test "should remove moderator rights" do + @account.give_moderator_rights! + delete admin_account_moderator_url @account + + assert_redirected_to @account.user + assert_equal "Rôle retiré : modérateur", flash[:notice] + assert_not @account.reload.moderator? + end +end diff --git a/test/controllers/admin/pages_controller_test.rb b/test/controllers/admin/pages_controller_test.rb new file mode 100644 index 000000000..914986eea --- /dev/null +++ b/test/controllers/admin/pages_controller_test.rb @@ -0,0 +1,91 @@ +require "test_helper" + +class Admin::ModeratorsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list pages" do + get admin_pages_url + + assert_response :success + end + + test "should get new" do + get new_admin_page_url + + assert_response :success + end + + test "should create page" do + assert_difference("Page.count") do + post admin_pages_url, params: { + page: { + title: "hello world my page", + slug: "hello-world-my-page", + body: "hello world" + } + } + + assert flash[:notice] + end + assert_redirected_to admin_pages_url + end + + test "should not create page" do + assert_no_difference("Page.count") do + post admin_pages_url, params: { + page: { + slug: "hello-world-my-page", + body: "hello world" + } + } + + assert flash[:alert] + end + assert_response :success + end + + test "should get edit" do + get edit_admin_page_url(pages(:one)) + + assert_response :success + end + + test "should update page" do + patch admin_page_url(pages(:one)), params: { + page: { + title: "hello world my page", + slug: "hello-world-my-page", + body: "hello world" + } + } + + assert flash[:notice] + assert_redirected_to admin_pages_url + end + + test "should not update page" do + patch admin_page_url(pages(:one)), params: { + page: { + title: "", + slug: "hello-world-my-page", + body: "hello world" + } + } + + assert flash[:alert] + assert_response :success + end + + test "should destroy page" do + assert_difference("Page.count", -1) do + delete admin_page_url(pages(:one)) + + assert flash[:notice] + end + assert_redirected_to admin_pages_url + end +end diff --git a/test/controllers/admin/responses_controller_test.rb b/test/controllers/admin/responses_controller_test.rb new file mode 100644 index 000000000..ec5c00245 --- /dev/null +++ b/test/controllers/admin/responses_controller_test.rb @@ -0,0 +1,84 @@ +require "test_helper" + +class Admin::ResponsesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list responses" do + get admin_responses_url + + assert_response :success + end + + test "should get new" do + get new_admin_response_url + + assert_response :success + end + + test "should create response" do + assert_difference("Response.count") do + post admin_responses_url, params: { + response: { + title: "hello world my response" + } + } + + assert flash[:notice] + end + assert_redirected_to admin_responses_url + end + + test "should not create response" do + assert_no_difference("Response.count") do + post admin_responses_url, params: { + response: { + title: "" + } + } + + assert flash[:alert] + end + assert_response :success + end + + test "should get edit" do + get edit_admin_response_url(responses(:one)) + + assert_response :success + end + + test "should update response" do + patch admin_response_url(responses(:one)), params: { + response: { + title: "hello world my response" + } + } + + assert flash[:notice] + assert_redirected_to admin_responses_url + end + + test "should not update response" do + patch admin_response_url(responses(:one)), params: { + response: { + title: "" + } + } + + assert flash[:alert] + assert_response :success + end + + test "should destroy response" do + assert_difference("Response.count", -1) do + delete admin_response_url(responses(:one)) + + assert flash[:notice] + end + assert_redirected_to admin_responses_url + end +end diff --git a/test/controllers/admin/sections_controller_test.rb b/test/controllers/admin/sections_controller_test.rb new file mode 100644 index 000000000..89d0460f9 --- /dev/null +++ b/test/controllers/admin/sections_controller_test.rb @@ -0,0 +1,77 @@ +require "test_helper" + +class Admin::SectionsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + def setup + sign_in accounts "admin_0" + end + + test "should get new" do + get new_admin_section_url + + assert_response :success + end + + test "should create section" do + assert_difference("Section.count") do + post admin_sections_url, params: { + section: { title: "title" } + } + end + + follow_redirect! + + assert_response :success + assert_select "p", "Il vous reste\n0\navis" + end + + test "should not create section" do + assert_no_difference("Section.count") do + post admin_sections_url, params: { + section: { title: "" } + } + end + + assert_response :success + end + + test "should get edit" do + get edit_admin_section_url(sections(:default)) + + assert_response :success + end + + test "should update section" do + patch admin_section_url(sections(:default)), params: { + section: { + title: "hello world" + } + } + + assert_response :redirect + follow_redirect! + + assert_response :success + assert_select "a", "hello world" + end + + test "should not update section" do + patch admin_section_url(sections(:default)), params: { + section: { + title: "" + } + } + + assert flash[:alert] + assert_response :success + end + + test "should destroy section" do + assert_difference("Section.published.count", -1) do + delete admin_section_url(sections(:default)) + end + + assert_redirected_to admin_sections_path + end +end diff --git a/test/controllers/admin/stylesheets_controller_test.rb b/test/controllers/admin/stylesheets_controller_test.rb new file mode 100644 index 000000000..9aaa276e4 --- /dev/null +++ b/test/controllers/admin/stylesheets_controller_test.rb @@ -0,0 +1,24 @@ +require "test_helper" + +class Admin::StylesheetsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should show stylesheet" do + get admin_stylesheet_url + + assert_response :success + end + + test "should create stylesheet" do + # Tant qu'il manque un phantomjs de test + assert_raises NoMethodError do + post admin_stylesheet_url, params: { + url: "https://linuxfr.org/test" + } + end + end +end diff --git a/test/controllers/boards_controller_test.rb b/test/controllers/boards_controller_test.rb new file mode 100644 index 000000000..7e56f9c85 --- /dev/null +++ b/test/controllers/boards_controller_test.rb @@ -0,0 +1,37 @@ +require "test_helper" + +class BoardsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should show" do + get board_url(Board.free, format: :html) + + assert_response :success + end + + test "should create" do + sign_in accounts "maintainer_0" + + post board_url, params: { + board: { + object_type: "Free", + message: "Hello" + } + } + + assert_response :redirect + end + + test "should create with js" do + sign_in accounts "maintainer_0" + + post board_url, params: { + board: { + object_type: "Free", + message: "Hello" + } + }, xhr: true + + assert_response :success + end +end diff --git a/test/controllers/bookmarks_controller_test.rb b/test/controllers/bookmarks_controller_test.rb new file mode 100644 index 000000000..51f6dcea1 --- /dev/null +++ b/test/controllers/bookmarks_controller_test.rb @@ -0,0 +1,115 @@ +require "test_helper" + +class BookmarksControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should list bookmarks" do + get bookmarks_url + + assert_response :success + end + + test "should show bookmark" do + sign_in accounts "admin_0" + get user_bookmark_url(users("visitor_0"), bookmarks(:one), format: :html) + + assert_response :success + assert_nil flash[:alert] + end + + test "should not find bookmark" do + get user_bookmark_url(users("visitor_1"), bookmarks(:one), format: :html) + + assert_redirected_to user_bookmark_url(users("visitor_0"), Bookmark.last) + end + + test "should get new" do + sign_in accounts "visitor_0" + get new_bookmark_url + + assert_response :success + end + + test "should preview bookmark" do + sign_in accounts "visitor_0" + assert_no_difference("Bookmark.count") do + post bookmarks_url, + params: { + bookmark: { + title: "Hello world", + link: "http://example.com" + }, + tags: "foo, bar", + commit: "Prévisualiser" + } + end + assert_response :success + end + + test "should create bookmark" do + sign_in accounts "visitor_0" + assert_difference("Bookmark.count") do + post bookmarks_url, + params: { + bookmark: { + title: "Hello world", + link: "http://example.com", + lang: "fr" + }, + tags: "foo, bar" + } + end + assert_redirected_to user_bookmark_url(users("visitor_0"), Bookmark.last) + end + + test "should get edit" do + sign_in accounts "admin_0" + get edit_user_bookmark_url(users("visitor_0"), bookmarks(:one)) + + assert_response :success + end + + test "should preview update" do + sign_in accounts "admin_0" + patch user_bookmark_url(users("visitor_0"), bookmarks(:one)), + params: { + bookmark: { + link: "http://example.com" + }, + commit: "Prévisualiser" + } + + assert_response :success + end + + test "should update bookmark" do + sign_in accounts "admin_0" + patch user_bookmark_url(users("visitor_0"), bookmarks(:one)), + params: { + bookmark: { + link: "http://example.com" + } + } + + assert_redirected_to user_bookmark_url(users("visitor_0"), bookmarks(:one)) + end + + test "should not update bookmark" do + sign_in accounts "admin_0" + patch user_bookmark_url(users("visitor_0"), bookmarks(:one)), + params: { + bookmark: { + title: "" + } + } + + assert_response :success + end + + test "should destroy bookmark" do + sign_in accounts "admin_0" + delete user_bookmark_url(users("visitor_0"), bookmarks(:one)) + + assert_redirected_to bookmarks_url + end +end diff --git a/test/controllers/comments_controller_test.rb b/test/controllers/comments_controller_test.rb new file mode 100644 index 000000000..037983dda --- /dev/null +++ b/test/controllers/comments_controller_test.rb @@ -0,0 +1,136 @@ +require "test_helper" + +class CommentsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "visitor_1" + end + + test "should list comments" do + get node_comments_url(nodes(:tracker_one)) + + assert_response :success + end + + test "should show comment" do + get node_comment_url(nodes(:tracker_one), comments(:one)) + + assert_response :success + end + + test "should get new" do + get new_node_comment_url(comments(:one).node, comments(:one)) + + assert_response :success + end + + test "should not get new" do + get new_node_comment_url(comments(:old).node, comments(:old)) + + assert_redirected_to user_diary_url diaries(:old).user, diaries(:old) + + # Blocked account + sign_in accounts "visitor_666" + accounts("visitor_666").block 1, accounts("admin_0").user.id + + get new_node_comment_url(comments(:one).node, comments(:one)) + + assert_redirected_to tracker_url trackers(:one).cached_slug + end + + test "should start answer" do + get answer_node_comment_url(comments(:one).node, comments(:one)) + + assert_response :success + end + + test "should preview comment" do + assert_no_difference "Comment.count" do + post node_comments_url(comments(:one).node), params: { + comment: { + node_id: comments(:one).node.id, + title: "Hello world", + wiki_body: "This is a comment" + }, + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + end + assert_response :success + end + + test "should create comment" do + assert_difference "Comment.count" do + post node_comments_url(comments(:one).node), params: { + comment: { + node_id: comments(:one).node.id, + title: "Hello world", + wiki_body: "This is a comment" + } + } + + assert flash[:notice] + end + assert_redirected_to tracker_url(trackers(:one).cached_slug) + "#comment-#{Comment.last.id}" + end + + test "should not edit old comment" do + sign_in accounts "visitor_10" + + get edit_node_comment_url(comments(:old).node, comments(:old)) + + assert_response :forbidden + end + + test "should edit comment" do + sign_in accounts "admin_0" + + get edit_node_comment_url(comments(:one).node, comments(:one)) + + assert_response :success + end + + test "should preview update comment" do + # skip 'trouble with wikification' + sign_in accounts "admin_0" + + patch node_comment_url(comments(:one).node, comments(:one)), params: { + comment: { title: "Updated comment" }, + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + assert_response :success + end + + test "should update comment" do + # skip 'trouble with wikification' + sign_in accounts "admin_0" + + patch node_comment_url(comments(:one).node, comments(:one)), params: { + comment: { title: "Updated comment" } + } + + assert_nil flash[:alert] + assert_redirected_to tracker_url(trackers(:one).cached_slug) + "#comment-#{comments(:one).id}" + end + + test "should destroy comment" do + sign_in accounts "admin_0" + + assert_difference "Comment.published.count", -1 do + delete node_comment_url(comments(:one).node, comments(:one)) + + assert flash[:notice] + end + assert_redirected_to tracker_url(trackers(:one).cached_slug) + end + + test "should redirect for templeet" do + get "/comments/#{comments(:one).id}" + + assert_redirected_to node_comment_url(comments(:one).node, comments(:one)) + end +end diff --git a/test/controllers/dashboard_controller_test.rb b/test/controllers/dashboard_controller_test.rb new file mode 100644 index 000000000..358180c26 --- /dev/null +++ b/test/controllers/dashboard_controller_test.rb @@ -0,0 +1,21 @@ +require "test_helper" + +class DashboardControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "maintainer_0" + end + + test "should get index" do + get dashboard_url + + assert_response :success + end + + test "should get answers" do + get tableau_de_bord_reponses_url + + assert_response :success + end +end diff --git a/test/controllers/diaries_controller_test.rb b/test/controllers/diaries_controller_test.rb new file mode 100644 index 000000000..199f5ec58 --- /dev/null +++ b/test/controllers/diaries_controller_test.rb @@ -0,0 +1,134 @@ +require "test_helper" + +class DiariesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "get index" do + get diaries_url + + assert_response :success + end + + test "can not show" do + get user_diary_url users("visitor_0"), diaries(:lorem_cc_licensed) + + assert_redirected_to user_diary_url users("visitor_2"), diaries(:lorem_cc_licensed) + end + + test "get show" do + get user_diary_url(users("visitor_1"), diaries(:lorem_cc_licensed), format: :html) + + assert_response :success + end + + test "can not get new" do + sign_in accounts "visitor_zero_karma" + get new_diary_url + + assert_response :forbidden + end + + test "get new" do + get new_diary_url + + assert_response :success + end + + test "preview diary" do + assert_no_difference "Diary.count" do + post diaries_url, params: { + diary: { title: "Hello world" }, + tags: "foo, bar", + commit: "Prévisualiser" + } + end + assert_response :success + end + + test "create diary" do + assert_difference "Diary.count" do + post diaries_url, params: { + diary: { + title: "Hello world", + wiki_body: "et le reste" + }, tags: "foo, bar" + } + + assert flash[:notice] + end + assert_redirected_to user_diary_url(users("moderator_0"), Diary.last) + end + + test "get edit" do + get edit_user_diary_url users("visitor_1").id, diaries(:lorem_cc_licensed).id + + assert_response :success + end + + test "preview update diary" do + patch user_diary_url(users("visitor_1"), diaries(:lorem_cc_licensed)), params: { + diary: { title: "Nouveau titre" }, + commit: "Prévisualiser" + } + + assert_response :success + end + + test "update diary" do + patch user_diary_url(users("visitor_1"), diaries(:lorem_cc_licensed)), params: { + diary: { title: "Nouveau titre" } + } + + assert flash[:notice] + assert_redirected_to user_diary_url(users("visitor_1"), "nouveau-titre") + end + + test "destroy diary" do + assert_difference "Diary.all.find_all { |d| d.visible? }.count", -1 do + delete user_diary_url(users("visitor_2"), diaries(:lorem_cc_licensed)) + + assert flash[:notice] + end + assert_redirected_to diaries_url + end + + test "do not convert diary" do + sign_in accounts "visitor_1" + post convert_user_diary_url(users("visitor_1"), diaries(:one)) + + assert flash[:alert] + assert_response :success + end + + test "convert diary as admin" do + post convert_user_diary_url(users("visitor_1"), diaries(:one)) + + assert_nil flash[:alert] + assert_redirected_to redaction_news_url diaries(:one) + end + + test "do not move diary" do + sign_in accounts "visitor_1" + post move_user_diary_url users("visitor_1"), diaries(:one), params: { + post: { forum_id: forums(:one).id } + } + + assert_response :success + end + + test "move diary" do + assert_difference "Diary.all.find_all { |d| d.visible? }.count", -1 do + assert_difference "Post.count" do + post move_user_diary_url users("visitor_1"), diaries(:one), params: { + post: { forum_id: forums(:one).id } + } + end + end + + assert_redirected_to diaries_url + end +end diff --git a/test/controllers/forums_controller_test.rb b/test/controllers/forums_controller_test.rb new file mode 100644 index 000000000..f8ebbbf81 --- /dev/null +++ b/test/controllers/forums_controller_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +class ForumsControllerTest < ActionDispatch::IntegrationTest + test "get index" do + get forums_url + + assert_response :success + end + + test "get show" do + get forum_url(forums(:one), format: :html) + + assert_response :success + assert_nil flash[:alert] + end +end diff --git a/test/controllers/home_controller_test.rb b/test/controllers/home_controller_test.rb new file mode 100644 index 000000000..6653345cf --- /dev/null +++ b/test/controllers/home_controller_test.rb @@ -0,0 +1,23 @@ +require "test_helper" + +class HomeControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should get index" do + get root_url + + assert_response :success + + assert_select "title", "Accueil - LinuxFr.org" + + post destroy_account_session_url + end + + test "should not login" do + sign_in accounts :anonymous + get trackers_url + + assert flash[:alert] + assert_redirected_to account_session_url + end +end diff --git a/test/controllers/links_controller_test.rb b/test/controllers/links_controller_test.rb new file mode 100644 index 000000000..8765c936a --- /dev/null +++ b/test/controllers/links_controller_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class LinksControllerTest < ActionDispatch::IntegrationTest + test "should show link" do + links(:one).save_url_in_redis + + get "/redirect/#{links(:one).id}" + + assert_redirected_to links(:one).url + end +end diff --git a/test/controllers/moderation/block_controller_test.rb b/test/controllers/moderation/block_controller_test.rb new file mode 100644 index 000000000..02b457837 --- /dev/null +++ b/test/controllers/moderation/block_controller_test.rb @@ -0,0 +1,30 @@ +require "test_helper" + +class Moderation::BlockControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should block account" do + post moderation_block_index_url, params: { + account_id: accounts("visitor_0").id + } + + assert_nil flash[:alert] + assert_predicate accounts("visitor_0"), :blocked? + assert_response :success + end + + test "should unblock account" do + post moderation_block_index_url, params: { + account_id: accounts("visitor_0").id, + nb_days: 0 + } + + assert_nil flash[:alert] + assert_not accounts("visitor_0").blocked? + assert_response :success + end +end diff --git a/test/controllers/moderation/images_controller_test.rb b/test/controllers/moderation/images_controller_test.rb new file mode 100644 index 000000000..cc2750e59 --- /dev/null +++ b/test/controllers/moderation/images_controller_test.rb @@ -0,0 +1,22 @@ +require "test_helper" + +class Moderation::ImagesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should list images" do + get moderation_images_url + + assert_response :success + end + + test "should destroy image" do + # Plutôt inutile, mais permet de passer à travers le code malgré tout + delete moderation_image_url 0 + + assert_redirected_to moderation_images_url + end +end diff --git a/test/controllers/moderation/news_controller_test.rb b/test/controllers/moderation/news_controller_test.rb new file mode 100644 index 000000000..f586f0d2e --- /dev/null +++ b/test/controllers/moderation/news_controller_test.rb @@ -0,0 +1,137 @@ +require "test_helper" + +class Moderation::NewsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "admin_0" + end + + test "should list news" do + get moderation_news_index_url + + assert_response :success + end + + test "should show news" do + get moderation_news_url news(:draft) + + assert_response :success + end + + test "should get edit page" do + get edit_moderation_news_url news(:draft) + + assert_response :success + end + + test "should update news" do + patch moderation_news_url news(:draft), params: { news: { wiki_body: "Hello world" } } + + assert flash[:notice] + assert_redirected_to news_url news(:draft) + end + + test "should update news as xhr" do + patch moderation_news_url(news(:draft)), params: { news: { wiki_body: "Hello world" } }, xhr: true + + assert_response :success + end + + test "should not accept locked news" do + news(:candidate).lock_by users("visitor_0") + post accept_moderation_news_url news(:candidate) + + assert flash[:alert] + + assert_redirected_to moderation_news_url news(:candidate) + news(:candidate).unlock + end + + test "should not accept empty news" do + news(:first_part_only).paragraphs << Paragraph.new(wiki_body: News::DEFAULT_PARAGRAPH) + post accept_moderation_news_url news(:first_part_only) + + assert flash[:alert] + assert_redirected_to moderation_news_url news(:first_part_only) + end + + test "should accept news" do + assert_difference "News.candidate.count", -1 do + post accept_moderation_news_url news(:candidate) + + assert flash[:alert] + end + assert_redirected_to news_url news(:candidate) + end + + test "should not refuse news" do + assert_no_difference "News.refused.count" do + post refuse_moderation_news_url news(:candidate) + end + assert_response :success + end + + test "should not refuse locked news" do + news(:candidate).lock_by users("visitor_0") + assert_no_difference "News.refused.count" do + post refuse_moderation_news_url news(:candidate) + + assert flash[:alert] + end + + assert_redirected_to moderation_news_url news(:candidate) + news(:candidate).unlock + end + + test "should refuse news" do + assert_difference "News.refused.count" do + post refuse_moderation_news_url news(:candidate), params: { message: "so sorry" } + end + assert_redirected_to root_url + end + + test "should not rewrite locked news" do + news(:candidate).lock_by users("visitor_0") + assert_no_difference "News.candidate.count" do + post rewrite_moderation_news_url news(:candidate) + + assert flash[:alert] + end + + assert_redirected_to moderation_news_url news(:candidate) + news(:candidate).unlock + end + + test "should rewrite news" do + assert_difference "News.candidate.count", -1 do + post rewrite_moderation_news_url news(:candidate) + + assert flash[:alert] + end + assert_redirected_to news_url news(:candidate) + end + + test "should reset news" do + post reset_moderation_news_url news(:candidate) + + assert flash[:notice] + assert_redirected_to moderation_news_url news(:candidate) + end + + test "should ppp news" do + post ppp_moderation_news_url news(:news) + + assert flash[:notice] + assert_redirected_to moderation_news_url news(:news) + + # Reset + Redis.new.del("nodes/ppp") + end + + test "should get vote" do + get vote_moderation_news_url news(:news) + + assert_response :success + end +end diff --git a/test/controllers/moderation/plonk_controller_test.rb b/test/controllers/moderation/plonk_controller_test.rb new file mode 100644 index 000000000..7d91b0687 --- /dev/null +++ b/test/controllers/moderation/plonk_controller_test.rb @@ -0,0 +1,30 @@ +require "test_helper" + +class Moderation::PlonkControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should plonk account" do + post moderation_plonk_index_url, params: { + account_id: accounts("visitor_0").id + } + + assert_nil flash[:alert] + assert_predicate accounts("visitor_0"), :plonked? + assert_response :success + end + + test "should unplonk account" do + post moderation_plonk_index_url, params: { + account_id: accounts("visitor_0").id, + nb_days: 0 + } + + assert_nil flash[:alert] + assert_not accounts("visitor_0").plonked? + assert_response :success + end +end diff --git a/test/controllers/moderation/polls_controller_test.rb b/test/controllers/moderation/polls_controller_test.rb new file mode 100644 index 000000000..1336d1d74 --- /dev/null +++ b/test/controllers/moderation/polls_controller_test.rb @@ -0,0 +1,83 @@ +require "test_helper" + +class Moderation::PollControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should list polls" do + get moderation_polls_url + + assert_response :success + end + + test "should show poll" do + comments("poll_2").parent_id = comments(:poll).id + comments("poll_2").generate_materialized_path + get moderation_poll_url(polls(:one)) + + assert_response :success + end + + test "should accept poll" do + # For information, there can only be one published poll! + assert_difference("Poll.draft.count", -1) do + post accept_moderation_poll_url(polls(:draft)) + + assert flash[:notice] + end + assert_redirected_to poll_url polls(:draft) + end + + test "should refuse poll" do + assert_difference("Poll.draft.count", -1) do + post refuse_moderation_poll_url(polls(:draft)) + + assert flash[:notice] + end + assert_redirected_to moderation_polls_url + end + + test "should get edit" do + get edit_moderation_poll_url(polls(:one)) + + assert_response :success + end + + test "should update poll" do + patch moderation_poll_url(polls(:one)), params: { + poll: { + title: "hello world my poll" + } + } + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to moderation_poll_url(polls(:one).reload) + end + + test "should not update poll" do + patch moderation_poll_url(polls(:one)), params: { + poll: { + title: "" + } + } + + assert flash[:alert] + assert_nil flash[:notice] + assert_response :success + end + + test "should set poll on ppp" do + post ppp_moderation_poll_url(polls(:one)) + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to root_url + + # Reset + Redis.new.del("nodes/ppp") + end +end diff --git a/test/controllers/moderation/tags_controller_test.rb b/test/controllers/moderation/tags_controller_test.rb new file mode 100644 index 000000000..b7be81307 --- /dev/null +++ b/test/controllers/moderation/tags_controller_test.rb @@ -0,0 +1,15 @@ +require "test_helper" + +class Moderation::TagsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should list tags" do + get moderation_tags_url + + assert_response :success + end +end diff --git a/test/controllers/moderation_controller_test.rb b/test/controllers/moderation_controller_test.rb new file mode 100644 index 000000000..e7a67e659 --- /dev/null +++ b/test/controllers/moderation_controller_test.rb @@ -0,0 +1,21 @@ +require "test_helper" + +class ModerationControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should not get index" do + sign_in accounts "visitor_0" + + get moderation_url + + assert_redirected_to account_session_url + end + + test "should get index" do + sign_in accounts "admin_0" + + get moderation_url + + assert_redirected_to moderation_news_index_url + end +end diff --git a/test/controllers/news_controller_test.rb b/test/controllers/news_controller_test.rb new file mode 100644 index 000000000..11ecc409f --- /dev/null +++ b/test/controllers/news_controller_test.rb @@ -0,0 +1,99 @@ +require "test_helper" + +class NewsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should list news" do + get news_index_url + + assert_response :success + end + + test "should get calendar" do + get "/2016/1/1" + + assert_response :success + end + + test "should show news" do + # For the fixtures configuration + news(:news).node = nodes(:news) + + get news_url(news(:news), format: :html) + + assert_response :success + assert_nil flash[:alert] + end + + test "should show news and mark as read" do + sign_in accounts "visitor_0" + + # For the fixtures configuration + news(:news).node = nodes(:news) + + get news_url(news(:news), format: :html) + + assert_response :success + assert_nil flash[:alert] + end + + test "should get new" do + get new_news_url + + assert_response :success + end + + test "should preview news" do + assert_no_difference("News.count") do + post news_index_url, + params: { + news: { + section_id: sections(:news).id, + title: "Hello world", + cached_slug: "hello-world", + author_name: "John Doe", + author_email: "johndoe@example.com", + wiki_body: "Partie première", + wiki_second_part: "Partie secondaire", + links_attributes: { + "0" => { + title: "Hello world", + link: "http://example.com" + } + } + }, + tags: "foo, bar", + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + end + assert_response :success + end + + test "should create news" do + assert_difference("News.count") do + post news_index_url, params: { + news: { + section_id: sections(:news).id, + title: "Hello world", + cached_slug: "hello-world", + author_name: "John Doe", + author_email: "johndoe@example.com", + wiki_body: "Partie première", + wiki_second_part: "Partie secondaire", + links_attributes: { + "0" => { + title: "Hello world", + link: "http://example.com" + } + } + }, + tags: "foo, bar" + } + + assert flash[:notice] + end + assert_redirected_to news_index_url + end +end diff --git a/test/controllers/polls_controller_test.rb b/test/controllers/polls_controller_test.rb new file mode 100644 index 000000000..a07ed24ae --- /dev/null +++ b/test/controllers/polls_controller_test.rb @@ -0,0 +1,93 @@ +require "test_helper" + +class PollsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should get index" do + get polls_url + + assert_response :success + end + + test "should get show" do + sign_in accounts "maintainer_0" + get poll_url polls(:one), format: :html + + assert_response :success + end + + test "should get new page" do + sign_in accounts "maintainer_0" + get new_poll_url + + assert_response :success + end + + test "should preview creation" do + sign_in accounts "maintainer_0" + assert_no_difference("Poll.count") do + post polls_url, params: { + poll: { + title: "Hello world", + wiki_explanations: "Partie première", + answers_attributes: { + "0" => { + answer: "Hello world" + } + } + }, + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + end + assert_response :success + end + + test "should create poll" do + sign_in accounts "maintainer_0" + + assert_difference("Poll.count") do + post polls_url, params: { + poll: { + title: "Hello world", + wiki_explanations: "Partie première", + answers_attributes: { + "0" => { + answer: "Hello world" + } + } + } + } + + assert flash[:notice] + end + assert_redirected_to polls_url + end + + test "should vote" do + # Remove eventual existing vote + Redis.new.del "polls/#{polls(:one).id}/127.0.0.1" + sign_in accounts :joe + + post vote_poll_url polls(:one), position: 0 + + assert_nil flash[:alert] + assert flash[:notice] + + assert_redirected_to poll_url polls(:one) + end + + test "should not vote" do + # Remove eventual existing vote + Redis.new.del "polls/#{polls(:one).id}/127.0.0.1" + sign_in accounts :joe + + post vote_poll_url polls(:one) + + assert flash[:alert] + assert_nil flash[:notice] + + assert_redirected_to poll_url polls(:one) + end +end diff --git a/test/controllers/posts_controller_test.rb b/test/controllers/posts_controller_test.rb new file mode 100644 index 000000000..2a70419a1 --- /dev/null +++ b/test/controllers/posts_controller_test.rb @@ -0,0 +1,126 @@ +require "test_helper" + +class PostsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should list posts" do + get forum_posts_url forums(:one) + + assert_redirected_to forum_url forums :one + end + + test "should show post" do + get forum_post_url(forums(:one), posts(:one)) + + assert_response :success + end + + test "should show post when logged in" do + sign_in accounts "visitor_0" + get forum_post_url(forums(:one), posts(:one)) + + assert_response :success + end + + test "should show post from another forum" do + get forum_post_url(forums(:two), posts(:one)) + + assert_redirected_to forum_post_url forums(:one), posts(:one) + end + + test "should get new page" do + sign_in accounts "maintainer_0" + get new_post_url forums(:one) + + assert_response :success + end + + test "should preview create" do + sign_in accounts "maintainer_0" + assert_no_difference "Post.count" do + post posts_url(forums(:one)), params: { + post: { + forum_id: forums(:one).id, + title: "Hello world", + body: "Hello world", + wiki_body: "Hello world" + }, + tags: "hello, world", + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + end + assert_response :success + end + + test "should create post" do + sign_in accounts "maintainer_0" + assert_difference "Post.count" do + post posts_url(forums(:one)), params: { + post: { + forum_id: forums(:one).id, + title: "Hello world", + body: "Hello world", + wiki_body: "Hello world" + }, + tags: "hello, world" + } + + assert flash[:notice] + end + assert_redirected_to forum_posts_url forums :one + end + + test "should get edit page" do + sign_in accounts "admin_0" + get edit_forum_post_url forums(:one), posts(:one) + + assert_response :success + end + + test "should preview update" do + sign_in accounts "admin_0" + assert_no_difference "Post.count" do + patch forum_post_url(forums(:one), posts(:one)), params: { + post: { + forum_id: forums(:one).id, + title: "Hello world", + body: "Hello world", + wiki_body: "Hello world" + }, + tags: "hello, world", + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + end + assert_response :success + end + + test "should update post" do + sign_in accounts "admin_0" + patch forum_post_url(forums(:one), posts(:one)), params: { + post: { + title: "Updated", + body: "Updated", + wiki_body: "Updated" + }, + tags: "updated" + } + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to forum_posts_url forums :one + end + + test "should destroy post" do + sign_in accounts "admin_0" + assert_difference("Post.all.find_all { |d| d.visible? }.count", -1) do + delete forum_post_url(forums(:one), posts(:one)) + + assert flash[:notice] + end + assert_redirected_to forum_posts_url forums :one + end +end diff --git a/test/controllers/readings_controller_test.rb b/test/controllers/readings_controller_test.rb new file mode 100644 index 000000000..b3466740d --- /dev/null +++ b/test/controllers/readings_controller_test.rb @@ -0,0 +1,26 @@ +require "test_helper" + +class ReadingsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should list readings" do + sign_in accounts "visitor_0" + get readings_url + + assert_response :success + end + + test "should destroy reading" do + sign_in accounts "visitor_0" + delete reading_url nodes(:one) + + assert_redirected_to user_diary_url users("visitor_1"), nodes(:one).content + end + + test "should destroy all readings" do + sign_in accounts "visitor_0" + delete readings_url + + assert_redirected_to readings_url + end +end diff --git a/test/controllers/redaction/links_controller_test.rb b/test/controllers/redaction/links_controller_test.rb new file mode 100644 index 000000000..5615bdb45 --- /dev/null +++ b/test/controllers/redaction/links_controller_test.rb @@ -0,0 +1,96 @@ +require "test_helper" + +class Admin::LinksControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + def setup + sign_in accounts "moderator_1" + end + + test "should not get new" do + sign_in accounts "visitor_0" + get new_redaction_news_link_url news(:news) + + assert_response :forbidden + end + + test "should get new" do + get new_redaction_news_link_url news(:news) + + assert_response :success + end + + test "should create link" do + assert_difference "Link.count" do + post redaction_links_url params: { + link: { + lang: "fr", + title: "LinuxFR", + url: "https://linuxfr.org" + }, + news_id: news(:news).id + } + end + assert_response :success + end + + test "should not create link" do + assert_no_difference "Link.count" do + post redaction_links_url params: { + link: { + lang: "fr", + url: "https://linuxfr.org" + }, + news_id: news(:news).id + } + end + assert_response :unprocessable_entity + end + + test "should get edit" do + get edit_redaction_link_url links(:one) + + assert_response :success + end + + test "should not get edit" do + get edit_redaction_link_url links(:one) + + sign_in accounts "moderator_0" + get edit_redaction_link_url links(:one) + + assert_response :forbidden + + post unlock_redaction_link_url links(:one) + end + + test "should update link" do + patch redaction_link_url links(:one), params: { + link: { + lang: "fr", + title: "LinuxFR", + url: "https://linuxfr.org" + } + } + + assert_response :success + end + + test "should not update link" do + patch redaction_link_url links(:one), params: { + link: { + lang: "fr", + title: "", + url: "https://linuxfr.org" + } + } + + assert_response :unprocessable_entity + end + + test "should unlock link" do + post unlock_redaction_link_url links(:one) + + assert_response :no_content + end +end diff --git a/test/controllers/redaction/news_controller_test.rb b/test/controllers/redaction/news_controller_test.rb new file mode 100644 index 000000000..0e6e1e5b9 --- /dev/null +++ b/test/controllers/redaction/news_controller_test.rb @@ -0,0 +1,144 @@ +require "test_helper" + +class Redaction::NewsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "visitor_0" + end + + test "should list news" do + get redaction_news_index_url + + assert_response :success + end + + test "should get moderation" do + get moderation_redaction_news_index_url format: :atom + + assert_response :success + end + + test "should show news" do + get redaction_news_url news(:draft) + + assert_response :success + end + + test "should create news" do + assert_difference("News.count") do + post redaction_news_index_url, params: { + news: { title: "Hello world" } + } + end + assert_redirected_to redaction_news_url News.last + end + + test "should get edit" do + get edit_redaction_news_url news(:draft) + + assert_response :success + end + + test "should update news" do + patch redaction_news_url(news(:draft)), params: { + news: { title: "Hello world" } + } + + assert_response :success + end + + test "should reassign news" do + sign_in accounts "admin_0" + post reassign_redaction_news_url news(:draft), params: { + user_id: users("visitor_1").id + } + + assert flash[:notice] + assert_redirected_to redaction_news_url news(:draft) + end + + test "should get reorganize news page" do + get reorganize_redaction_news_url news(:draft) + + assert_response :success + + sign_in accounts "visitor_1" + get reorganize_redaction_news_url news(:draft) + + assert_response :forbidden + end + + test "should reorganize news" do + put reorganized_redaction_news_url news(:draft), params: { + news: { title: "Hello world" } + } + + assert_redirected_to redaction_news_url news(:draft).reload + end + + test "should not reorganize news" do + put reorganized_redaction_news_url news(:draft), params: { + news: { title: "" } + } + + assert_response :success + end + + test "should get revision" do + sign_in accounts "admin_0" + # This is required to generate a version numbered '1' + put reorganized_redaction_news_url news(:draft), params: { + news: { title: "Hello world" } + } + get revision_redaction_news_url news(:draft).id, 1 + + assert_response :success + end + + test "should followup news" do + sign_in accounts "admin_0" + post followup_redaction_news_url news(:draft), params: { message: "Hello world" } + + assert_redirected_to redaction_news_url news(:draft).reload + end + + test "should submit news" do + # Required to unlock the draft + put reorganized_redaction_news_url news(:draft), params: { news: { title: "Hello world" } } + + post submit_redaction_news_url news(:draft).id + + assert_redirected_to redaction_url + end + + test "should not submit news" do + # To lock the news + get reorganize_redaction_news_url news(:draft) + + post submit_redaction_news_url news(:draft).id + + assert flash[:alert] + assert_redirected_to redaction_news_url news(:draft) + end + + test "should erase news" do + sign_in accounts "admin_0" + assert_difference("News.draft.count", -1) do + post erase_redaction_news_url news(:draft) + end + assert_redirected_to redaction_url + end + + test "should mark news as urgent" do + post urgent_redaction_news_url news(:draft) + + assert_redirected_to redaction_news_url news(:draft) + end + + test "should cancel news as urgent" do + post cancel_urgent_redaction_news_url news(:draft) + + assert_redirected_to redaction_news_url news(:draft) + end +end diff --git a/test/controllers/redaction/paragraphs_controller_test.rb b/test/controllers/redaction/paragraphs_controller_test.rb new file mode 100644 index 000000000..44c03b1d7 --- /dev/null +++ b/test/controllers/redaction/paragraphs_controller_test.rb @@ -0,0 +1,55 @@ +require "test_helper" + +class Moderation::ParagraphsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "moderator_0" + end + + test "should create paragraphs" do + assert_difference "news(:news).paragraphs.in_second_part.count" do + post redaction_news_paragraphs_url news(:news) + end + + assert_response :created + end + + test "should create in first part" do + assert_difference "news(:first_part_only).paragraphs.in_first_part.count" do + post redaction_news_paragraphs_url news(:first_part_only) + end + + assert_response :created + end + + test "should show paragraph" do + get redaction_paragraph_url paragraphs(:one) + + assert_response :success + end + + test "should edit paragraph" do + get edit_redaction_paragraph_url paragraphs(:one) + + assert_response :success + + sign_in accounts "moderator_1" + get edit_redaction_paragraph_url paragraphs(:one) + + assert_response :forbidden + end + + test "should update paragraph" do + patch redaction_paragraph_url paragraphs(:one), params: { paragraph: { wiki_body: "New body" } } + + assert_equal "New body", paragraphs(:one).reload.wiki_body + assert_response :success + end + + test "should unlock paragraph" do + post unlock_redaction_paragraph_url paragraphs(:one) + + assert_response :no_content + end +end diff --git a/test/controllers/redaction_controller_test.rb b/test/controllers/redaction_controller_test.rb new file mode 100644 index 000000000..69ffd3224 --- /dev/null +++ b/test/controllers/redaction_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +class RedactionControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get redaction_url + + assert_response :success + end +end diff --git a/test/controllers/relevances_controller_test.rb b/test/controllers/relevances_controller_test.rb new file mode 100644 index 000000000..ca711226f --- /dev/null +++ b/test/controllers/relevances_controller_test.rb @@ -0,0 +1,55 @@ +require "test_helper" + +class RelevancesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should vote for" do + sign_in accounts "visitor_0" + Redis.new.del "comments/#{comments(:one).id}/votes/for", accounts("visitor_0").id + + assert_difference "comments(:one).nb_votes_for" do + post relevance_for_node_comment_url nodes(:tracker_one), comments(:one), format: :json + + assert_nil flash[:alert] + end + + assert_response :success + end + + test "should vote against" do + sign_in accounts "visitor_2" + Redis.new.del "comments/#{comments(:one).id}/votes/against", accounts("visitor_2").id + + assert_difference "comments(:one).nb_votes_against" do + post relevance_against_node_comment_url nodes(:tracker_one), comments(:one), format: :json + + assert_nil flash[:alert] + end + + assert_response :success + end + + test "should not vote for" do + sign_in accounts "visitor_1" + + assert_no_difference "comments(:one).nb_votes_for" do + post relevance_for_node_comment_url nodes(:tracker_one), comments(:one), format: :json + + assert_nil flash[:alert] + end + + assert_response :success + end + + test "should not vote against" do + sign_in accounts "visitor_1" + + assert_no_difference "comments(:one).nb_votes_against" do + post relevance_against_node_comment_url nodes(:tracker_one), comments(:one), format: :json + + assert_nil flash[:alert] + end + + assert_response :success + end +end diff --git a/test/controllers/search_controller_test.rb b/test/controllers/search_controller_test.rb new file mode 100644 index 000000000..9c876e366 --- /dev/null +++ b/test/controllers/search_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +class SearchControllerTest < ActionDispatch::IntegrationTest + test "should search" do + get search_url + + assert_redirected_to "https://duckduckgo.com/?+site%3Alinuxfr.org" + end +end diff --git a/test/controllers/sections_controller_test.rb b/test/controllers/sections_controller_test.rb new file mode 100644 index 000000000..d2f46d4db --- /dev/null +++ b/test/controllers/sections_controller_test.rb @@ -0,0 +1,15 @@ +require "test_helper" + +class SectionsControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get sections_url + + assert_response :success + end + + test "should show section" do + get section_url sections :default + + assert_response :success + end +end diff --git a/test/controllers/static_controller_test.rb b/test/controllers/static_controller_test.rb new file mode 100644 index 000000000..0e6b777a7 --- /dev/null +++ b/test/controllers/static_controller_test.rb @@ -0,0 +1,42 @@ +require "test_helper" + +class StaticControllerTest < ActionDispatch::IntegrationTest + test "should get home page" do + get static_url pages(:one) + + assert_response :success + end + + test "should get equipe page" do + pages(:equipe).body = File.read("db/pages/equipe.html") + pages(:equipe).save! + + get static_url pages(:equipe) + + assert_response :success + end + + test "should get sites amis" do + pages(:amis).body = File.read("db/pages/sites-amis.html") + pages(:amis).save! + + get static_url pages(:amis) + + assert_response :success + end + + test "should get règles de modération" do + pages(:moderation).body = File.read("db/pages/regles_de_moderation.html") + pages(:moderation).save! + + get static_url pages(:moderation) + + assert_response :success + end + + test "get changelog" do + get changelog_url pages(:one) + + assert_response :success + end +end diff --git a/test/controllers/statistics_controller_test.rb b/test/controllers/statistics_controller_test.rb new file mode 100644 index 000000000..812042d43 --- /dev/null +++ b/test/controllers/statistics_controller_test.rb @@ -0,0 +1,77 @@ +require "test_helper" + +class StatisticsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should get tracker" do + get statistiques_tracker_url + + assert_response :success + end + + test "should get prizes" do + get statistiques_prizes_url + + assert_response :success + end + + test "should get users" do + get statistiques_users_url + + assert_response :success + end + + test "should get anonymous" do + get statistiques_anonymous_url + + assert_response :success + end + + test "should get collective" do + get statistiques_collective_url + + assert_response :success + end + + test "should get top" do + get statistiques_top_url + + assert_response :success + end + + test "should get moderation" do + get statistiques_moderation_url + + assert_response :success + end + + test "should get redaction" do + get statistiques_redaction_url + + assert_response :success + end + + test "should get contents" do + get statistiques_contents_url + + assert_response :success + end + + test "should get comments" do + get statistiques_comments_url + + assert_response :success + end + + test "should get tags" do + get statistiques_tags_url + + assert_response :success + end + + test "should get applications" do + get statistiques_applications_url + + assert_response :success + end +end diff --git a/test/controllers/stylesheets_controller_test.rb b/test/controllers/stylesheets_controller_test.rb new file mode 100644 index 000000000..144308d8f --- /dev/null +++ b/test/controllers/stylesheets_controller_test.rb @@ -0,0 +1,77 @@ +require "test_helper" + +class StylesheetsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "visitor_0" + end + + test "should create stylesheet" do + post stylesheet_url, params: { + uploaded_stylesheet: fixture_file_upload("blue-smooth.scss", "text/css") + } + + assert flash[:notice] + + assert_redirected_to edit_stylesheet_url + end + + test "should not create stylesheet" do + # Pour rendre l'utilisateur invalide et bloquer son enregistrement + accounts("visitor_666").email = "" + sign_in accounts "visitor_666" + + post stylesheet_url, params: { + uploaded_stylesheet: fixture_file_upload("blue-smooth.scss") + } + + assert flash[:alert] + + assert_redirected_to edit_stylesheet_url + end + + test "should get edit" do + get edit_stylesheet_url + + assert_response :success + end + + test "should not update stylesheet" do + # Pour rendre l'utilisateur invalide et bloquer son enregistrement + accounts("visitor_666").email = "" + sign_in accounts "visitor_666" + + patch stylesheet_url, params: { + uploaded_stylesheet: fixture_file_upload("blue-smooth.scss") + } + + assert flash[:alert] + assert_redirected_to edit_stylesheet_url + end + + test "should update stylesheet to default" do + patch stylesheet_url, params: { + css_session: "current" + } + + assert flash[:notice] + assert_redirected_to edit_stylesheet_url + end + + test "should update stylesheet" do + patch stylesheet_url, params: { + stylesheet: "contrib/blue-smooth" + } + + assert flash[:notice] + assert_redirected_to edit_stylesheet_url + end + + test "should destroy stylesheet" do + delete stylesheet_url + + assert flash[:notice] + assert_redirected_to edit_stylesheet_url + end +end diff --git a/test/controllers/tags_controller_test.rb b/test/controllers/tags_controller_test.rb new file mode 100644 index 000000000..92a805e1a --- /dev/null +++ b/test/controllers/tags_controller_test.rb @@ -0,0 +1,98 @@ +require "test_helper" + +class TagsControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + setup do + sign_in accounts "visitor_0" + end + + test "should list tags" do + get tags_url + + assert_response :success + end + + test "should show tag" do + get tag_url tags(:one) + + assert_response :success + end + + test "should get edit page" do + get new_node_tag_url nodes(:one), tags(:one) + + assert_response :success + end + + test "should update tag" do + patch node_tag_url(nodes(:one), tags(:one).name) + + assert_nil flash[:alert] + assert_redirected_to user_diary_url(users("visitor_1"), diaries(:one)) + end + + test "should create tag" do + assert_difference "Tag.visible.count" do + post node_tags_url(nodes(:one)), params: { + tags: "Hello" + } + + assert_nil flash[:alert] + end + + assert_redirected_to user_diary_url(users("visitor_1"), diaries(:one)) + end + + test "should create tag, xhr" do + assert_difference "Tag.visible.count" do + post node_tags_url(nodes(:one)), params: { + tags: "Hello" + }, xhr: true + + assert_nil flash[:alert] + end + + assert_response :success + end + + test "should autocomplete tag" do + get autocomplete_tags_url, params: { + q: "Hello" + } + + assert_response :success + end + + test "should get public page" do + get public_tag_url tags(:one) + + assert_response :success + end + + test "should hide tag" do + sign_in accounts "admin_0" + post hide_tag_url tags(:one) + + assert_nil flash[:alert] + assert flash[:notice] + assert_redirected_to root_url + end + + test "should not hide tag" do + post hide_tag_url tags(:one) + + assert_nil flash[:alert] + assert_nil flash[:notice] + assert_redirected_to root_url + end + + test "should destroy tag" do + assert_difference "Tagging.count", -1 do + delete node_tag_url(nodes(:one), tags(:one).name) + + assert_nil flash[:alert] + end + assert_redirected_to user_diary_url(users("visitor_1"), diaries(:one)) + end +end diff --git a/test/controllers/trackers_controller_test.rb b/test/controllers/trackers_controller_test.rb new file mode 100644 index 000000000..c762de659 --- /dev/null +++ b/test/controllers/trackers_controller_test.rb @@ -0,0 +1,134 @@ +require "test_helper" + +class TrackersControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + def setup + sign_in accounts "admin_0" + end + + test "should get index" do + get trackers_url + + assert_response :success + end + + test "should get sorted index" do + get trackers_url, params: { + tracker: { assigned_to_user_id: users("visitor_0").id }, + order: "score" + } + + assert_response :success + end + + test "should get sorted index for user 0" do + get trackers_url, params: { + tracker: { assigned_to_user_id: 0 }, + order: "score" + } + + assert_response :success + end + + test "should get new" do + get new_tracker_url + + assert_response :success + end + + test "should preview creation" do + assert_no_difference("Tracker.count") do + post trackers_url, params: { + tracker: { title: "hello world my tracker" }, + commit: "Prévisualiser" + } + end + + assert_response :success + end + + test "should create tracker" do + assert_difference("Tracker.count") do + post trackers_url, params: { + tracker: { + title: "hello world my tracker", + wiki_body: "hello world", + category_id: categories(:one).id + } + } + + assert flash[:notice] + end + follow_redirect! + + assert_select "a", "hello world my tracker" + end + + test "should create tracker with simple user" do + sign_in accounts "visitor_0" + assert_difference("Tracker.count") do + post trackers_url, params: { + tracker: { + title: "hello world my tracker", + wiki_body: "hello world", + category_id: categories(:one).id + } + } + + assert flash[:notice] + end + follow_redirect! + + assert_select "a", "hello world my tracker" + end + + test "should show tracker" do + get trackers_url(trackers(:one), format: :html) + + assert_response :success + end + + test "should get edit" do + get edit_tracker_url(trackers(:one)) + + assert_response :success + end + + test "should preview update" do + patch tracker_url(trackers(:one)), params: { + tracker: { title: "new title" }, + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + assert_response :success + end + + test "should update tracker" do + patch tracker_url(trackers(:two)), params: { + tracker: { title: "new title" } + } + + assert flash[:notice] + + follow_redirect! + + assert_select "a", "new title" + end + + test "should list comments" do + get comments_trackers_url format: :atom + + assert_response :success + end + + test "should destroy tracker" do + # Deleting a tracker ends up as an invisible node + assert_difference("Node.visible.count", -1) do + delete tracker_url(trackers(:one)) + end + + assert_redirected_to trackers_path + end +end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 000000000..23a1cf6cf --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,51 @@ +require "#{File.dirname(__FILE__)}/../test_helper" + +class UsersControllerTest < ActionDispatch::IntegrationTest + test "should consult user" do + get user_url(users(:community)) + + assert_response :success + end + + test "should consult news" do + get news_user_url(users(:community)) + + assert_response :success + end + + test "should consult journaux" do + get journaux_user_url(users(:community)) + + assert_response :success + end + + test "should consult liens" do + get liens_user_url(users(:community)) + + assert_response :success + end + + test "should consult posts" do + get posts_user_url(users(:community)) + + assert_response :success + end + + test "should consult suivi" do + get suivi_user_url(users(:community)) + + assert_response :success + end + + test "should consult wiki" do + get wiki_user_url(users(:community)) + + assert_response :success + end + + test "should consult comments" do + get comments_user_url(users(:community)) + + assert_response :success + end +end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb new file mode 100644 index 000000000..0dc77ef81 --- /dev/null +++ b/test/controllers/votes_controller_test.rb @@ -0,0 +1,52 @@ +require "test_helper" + +class VotesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should vote for" do + sign_in accounts "admin_0" + + Redis.new.del "nodes/#{nodes(:one).id}/votes/#{accounts('admin_0').id}" + assert_difference "nodes(:one).score" do + post vote_for_node_url nodes(:one) + + assert_nil flash[:alert] + nodes(:one).reload + end + assert_redirected_to user_diary_url users("visitor_1"), nodes(:one).content + end + + test "should not be allowed to vote for" do + sign_in accounts "visitor_0" + assert_no_difference "nodes(:one).score" do + post vote_for_node_url nodes(:one) + + assert_nil flash[:alert] + end + assert_redirected_to user_diary_url users("visitor_1"), nodes(:one).content + end + + test "should vote against" do + sign_in accounts "admin_0" + + Redis.new.del "nodes/#{nodes(:one).id}/votes/#{accounts('admin_0').id}" + assert_difference "nodes(:one).score", -1 do + post vote_against_node_url nodes(:one) + + assert_nil flash[:alert] + nodes(:one).reload + end + assert_redirected_to user_diary_url users("visitor_1"), nodes(:one).content + end + + test "should not be allowed to vote against" do + sign_in accounts "visitor_0" + + assert_no_difference "nodes(:one).score", -1 do + post vote_against_node_url nodes(:one) + + assert_nil flash[:alert] + end + assert_redirected_to user_diary_url users("visitor_1"), nodes(:one).content + end +end diff --git a/test/controllers/wiki_pages_controller_test.rb b/test/controllers/wiki_pages_controller_test.rb new file mode 100644 index 000000000..2166e82af --- /dev/null +++ b/test/controllers/wiki_pages_controller_test.rb @@ -0,0 +1,138 @@ +require "test_helper" + +class WikiPagesControllerTest < ActionDispatch::IntegrationTest + include Devise::Test::IntegrationHelpers + + test "should list wiki pages" do + get wiki_pages_url format: :atom + + assert_response :success + end + + test "should show wiki page" do + get wiki_page_url wiki_pages(:one) + + assert_response :success + end + + test "should not show wiki page" do + get wiki_page_url "none" + + assert_response :success + end + + test "should not show wiki page for signed in user" do + sign_in accounts "editor_0" + + get wiki_page_url "none" + + assert_redirected_to new_wiki_page_url title: "none" + end + + test "should get new" do + sign_in accounts "editor_0" + + get new_wiki_page_url + + assert_response :success + end + + test "should preview wiki page" do + sign_in accounts "editor_0" + + assert_no_difference("WikiPage.count") do + post wiki_pages_url, params: { + wiki_page: { title: "Test" }, + commit: "Prévisualiser" + } + end + assert_response :success + end + + test "should create wiki page" do + sign_in accounts "editor_0" + + assert_difference("WikiPage.count") do + post wiki_pages_url, params: { + wiki_page: { + title: "Test", + wiki_body: "Test" + } + } + + assert flash[:notice] + end + assert_redirected_to wiki_page_url(WikiPage.last) + end + + test "should get edit" do + sign_in accounts "editor_0" + + get edit_wiki_page_url wiki_pages(:one) + + assert_response :success + end + + test "should preview update" do + sign_in accounts "editor_0" + + patch wiki_page_url(wiki_pages(:one)), params: { + wiki_page: { + title: "Test", + wiki_body: "Test" + }, + commit: "Prévisualiser" + } + + assert_nil flash[:alert] + assert_nil flash[:notice] + assert_response :success + end + + test "should update wiki page" do + sign_in accounts "editor_0" + + patch wiki_page_url(wiki_pages(:one)), params: { + wiki_page: { + title: "Test", + wiki_body: "Test" + } + } + + assert flash[:notice] + assert_redirected_to wiki_page_url(wiki_pages(:one)) + end + + test "should get revision" do + get revision_wiki_page_url wiki_pages(:one), "1" + + assert_nil flash[:alert] + assert_response :success + end + + test "should get changes" do + sign_in accounts "admin_0" + get modifications_wiki_pages_url + + assert_nil flash[:alert] + assert_response :success + end + + test "should get pages" do + sign_in accounts "admin_0" + get pages_wiki_pages_url + + assert_nil flash[:alert] + assert_response :success + end + + test "should destroy wiki page" do + sign_in accounts "admin_0" + assert_difference("Node.visible.count", -1) do + delete wiki_page_url(wiki_pages(:one)) + + assert flash[:notice] + end + assert_redirected_to wiki_page_url wiki_pages(:homePage) + end +end diff --git a/test/factories/node.rb b/test/factories/node.rb new file mode 100644 index 000000000..e3a516fb9 --- /dev/null +++ b/test/factories/node.rb @@ -0,0 +1,3 @@ +Factory.define :node do |n| + n.association :user +end diff --git a/test/factories/user.rb b/test/factories/user.rb new file mode 100644 index 000000000..86c66cdd9 --- /dev/null +++ b/test/factories/user.rb @@ -0,0 +1,6 @@ +Factory.define :user do |u| + u.login "ptramo" + u.email { |a| "#{a.login}@dlfp.org" } + u.password "I_<3_J2EE" + u.password_confirmation(&:password) +end diff --git a/test/fixtures/account_notifications/signup b/test/fixtures/account_notifications/signup new file mode 100644 index 000000000..1c319b711 --- /dev/null +++ b/test/fixtures/account_notifications/signup @@ -0,0 +1,3 @@ +AccountNotifications#signup + +Find me in app/views/account_notifications/signup.erb diff --git a/test/fixtures/accounts.yml b/test/fixtures/accounts.yml index 028f72059..cce34d7a1 100644 --- a/test/fixtures/accounts.yml +++ b/test/fixtures/accounts.yml @@ -4,6 +4,7 @@ anonymous: login: Anonyme email: anonymous@example.com role: inactive + confirmed_at: <%= Time.now %> <% 1000.times do |n| %> visitor_<%= n%>: @@ -11,21 +12,27 @@ visitor_<%= n%>: login: <%= "visitor_#{n}" %> email: <%= "visitor_#{n}@example.com" %> role: visitor + karma: 50 + nb_votes: 10 + confirmed_at: <%= Time.now %> + last_seen_on: <%= Date.today %> <% end %> visitor_negative_karma: user: visitor_negative_karma login: visitor_negative_karma - email: visitor_negative_karma@example.com + email: "visitor_negative_karma@example.com" role: visitor karma: -100 + last_seen_on: <%= 40.days.ago %> visitor_zero_karma: user: visitor_zero_karma login: visitor_zero_karma - email: visitor_zero_karma@example.com + email: "visitor_zero_karma@example.com" role: visitor karma: 0 + confirmed_at: <%= Time.now %> <% 7.times do |n| %> editor_<%= n%>: @@ -33,6 +40,8 @@ editor_<%= n%>: login: <%= "editor_#{n}" %> email: <%= "editor_#{n}@example.com" %> role: editor + karma: 50 + confirmed_at: <%= Time.now %> <% end %> <% 2.times do |n| %> @@ -41,6 +50,7 @@ maintainer_<%= n%>: login: <%= "maintainer_#{n}" %> email: <%= "maintainer_#{n}@example.com" %> role: maintainer + confirmed_at: <%= Time.now %> <% end %> <% 12.times do |n| %> @@ -49,6 +59,7 @@ moderator_<%= n%>: login: <%= "moderator_#{n}" %> email: <%= "moderator_#{n}@example.com" %> role: moderator + confirmed_at: <%= Time.now %> <% end %> <% 6.times do |n| %> @@ -57,4 +68,20 @@ admin_<%= n%>: login: <%= "admin_#{n}" %> email: <%= "admin_#{n}@example.com" %> role: admin + confirmed_at: <%= Time.now %> <% end %> + +joe: + user: joe + login: Joe + email: joe@example.com + role: visitor + karma: 10 + confirmed_at: <%= Time.now %> +bob: + user: bob + login: bob + email: bob@example.com + role: visitor + karma: 10 + confirmed_at: <%= Time.now %> diff --git a/test/fixtures/banners.yml b/test/fixtures/banners.yml new file mode 100644 index 000000000..caaa99359 --- /dev/null +++ b/test/fixtures/banners.yml @@ -0,0 +1,19 @@ +# == Schema Information +# +# Table name: banners +# +# id :integer(4) not null, primary key +# title :string(255) +# content :text +# active :boolean(1) +# + +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + title: MyString + content: MyText + +two: + title: Autre titre + content: Autre contenu diff --git a/test/fixtures/bookmarks.yml b/test/fixtures/bookmarks.yml new file mode 100644 index 000000000..f9e59dd74 --- /dev/null +++ b/test/fixtures/bookmarks.yml @@ -0,0 +1,6 @@ +one: + owner: visitor_0 + title: "Un si joli signet!" + cached_slug: un-si-joli-signet + link: http://www.unsijolisignet.com + lang: fr diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 000000000..a6cd01f8e --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,5 @@ +one: + title: "Hello world" + +two: + title: "Hello world" diff --git a/test/fixtures/comments.yml b/test/fixtures/comments.yml new file mode 100644 index 000000000..121722579 --- /dev/null +++ b/test/fixtures/comments.yml @@ -0,0 +1,36 @@ +one: + node: tracker_one + user: visitor_1 + title: "Hello World" + wiki_body: "Hello World" + materialized_path: "hello-world" + state: published + +seconde: + node: one + user: visitor_1 + title: Commentaire sur un journal + wiki_body: Commentaire sur un journal + +old: + node: old + user: visitor_1 + title: Commentaire sur un journal + wiki_body: Commentaire sur un journal + created_at: 2010-01-01 00:00:00 + +poll: + node: poll + user: visitor_1 + title: Commentaire sur un sondage + wiki_body: Commentaire sur un sondage + created_at: 2010-01-01 00:00:00 + materialized_path: 000079493703 + +poll_2: + node: poll + user: visitor_1 + title: Commentaire sur un sondage + wiki_body: Commentaire sur un sondage + created_at: 2010-01-01 00:00:00 + materialized_path: 000079493703 diff --git a/test/fixtures/diaries.yml b/test/fixtures/diaries.yml index ffabfacb2..e03e188b3 100644 --- a/test/fixtures/diaries.yml +++ b/test/fixtures/diaries.yml @@ -1,3 +1,18 @@ +one: + title: My own diary + cached_slug: my-own-diary + owner: visitor_1 + body: Un si joli journal + wiki_body: Un si joli journal + +old: + title: My own diary + cached_slug: my-own-diary + owner: visitor_1 + body: Un si joli journal + wiki_body: Un si joli journal + created_at: <%= 4.months.ago %> + lorem_cc_licensed: title: Lorem ipsum cached_slug: lorem-ipsum @@ -16,7 +31,7 @@ lorem_cc_licensed: Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. - Maecenas adipiscing ante non diam sodales hendrerit. + Maecenas adipiscing ante non diam sodales hendrerit. wiki_body: >-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. @@ -55,7 +70,7 @@ lorem_copyright: Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. - Maecenas adipiscing ante non diam sodales hendrerit. + Maecenas adipiscing ante non diam sodales hendrerit. wiki_body: >-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. diff --git a/test/fixtures/files/Logo.png b/test/fixtures/files/Logo.png new file mode 100644 index 000000000..13ee22f9c Binary files /dev/null and b/test/fixtures/files/Logo.png differ diff --git a/test/fixtures/files/blue-smooth.scss b/test/fixtures/files/blue-smooth.scss new file mode 100644 index 000000000..caaf56602 --- /dev/null +++ b/test/fixtures/files/blue-smooth.scss @@ -0,0 +1,2174 @@ +/** + * Author: Mounir + * License: CC-by-sa - http://creativecommons.org/licenses/by-sa/3.0/deed.fr + */ + +/* Contenu par défaut */ + +@font-face { + font-family: Megalopolis; + src: url("/fonts/MEgalopolisExtra.otf") format("opentype"); +} + +/* Contenu par défaut */ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +font, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} + +/* line 17, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body { + line-height: 1; + color: black; + background: -moz-linear-gradient(#c0c4c8, #c8ccd0); + background-color: #b0c0d0; + font-size: 12px; +} + +/* line 19, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, +ul { + list-style: none; +} + +/* line 21, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { + border-collapse: separate; + border-spacing: 0; + vertical-align: middle; +} + +/* line 23, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, +th, +td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} + +/* line 25, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, +blockquote { + quotes: "" ""; +} +/* line 96, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +/* line 27, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { + border: none; +} + +/* line 108, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, +aside, +canvas, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section, +summary { + margin: 0; + padding: 0; + border: 0; + outline: 0; + display: block; +} + +aside#sidebar { + position: relative; + top: -20px; + padding: 0; +} + +/* line 41, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp .box { + padding: 1.5em; + margin-bottom: 1.5em; + background: #e5ecf9; +} +/* line 44, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp div.border { + padding-right: 4px; + margin-right: 5px; + border-right: 1px solid #eeeeee; +} +/* line 47, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp div.colborder { + padding-right: 24px; + margin-right: 25px; + border-right: 1px solid #eeeeee; +} +/* line 49, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp hr { + background: #dddddd; + color: #dddddd; + clear: both; + float: none; + width: 100%; + height: 0.1em; + margin: 0 0 1.45em; + border: none; +} +/* line 51, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp hr.space { + background: #dddddd; + color: #dddddd; + clear: both; + float: none; + width: 100%; + height: 0.1em; + margin: 0 0 1.45em; + border: none; + background: white; + color: white; + visibility: hidden; +} +/* line 53, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss */ +body.bp form.inline { + line-height: 3; +} +/* line 6, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +body.bp form.inline p { + margin-bottom: 0; +} + +/* line 23, ../../app/stylesheets/_application.scss */ +body { + line-height: 1.5; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + color: #33332d; + font-size: 75%; +} +/* line 65, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h1, +body h2, +body h3, +body h4, +body h5, +body h6 { + font-weight: normal; + color: #607080; +} +/* line 66, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h1 img, +body h2 img, +body h3 img, +body h4 img, +body h5 img, +body h6 img { + margin: 0; +} +/* line 67, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h1 { + font-size: 3em; + line-height: 1; + margin-bottom: 0.5em; +} +/* line 68, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h2 { + font-size: 2em; + margin-bottom: 0.75em; +} +/* line 69, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h3 { + font-size: 1.5em; + line-height: 1; + margin-bottom: 1em; +} +/* line 70, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h4 { + font-size: 1.2em; + line-height: 1.25; + margin-bottom: 1.25em; +} +/* line 71, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h5 { + font-size: 1em; + font-weight: bold; + margin-bottom: 1.5em; +} +/* line 72, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body h6 { + font-size: 1em; + font-weight: bold; +} +/* line 73, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body p { + margin: 0 0 1.5em; +} +/* line 74, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body p img.left { + display: inline; + float: left; + margin: 1.5em 1.5em 1.5em 0; + padding: 0; +} +/* line 75, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body p img.right { + display: inline; + float: right; + margin: 1.5em 0 1.5em 1.5em; + padding: 0; +} +/* line 77, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body a { + text-decoration: underline; + color: #000099; +} +/* line 18, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss */ +body a:visited { + color: black; +} +/* line 21, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss */ +body a:focus { + color: black; +} +/* line 24, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss */ +body a:hover { + color: black; +} +/* line 27, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss */ +body a:active { + color: black; +} +/* line 78, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body blockquote { + margin: 1.5em; + color: #666666; + font-style: italic; +} +/* line 79, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body strong { + font-weight: bold; +} +/* line 80, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body em { + font-style: italic; +} +/* line 81, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body dfn { + font-style: italic; + font-weight: bold; +} +/* line 82, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body sup, +body sub { + line-height: 0; +} +/* line 83, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body abbr, +body acronym { + border-bottom: 1px dotted #666666; +} +/* line 84, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body address { + margin: 0 0 1.5em; + font-style: italic; +} +/* line 85, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body del { + color: #666666; +} +/* line 86, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body pre { + margin: 1.5em 0; + white-space: pre; +} +/* line 87, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body pre, +body code, +body tt { + font: 1em "andale mono", "lucida console", monospace; + line-height: 1.5; +} +/* line 88, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body li ul, +body li ol { + margin: 0; +} +/* line 89, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body ul, +body ol { + margin: 0 1.5em 1.5em 0; + padding-left: 3.333em; +} +/* line 90, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body ul { + list-style-type: disc; +} +/* line 91, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body ol { + list-style-type: decimal; +} +/* line 92, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body dl { + margin: 0 0 1.5em 0; +} +/* line 93, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body dl dt { + font-weight: bold; +} +/* line 94, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body dd { + margin-left: 1.5em; +} +/* line 95, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body table { + margin-bottom: 1.4em; + width: 100%; +} +/* line 96, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body th { + font-weight: bold; +} +/* line 97, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body thead th { + background: #c3d9ff; +} +/* line 98, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body th, +body td, +body caption { + padding: 4px 10px 4px 5px; +} +/* line 99, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body tr.even td { + background: #e5ecf9; +} +/* line 100, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body tfoot { + font-style: italic; +} +/* line 101, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body caption { + background: #eeeeee; +} +/* line 102, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body .quiet { + color: #666660; +} +/* line 103, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_typography.scss */ +body .loud { + color: #11110b; +} +/* line 9, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .clear { + clear: both; +} +/* line 12, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .nowrap { + white-space: nowrap; +} +/* line 16, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .clearfix { + overflow: hidden; + *zoom: 1; +} +/* line 18, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .small { + font-size: 0.8em; + margin-bottom: 1.875em; + line-height: 1.875em; +} +/* line 22, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .large { + font-size: 1.2em; + line-height: 2.5em; + margin-bottom: 1.25em; +} +/* line 26, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .first { + margin-left: 0; + padding-left: 0; +} +/* line 29, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .last { + margin-right: 0; + padding-right: 0; +} +/* line 32, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .top { + margin-top: 0; + padding-top: 0; +} +/* line 35, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_utilities.scss */ +body .bottom { + margin-bottom: 0; + padding-bottom: 0; +} +/* line 8, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_debug.scss */ +body .showgrid { + background: url("/images/grid.png"); +} +/* line 4, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .error { + padding: 0.8em; + margin-bottom: 1em; + border: 2px solid #dddddd; + background: #fbe3e4; + color: #8a1f11; + border-color: #fbc2c4; +} +/* line 29, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .error a { + color: #8a1f11; +} +/* line 6, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .notice { + padding: 0.8em; + margin-bottom: 1em; + border: 2px solid #dddddd; + background: #fff6bf; + color: #514721; + border-color: #ffd324; +} +/* line 37, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .notice a { + color: #514721; +} +/* line 8, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .success { + padding: 0.8em; + margin-bottom: 1em; + border: 2px solid #dddddd; + background: #e6efc2; + color: #264409; + border-color: #c6d880; +} +/* line 45, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .success a { + color: #264409; +} +/* line 10, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .hide { + display: none; +} +/* line 12, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .highlight { + background: yellow; +} +/* line 14, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .added { + background: #006600; + color: white; +} +/* line 16, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_interaction.scss */ +body .removed { + background: #990000; + color: white; +} + +/* line 18, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form label { + font-weight: bold; +} +/* line 19, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form fieldset { + padding: 1.4em; + margin: 0 0 1.5em 0; +} +/* line 20, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form legend { + font-weight: bold; + font-size: 1.2em; +} +/* line 26, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input.text, +form input.title, +form input[type="email"], +form input[type="text"], +form input[type="password"] { + margin: 0.5em 0; + background-color: white; + padding: 5px; +} +/* line 27, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input.title { + font-size: 1.5em; +} +/* line 31, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input[type="checkbox"], +form input.checkbox, +form input[type="radio"], +form input.radio { + position: relative; + top: 0.25em; +} +/* line 33, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form textarea { + margin: 0.5em 0; + padding: 5px; +} +/* line 34, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form select { + margin: 0.5em 0; +} +/* line 59, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form fieldset { + border: 1px solid #cccccc; +} +/* line 62, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input.text, +form input.title, +form input[type="email"], +form input[type="text"], +form input[type="password"], +form textarea, +form select { + border: 1px solid #bbbbbb; +} +/* line 64, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input.text:focus, +form input.title:focus, +form input[type="email"]:focus, +form input[type="text"]:focus, +form input[type="password"]:focus, +form textarea:focus, +form select:focus { + border: 1px solid #666666; +} +/* line 48, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form input.text, +form input.title, +form input[type="email"], +form input[type="text"], +form input[type="password"] { + width: 300px; + background: -moz-linear-gradient(white, #e8e8e8) white; + border: 1px solid #405070; + padding: 0; +} +/* line 50, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/blueprint/stylesheets/blueprint/_form.scss */ +form textarea { + width: 390px; + height: 250px; +} + +/* line 1, ../../app/stylesheets/layout/_site.scss */ +#site { + background: -moz-linear-gradient(#8090a0, #607080) repeat scroll 0 0 + transparent; + background-color: #607080; + border-bottom: 2px solid #405070; + margin-bottom: 20px; + padding: 1px 0 1px 0; +} +/* line 5, ../../app/stylesheets/layout/_site.scss */ +#site .go_to_content { + float: left; + text-indent: -119988px; + overflow: hidden; + text-align: left; +} +/* line 8, ../../app/stylesheets/layout/_site.scss */ +#site ul { + display: inline; + list-style: none; + width: 100%; +} +/* line 4, ../../app/stylesheets/mixins/_list.scss */ +#site ul li { + display: inline; +} +/* line 10, ../../app/stylesheets/mixins/_list.scss */ +#site ul li:after { + content: " | "; +} +/* line 13, ../../app/stylesheets/mixins/_list.scss */ +#site ul li:last-child:after, +#site ul li.last:after { + content: ""; +} +/* line 11, ../../app/stylesheets/layout/_site.scss */ +#site ul li { + padding: 5px 0; + color: white; + font-size: 1em; +} +/* line 15, ../../app/stylesheets/layout/_site.scss */ +#site ul li a { + color: inherit; + text-decoration: none; +} +/* line 4, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_hover-link.scss */ +#site ul li a:hover { + text-decoration: underline; +} +/* line 18, ../../app/stylesheets/layout/_site.scss */ +#site form { + float: right; +} + +/* line 21, ../../app/stylesheets/layout/_site.scss */ +#label_query { + float: left; + text-indent: -119988px; + overflow: hidden; + text-align: left; +} + +#query { + background: -moz-linear-gradient(#a0b0c0, #a8b8c8) repeat scroll 0 0 + transparent; + background-color: #a0a8b0; + border: 1px solid black; +} + +/* line 1, ../../app/stylesheets/layout/_sidebar.scss */ +#sidebar { + padding: 10px; +} +/* line 6, ../../app/stylesheets/layout/_sidebar.scss */ +#sidebar .box { + margin: 15px 0 0 0; + padding: 10px; + background-color: #a8b8c8; + border-style: solid; + border-color: black; + border-width: 2px 2px 2px 0; +} + +#sidebar .box a { + font-weight: bold; + text-decoration: none; + color: #203040; +} + +#sidebar .box ul { + padding-left: 2em; +} + +#sidebar .box li { + font-weight: bold; + text-decoration: none; + color: #203040; +} + +#sidebar .login { + padding: 0; + padding-bottom: 10px; +} + +#sidebar .login > h1 { + background: -moz-linear-gradient(#8090a0, #607080); + background-color: #607080; + border-bottom: 1px solid #405070; + font-size: 1.4em; + font-weight: bold; + color: white; + padding: 0.1em 0 0.4em 2px; + text-align: left; +} + +#sidebar .login > h1 a { + text-decoration: none; + color: white; +} + +#sidebar .login p { + margin: 0; + padding-left: 1em; + margin-bottom: 0; +} + +#sidebar .login p:first-letter { + font-weight: bold; +} + +#sidebar .login p a { + text-decoration: none; + color: black; +} + +/* line 12, ../../app/stylesheets/layout/_sidebar.scss */ +#sidebar h1 { + font-size: 1.6em; + text-align: center; +} +/* line 15, ../../app/stylesheets/layout/_sidebar.scss */ +#sidebar input { + max-width: 180px; +} +/* line 17, ../../app/stylesheets/layout/_sidebar.scss */ +#sidebar .forum h2 { + font-size: 1.1em; +} + +/* line 21, ../../app/stylesheets/layout/_sidebar.scss */ +#branding h1 { + display: block; + width: 201px; + height: 186px; + border-bottom: 2px solid black; + border-right: 2px solid black; + -moz-border-radius-bottomright: 10px; +} +/* line 27, ../../app/stylesheets/layout/_sidebar.scss */ +#branding h1 a { + display: block; + width: 100%; + height: 100%; + text-indent: -119988px; + overflow: hidden; + text-align: left; +} + +/* line 2, ../../app/stylesheets/layout/_container.scss */ +#container > h1 { + margin-bottom: 1em; + text-align: center; + font-family: Megalopolis, helvetica, arial, serif; + font-size: 3.5em; + font-weight: bolder; + line-height: 1em; +} + +/* +#container nav.toolbox +{ + background:-moz-linear-gradient(white, #F0F0F0); + border:2px solid #1F1F18; + -moz-border-radius:10px; +} +*/ + +/* Navigation */ + +#container nav.toolbox > div, +#container nav.toolbox > div a { + margin: 0 auto 0 auto; + /* background:-moz-linear-gradient(#8090A0, #607080) #607080; */ + text-align: center; + text-decoration: none; + color: #607080; +} + +#container nav.toolbox > div a:hover { + background: white; + opacity: 0.5; +} + +/* Suivi (faire une demande pour obtenir un vrai id) */ + +#container > p, +#container > p a, +#container > footer, +#container > footer a { + text-decoration: none; + color: #607080; +} + +#container > p a:hover, +#container > footer a:hover { + background: white; + opacity: 0.5; +} + +/* line 9, ../../app/stylesheets/layout/_container.scss */ +#container nav.toolbox ul, +#container .toolbox li { + display: inline; +} + +/* line 1, ../../app/stylesheets/layout/_bigfooter.scss */ +#bigfooter { + margin: 15px 0 0; + background: -moz-linear-gradient(#8090a0, #607080) #607080; + padding-bottom: 25px; + border-top: 2px solid #405070; +} + +/* line 6, ../../app/stylesheets/layout/_bigfooter.scss */ +#bigfooter nav, +#bigfooter section { + display: inline-block; + padding-top: 5px; + height: 100%; + vertical-align: top; +} +/* line 11, ../../app/stylesheets/layout/_bigfooter.scss */ +#bigfooter nav h1, +#bigfooter section h1 { + font-size: 2em; + color: white; +} +/* line 13, ../../app/stylesheets/layout/_bigfooter.scss */ +#bigfooter #about_us { + margin-right: 0; +} + +#bigfooter a { + color: white; + text-decoration: none; +} + +/* line 7, ../../app/stylesheets/layout/_layout.scss */ +#site { + overflow: hidden; +} + +/* line 10, ../../app/stylesheets/layout/_layout.scss */ +#sidebar { + display: inline; + float: left; + overflow: hidden; + width: 20.003%; + margin-right: 1.042%; + width: 203px; +} + +/* line 14, ../../app/stylesheets/layout/_layout.scss */ +#container { +} +/* line 16, ../../app/stylesheets/layout/_layout.scss */ +#container > * { + margin: 0 50px 0 257px; +} + +/* line 19, ../../app/stylesheets/layout/_layout.scss */ +#edition { + display: inline; + float: left; + overflow: hidden; + width: 62.093%; + margin-right: 1.042%; +} + +/* line 22, ../../app/stylesheets/layout/_layout.scss */ +#chat { + display: inline; + float: left; + overflow: hidden; + width: 32.63%; + margin-right: 1.042%; +} + +/* line 25, ../../app/stylesheets/layout/_layout.scss */ +#bigfooter { + display: inline; + float: left; + overflow: hidden; + width: 99.974%; + margin-right: 1.042%; +} +/* line 27, ../../app/stylesheets/layout/_layout.scss */ +#bigfooter nav, +#bigfooter section { + display: inline; + float: left; + overflow: hidden; + width: 24.212%; + margin-right: 1.042%; +} + +/* line 1, ../../app/stylesheets/partials/_generics.scss */ +body { + color: #33332d; + font-family: "Droid Sans", sans-serif; +} + +/* line 5, ../../app/stylesheets/partials/_generics.scss */ +ins.diffins, +ins.diffmod { + background-color: #33ff33; +} + +/* line 8, ../../app/stylesheets/partials/_generics.scss */ +del.diffdel, +del.diffmod { + background-color: #ff3333; +} + +/* line 12, ../../app/stylesheets/partials/_generics.scss */ +a.action:before, +time.norloge:before, +span.content_type:before { + content: "["; +} +/* line 14, ../../app/stylesheets/partials/_generics.scss */ +a.action:after, +time.norloge:after, +span.content_type:after { + content: "]"; +} + +/* line 17, ../../app/stylesheets/partials/_generics.scss */ +footer.actions:before { + content: "⇾"; +} + +li#comment_new footer.actions:before { + content: ""; + height: 2em; + clear: both; +} + +/* line 20, ../../app/stylesheets/partials/_generics.scss */ +aside.banner { + background: -moz-linear-gradient(#8090a0, #607080) #607080; + font-size: 2em; + border: 2px solid black; + -moz-border-radius: 2em; + padding-left: 2em; + padding-right: 2em; + text-align: center; + color: white; +} + +aside.banner a { + font-weight: bold; + text-decoration: none; + color: white; +} + +/* line 1, ../../app/stylesheets/partials/_forms.scss */ +.fieldWithErrors input { + border: 1px solid red; +} + +/* line 2, ../../app/stylesheets/partials/_contents.scss */ +article { + margin: 15px 0; + padding: 0; + background: -moz-linear-gradient(white, #f0f0f0); + border: 2px solid #1f1f18; + overflow: hidden; +} + +article header { + margin: 0 0 0 0; +} + +/* line 9, ../../app/stylesheets/partials/_contents.scss */ +article header h1 { + margin: 0; + background: -moz-linear-gradient(#8090a0, #607080); + background-color: #607080; + border-bottom: 1px solid black; + padding-left: 2px; + font-family: Megalopolis, helvetica, arial, serif; + font-size: 1.4em; + color: white; +} + +/* line 14, ../../app/stylesheets/partials/_contents.scss */ +article header h1 a, +article header h1 a:visited { + text-decoration: none; + color: white; +} +/* line 4, ../../../../shared/bundle/ruby/1.9.1/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/links/_hover-link.scss */ +article header h1 a:hover, +article header h1 a:active { + color: #e0e0e4; +} + +/* line 16, ../../app/stylesheets/partials/_contents.scss */ +article header h1 a + a:before { + content: " : "; +} + +article header .meta, +div#comments ul.threads li.comment p.meta, +div#contents ul.threads li.comment p.meta, +li#comment_new p.meta { + padding-left: 4px; + color: #808080; + font-style: italic; +} + +article header .meta a, +div#comments ul.threads li.comment p.meta a, +div#contents ul.threads li.comment p.meta a, +li#comment_new p.meta a { + color: #808080; + text-decoration: none; +} + +article header .meta a:hover, +div#comments ul.threads li.comment p.meta a:hover, +div#contents ul.threads li.comment p.meta a:hover, +li#comment_new p.meta a:hover { + color: black; + text-decoration: underline; +} + +/* line 18, ../../app/stylesheets/partials/_contents.scss */ +article figure { + float: left; + margin-left: 2px; + margin-right: 5px; +} +/* line 21, ../../app/stylesheets/partials/_contents.scss */ +article figure.score { + float: right; + width: 2em; + height: 2em; + margin-left: 5px; + margin-right: 1.5em; + padding: 0.2em 0 0 0; + background: -moz-linear-gradient(white, #e0e0f0); + border: 1px solid #e0e0f0; + border-radius: 2em; + -moz-border-radius: 2em; + -webkit-border-radius: 2em; + font-weight: bold; + text-align: center; + color: #a0a0b0; +} + +article div.tags { + float: right; +} + +/* line 29, ../../app/stylesheets/partials/_contents.scss */ +article ul.tag_cloud { + display: inline; + list-style: none; + margin-left: 0; + padding: 0; +} +/* line 4, ../../app/stylesheets/mixins/_list.scss */ +article ul.tag_cloud li { + display: inline; +} + +article div.content { + margin-top: 1em; + padding: 0 4.5em 1em 1.5em; +} + +article div.content a, +article footer.actions a { + text-decoration: none; + color: #405060; + font-weight: bold; +} + +/* +article div.content h2, +article div.content h3, +article div.content h4, +article div.content h2 a, +article div.content h3 a, +article div.content h4 a +{ + color:black; +} +*/ + +article#contents { + padding: 1em; +} + +article#contents > h1, +li#comment_new .content h1 { + margin-bottom: 0.7em; + padding-bottom: 0; + line-height: 85%; + font-size: 1.8em; + font-weight: bold; + text-align: center; +} + +article > h2, +article div.content h2, +article#contents div.body h2, +li#comment_new .content h2 { + margin-bottom: 0.7em; + border-bottom: 1px solid #607080; + padding-bottom: 0; + line-height: 85%; + font-size: 1.5em; + font-weight: bold; +} + +article > h3, +article div.content h3, +article#contents div.body h3, +li#comment_new .content h3 { + margin-bottom: 0.7em; + border-bottom: 1px solid #c0c4c8; + padding-bottom: 0; + line-height: 85%; + font-size: 1.3em; + font-weight: bold; +} + +article > h4, +article div.content h4, +article#contents div.body h4, +li#comment_new .content h4 { + margin-bottom: 0.7em; + font-size: 1.2em; + font-weight: bold; +} + +article#contents div.body h2, +article#contents div.body h3, +article#contents div.body h4, +li#comment_new .content h1, +li#comment_new .content h2, +li#comment_new .content h3, +li#comment_new .content h4 { + border-bottom: none; +} + +article div.content p { + text-align: justify; + text-indent: 1em; +} + +article div.content a:hover, +article div.content a:active, +article div.content a:visited, +article footer.actions a:hover, +article footer.actions a:active, +article footer.actions a:visited { + color: #203040; +} + +article div.content pre { + margin-left: 2em; + margin-right: 2em; + border: 1px solid #c8c8d0; + padding: 2px; + overflow: auto; +} + +/* line 4, ../../app/stylesheets/partials/_forms.scss */ + +article footer.actions, +div#comments ul.threads li.comment footer.actions, +div#contents ul.threads li.comment footer.actions { + padding: 0 1em 0 1em; + clear: both; + text-align: right; +} + +article footer.actions a.action, +div#comments ul.threads li.comment footer.actions a.action, +div#contents ul.threads li.comment footer.actions a.action { + vertical-align: top; + font-size: 0.9em; + font-weight: bold; + text-decoration: none; + color: black; +} + +#container header li .add_tag, +#container header li .remove_tag { + display: none; +} + +article footer.actions .vote, +div#comments ul.threads li.comment footer.actions .vote, +div#contents ul.threads li.comment footer.actions .vote { + font-size: 0.8em; + font-style: italic; + text-align: right; + color: #808080; +} + +article footer.actions .vote form.button_to, +div#comments ul.threads li.comment footer.actions .vote form, +div#contents ul.threads li.comment footer.actions .vote form { + display: inline-block; +} + +article footer.actions .vote form.button_to div input, +div#comments + ul.threads + li.comment + footer.actions + .vote + form.button_to + div + input, +div#contents + ul.threads + li.comment + footer.actions + .vote + form.button_to + div + input { + margin: 0px; + background: inherit; + border: 0px; + padding: 0px; + font: inherit; + font-weight: bold; +} + +div#comments { + margin-top: 1em; + padding: 0 4.5em 1em 1.5em; +} + +/* Lien "envoyer un commentaire" et "proposer une entrée" */ + +div#comments > p:first-child, +#container nav.toolbox div.new_content, +#container > p { + width: 15em; + margin: 1.5em auto 1.5em auto; + background: -moz-linear-gradient(#8090a0, #607080) #607080; + border: 2px solid black; + -moz-border-radius: 10px; + padding: 1px 2px 1px 2px; + font-weight: bold; + text-align: center; +} + +div#comments p:first-child a, +#container nav.toolbox div.new_content a, +#container > p a { + color: white; + text-decoration: none; +} + +/* Déclage de "proposer une entrée" dans suivi */ +#container > p { + position: relative; + left: 110px; +} + +div#comments ul.threads, +div#contents ul.threads { +} + +div#comments ul.threads li.comment, +div#contents ul.threads li.comment, +li#comment_new { + position: relative; + margin: 2em 0 0.5em 0; + background: -moz-linear-gradient(#e8ecf0, #d8dce0); + border-left: 1px solid #405060; + /*-moz-linear-gradient(#A0B0C0, #A8B8C8) #A0A8B0;*/ + list-style: none; +} + +div#comments ul.threads > li.comment, +div#contents ul.threads > li.comment, +li#comment_new { + /* + Les deux lignes suivantes règlent le problème de la propriété clear + du pied du commentaire qui décale le premier message + sous les boites du panneau de gauche ("Editions par ex.") + */ + display: inline-block; + width: 100%; + + border-right: 1px solid #405060; + border-bottom: 1px solid #405060; +} + +div#comments ul.threads > li.comment ul > li, +div#contents ul.threads > li.comment ul > li { + border-bottom: 1px solid #708090; + margin-bottom: 0; +} + +div#comments ul.threads > li.comment ul > li:last-child, +div#contents ul.threads > li.comment ul > li:last-child { + border-bottom: none; + margin-bottom: 0; +} + +div#comments ul.threads li.comment > h2, +div#contents ul.threads li.comment > h2, +li#comment_new > h2 { + margin: 0; + position: relative; + left: -2%; + top: -0.5em; + width: 102%; + background: -moz-linear-gradient(#8090a0, #607080); + background-color: #607080; + border: 2px solid black; + -moz-border-radius: 10px; + padding: 0 0 0 3px; + font-family: Megalopolis, helvetica, arial, serif; + font-size: 1em; +} + +div#comments ul.threads li.comment > h2, +div#comments ul.threads li.comment > h2 a, +div#comments ul.threads li.comment > h2 a:hover, +div#comments ul.threads li.comment > h2 a:visited, +div#comments ul.threads li.comment > h2 a:active, +div#contents ul.threads li.comment > h2, +div#contents ul.threads li.comment > h2 a, +div#contents ul.threads li.comment > h2 a:hover, +div#contents ul.threads li.comment > h2 a:visited, +div#contents ul.threads li.comment > h2 a:active, +li#comment_new h2 a, +li#comment_new h2 a:hover, +li#comment_new h2 a:visited, +li#comment_new h2 a:active { + color: white; + text-decoration: none; +} + +div#comments ul.threads li.comment div.content, +div#contents ul.threads li.comment div.content, +li#comment_new li.comment div.content { + margin-left: 1em; + margin-right: 1em; + padding: 2px 1em 1em 1em; + overflow: hidden; +} + +li#comment_new { + margin-left: 1em; +} + +/* line 34, ../../app/stylesheets/partials/_contents.scss */ +.comment .new_comment h3 { + border: 1px solid red; +} +/* line 36, ../../app/stylesheets/partials/_contents.scss */ +.comment .avatar { + float: left; + margin: 5px 10px; + box-shadow: 8px 8px 12px #607080; + -moz-box-shadow: 8px 8px 12px #aaa; + -webkit-box-shadow: 8px 8px 12px #aaa; +} +/* line 39, ../../app/stylesheets/partials/_contents.scss */ +.comment img { + max-width: 100%; +} + +/* line 44, ../../app/stylesheets/partials/_contents.scss */ +#polls .result, +.poll .result { + display: block; + margin: 0 0 0 10px; + background: -moz-linear-gradient(#a0b0c0, #a8b8c8) #a0a8b0; + border: 1px solid #333333; + -moz-border-radius-topright: 10px; + -moz-border-radius-bottomright: 10px; + padding-left: 2px; +} +/* line 49, ../../app/stylesheets/partials/_contents.scss */ +#polls ul, +.poll ul { + list-style: none; + margin-left: 10px; +} + +article ul.archived ul { + list-style: none; + margin-left: 0px; +} + +article ul.archived > li { + margin-bottom: 10px; +} + +/* line 56, ../../app/stylesheets/partials/_contents.scss */ +#tracker .fix a, +#tracker .invalid a, +.tracker .fix a, +.tracker .invalid a { + text-decoration: line-through; +} + +/* line 1, ../../app/stylesheets/partials/_toolbar.scss */ +#toolbar { + position: fixed; + overflow: hidden; + bottom: 0; + left: 20px; + right: 20px; + padding: 2px; + color: #333333; + background-color: #dfd6d1; + border: 1px solid #bbaaaa; +} + +/* line 12, ../../app/stylesheets/partials/_toolbar.scss */ +#toolbar_items { + float: right; +} + +/* line 15, ../../app/stylesheets/partials/_toolbar.scss */ +.fold > .meta, +.fold > .image, +.fold > .content, +.fold > .actions { + display: none; +} + +/* line 1, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_results { + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} +/* line 7, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} +/* line 13, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_results li { + font: menu; + margin: 0; + padding: 2px 5px; + cursor: default; + display: block; + font-size: 12px; + line-height: 16px; + overflow: hidden; +} + +/* line 23, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_loading { + background: white url("/images/ajax-loader.gif") right center no-repeat; +} + +/* line 26, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_odd { + background-color: #eeeeee; +} + +/* line 29, ../../app/stylesheets/partials/_autocomplete.scss */ +.ac_over { + background-color: #0a246a; + color: white; +} + +/* line 1, ../../app/stylesheets/partials/_notice.scss */ +.notice-wrap { + position: fixed; + top: 20px; + right: 20px; + width: 250px; + height: 1em; + z-index: 9999; +} + +/* line 8, ../../app/stylesheets/partials/_notice.scss */ +.notice-item { + height: 60px; + background: #333333; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + color: #eeeeee; + padding: 6px 6px 0 6px; + font-family: lucida Grande; + font-size: 11px; + border: 2px solid #999999; + display: block; + position: relative; + margin: 0 0 12px 0; +} + +/* line 22, ../../app/stylesheets/partials/_notice.scss */ +.notice-item-close { + position: absolute; + font-family: Arial; + font-size: 12px; + font-weight: bold; + right: 6px; + top: 6px; + cursor: pointer; +} + +/* line 1, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp { + /* width: 700px; */ + margin: 5px 0 5px 0; + /* border: 5px solid #f5f5f5; */ +} +/* line 6, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .markItUp a:link, +.markItUp .markItUp a:visited { + color: black; + text-decoration: none; +} + +.markItUpHeader { + background: black; +} + +.markItUpHeader > ul > li.markItUpButton { + background: -moz-linear-gradient(#8090a0, #607080) repeat scroll 0 0 #607080; + border: 1px solid #405070; +} + +/* line 10, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpContainer { + /* border: 1px solid #3c769d; */ + /* background: white url(/images/markitup/bg-container.png) repeat-x top left; */ + padding: 5px 5px 2px 5px; + font: 11px Verdana, Arial, Helvetica, sans-serif; +} + +/* line 16, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpEditor { + font: 12px "Courier New", Courier, monospace; + padding: 5px 5px 5px 35px; + border: 1px solid #405070; + /* width: 643px; */ + width: 90%; + margin: 0 auto 0 auto; + height: 320px; + background-image: url(/images/markitup/bg-editor-markdown.png); + background-repeat: no-repeat; + /* clear: both */ + display: block; + line-height: 18px; + -moz-box-shadow: 8px 8px 12px #aaa; + -webkit-box-shadow: 8px 8px 12px #aaa; + overflow: auto; +} + +/* line 29, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpPreviewFrame { + overflow: auto; + background-color: white; + border: 1px solid #3c769d; + width: 99.9%; + height: 300px; + margin: 5px 0; +} + +/* line 37, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpFooter { + width: 100%; + cursor: n-resize; +} + +/* line 41, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpResizeHandle { + overflow: hidden; + width: 22px; + height: 5px; + margin-left: auto; + margin-right: auto; + background-image: url(/images/markitup/handle.png); + cursor: n-resize; +} + +/* line 51, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul li { + list-style: none; + float: left; + position: relative; +} +/* line 55, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul li ul { + display: none; +} +/* line 57, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul li:hover > ul { + display: block; +} +/* line 59, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul a { + display: block; + width: 16px; + height: 16px; + text-indent: -10000px; + background-repeat: no-repeat; + padding: 3px; + margin: 0px; +} +/* line 67, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul .markItUpDropMenu { + background: transparent url(/images/markitup/menu.png) no-repeat 115% 50%; + margin-right: 5px; +} +/* line 70, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul .markItUpDropMenu li { + margin-right: 0px; +} +/* line 72, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul .markItUpSeparator { + margin: 0 10px; + width: 1px; + height: 16px; + overflow: hidden; + background-color: #cccccc; +} +/* line 78, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul { + display: none; + position: absolute; + top: 18px; + left: 0px; + background: #f5f5f5; + border: 1px solid #3c769d; + height: inherit; +} +/* line 86, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul .markItUpSeparator { + width: auto; + height: 1px; + margin: 0px; +} +/* line 90, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul li { + float: none; + border-bottom: 1px solid #3c769d; +} +/* line 93, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul .markItUpDropMenu { + background: #f5f5f5 url(/images/markitup/submenu.png) no-repeat 100% 50%; +} +/* line 95, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul ul { + position: absolute; + top: -1px; + left: 150px; +} +/* line 99, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul ul li { + float: none; +} +/* line 101, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul a { + display: block; + padding-left: 0px; + text-indent: 0; + width: 120px; + padding: 5px 5px 5px 25px; + background-position: 2px 50%; +} +/* line 108, ../../app/stylesheets/partials/_markitup.scss */ +.markItUpHeader ul ul a:hover { + color: white; + background-color: #3c769d; +} + +/* line 113, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .h1 a { + background-image: url(/images/markitup/h1.png); +} +/* line 115, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .h2 a { + background-image: url(/images/markitup/h2.png); +} +/* line 117, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .h3 a { + background-image: url(/images/markitup/h3.png); +} +/* line 119, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .h4 a { + background-image: url(/images/markitup/h4.png); +} +/* line 121, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .bold a { + background-image: url(/images/markitup/bold.png); +} +/* line 123, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .italic a { + background-image: url(/images/markitup/italic.png); +} +/* line 125, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .stroke a { + background-image: url(/images/markitup/stroke.png); +} +/* line 127, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .list-bullet a { + background-image: url(/images/markitup/list-bullet.png); +} +/* line 129, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .list-numeric a { + background-image: url(/images/markitup/list-numeric.png); +} +/* line 131, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .image a { + background-image: url(/images/markitup/picture.png); +} +/* line 133, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .link a { + background-image: url(/images/markitup/link.png); +} +/* line 135, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .quotes a { + background-image: url(/images/markitup/quotes.png); +} +/* line 137, ../../app/stylesheets/partials/_markitup.scss */ +.markItUp .code a { + background-image: url(/images/markitup/page_white_code.png); +} + +/* line 1, ../../app/stylesheets/pygments/colorful.scss */ +.hll { + background-color: #ffffcc; +} + +/* line 3, ../../app/stylesheets/pygments/colorful.scss */ +code.c { + color: #808080; +} + +/* line 5, ../../app/stylesheets/pygments/colorful.scss */ +.err { + color: #f00000; + background-color: #f0a0a0; +} + +/* line 8, ../../app/stylesheets/pygments/colorful.scss */ +.k { + color: #008000; + font-weight: bold; +} + +/* line 11, ../../app/stylesheets/pygments/colorful.scss */ +.o { + color: #303030; +} + +/* line 13, ../../app/stylesheets/pygments/colorful.scss */ +.cm { + color: #808080; +} + +/* line 15, ../../app/stylesheets/pygments/colorful.scss */ +.cp { + color: #507090; +} + +/* line 17, ../../app/stylesheets/pygments/colorful.scss */ +.c1 { + color: #808080; +} + +/* line 19, ../../app/stylesheets/pygments/colorful.scss */ +.cs { + color: #cc0000; + font-weight: bold; +} + +/* line 22, ../../app/stylesheets/pygments/colorful.scss */ +.gd { + color: #a00000; +} + +/* line 24, ../../app/stylesheets/pygments/colorful.scss */ +.ge { + font-style: italic; +} + +/* line 26, ../../app/stylesheets/pygments/colorful.scss */ +.gr { + color: #ff0000; +} + +/* line 28, ../../app/stylesheets/pygments/colorful.scss */ +.gh { + color: #000080; + font-weight: bold; +} + +/* line 31, ../../app/stylesheets/pygments/colorful.scss */ +.gi { + color: #00a000; +} + +/* line 33, ../../app/stylesheets/pygments/colorful.scss */ +.go { + color: #808080; +} + +/* line 35, ../../app/stylesheets/pygments/colorful.scss */ +.gp { + color: #c65d09; + font-weight: bold; +} + +/* line 38, ../../app/stylesheets/pygments/colorful.scss */ +.gs { + font-weight: bold; +} + +/* line 40, ../../app/stylesheets/pygments/colorful.scss */ +.gu { + color: #800080; + font-weight: bold; +} + +/* line 43, ../../app/stylesheets/pygments/colorful.scss */ +.gt { + color: #0040d0; +} + +/* line 45, ../../app/stylesheets/pygments/colorful.scss */ +.kc, +.kd, +.kn { + color: #008000; + font-weight: bold; +} + +/* line 48, ../../app/stylesheets/pygments/colorful.scss */ +.kp { + color: #003080; + font-weight: bold; +} + +/* line 51, ../../app/stylesheets/pygments/colorful.scss */ +.kr { + color: #008000; + font-weight: bold; +} + +/* line 54, ../../app/stylesheets/pygments/colorful.scss */ +.kt { + color: #303090; + font-weight: bold; +} + +/* line 57, ../../app/stylesheets/pygments/colorful.scss */ +.m { + color: #6000e0; + font-weight: bold; +} + +/* line 60, ../../app/stylesheets/pygments/colorful.scss */ +.s { + background-color: #fff0f0; +} + +/* line 62, ../../app/stylesheets/pygments/colorful.scss */ +.na { + color: #0000c0; +} + +/* line 64, ../../app/stylesheets/pygments/colorful.scss */ +.nb { + color: #007020; +} + +/* line 66, ../../app/stylesheets/pygments/colorful.scss */ +.nc { + color: #b00060; + font-weight: bold; +} + +/* line 69, ../../app/stylesheets/pygments/colorful.scss */ +.no { + color: #003060; + font-weight: bold; +} + +/* line 72, ../../app/stylesheets/pygments/colorful.scss */ +.nd { + color: #505050; + font-weight: bold; +} + +/* line 75, ../../app/stylesheets/pygments/colorful.scss */ +.ni { + color: #800000; + font-weight: bold; +} + +/* line 78, ../../app/stylesheets/pygments/colorful.scss */ +.ne { + color: #f00000; + font-weight: bold; +} + +/* line 81, ../../app/stylesheets/pygments/colorful.scss */ +.nf { + color: #0060b0; + font-weight: bold; +} + +/* line 84, ../../app/stylesheets/pygments/colorful.scss */ +.nl { + color: #907000; + font-weight: bold; +} + +/* line 87, ../../app/stylesheets/pygments/colorful.scss */ +.nn { + color: #0e84b5; + font-weight: bold; +} + +/* line 90, ../../app/stylesheets/pygments/colorful.scss */ +.nt { + color: #007000; +} + +/* line 92, ../../app/stylesheets/pygments/colorful.scss */ +.nv { + color: #906030; +} + +/* line 94, ../../app/stylesheets/pygments/colorful.scss */ +.ow { + color: #000000; + font-weight: bold; +} + +/* line 97, ../../app/stylesheets/pygments/colorful.scss */ +.w { + color: #bbbbbb; +} + +/* line 99, ../../app/stylesheets/pygments/colorful.scss */ +.mf { + color: #6000e0; + font-weight: bold; +} + +/* line 102, ../../app/stylesheets/pygments/colorful.scss */ +.mh { + color: #005080; + font-weight: bold; +} + +/* line 105, ../../app/stylesheets/pygments/colorful.scss */ +.mi { + color: #0000d0; + font-weight: bold; +} + +/* line 108, ../../app/stylesheets/pygments/colorful.scss */ +.mo { + color: #4000e0; + font-weight: bold; +} + +/* line 111, ../../app/stylesheets/pygments/colorful.scss */ +.sb { + background-color: #fff0f0; +} + +/* line 113, ../../app/stylesheets/pygments/colorful.scss */ +.sc { + color: #0040d0; +} + +/* line 115, ../../app/stylesheets/pygments/colorful.scss */ +.sd { + color: #d04020; +} + +/* line 117, ../../app/stylesheets/pygments/colorful.scss */ +.s2 { + background-color: #fff0f0; +} + +/* line 119, ../../app/stylesheets/pygments/colorful.scss */ +.se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* line 123, ../../app/stylesheets/pygments/colorful.scss */ +.sh { + background-color: #fff0f0; +} + +/* line 125, ../../app/stylesheets/pygments/colorful.scss */ +.si { + background-color: #e0e0e0; +} + +/* line 127, ../../app/stylesheets/pygments/colorful.scss */ +.sx { + color: #d02000; + background-color: #fff0f0; +} + +/* line 130, ../../app/stylesheets/pygments/colorful.scss */ +.sr { + color: #000000; + background-color: #fff0ff; +} + +/* line 133, ../../app/stylesheets/pygments/colorful.scss */ +.s1 { + background-color: #fff0f0; +} + +/* line 135, ../../app/stylesheets/pygments/colorful.scss */ +.ss { + color: #a06000; +} + +/* line 137, ../../app/stylesheets/pygments/colorful.scss */ +.bp { + color: #007020; +} + +/* line 139, ../../app/stylesheets/pygments/colorful.scss */ +.vc { + color: #306090; +} + +/* line 141, ../../app/stylesheets/pygments/colorful.scss */ +.vg { + color: #d07000; + font-weight: bold; +} + +/* line 144, ../../app/stylesheets/pygments/colorful.scss */ +.vi { + color: #3030b0; +} + +/* line 146, ../../app/stylesheets/pygments/colorful.scss */ +.il { + color: #0000d0; + font-weight: bold; +} + +table#my_comments, +table#my_posts, +table#tracker { + border-collapse: collapse; + border: 2px solid black; +} + +table#my_comments tbody th, +table#my_posts tbody th, +table#tracker tbody th { + background: -moz-linear-gradient(#8090a0, #607080) #607080; + border: 1px solid #405070; + border-bottom: 2px solid black; + font-weight: bold; + color: white; +} + +table#my_comments tbody td, +table#my_posts tbody td, +table#tracker tbody td { + border: 1px solid #405070; + border-bottom-color: #607080; + background: white; +} + +table#my_comments a, +table#my_posts a, +table#tracker a { + color: black; + text-decoration: none; +} + +table#my_comments a:hover, +table#my_posts a:hover, +table#tracker a:hover { + text-decoration: underline; +} + +table#wiki_help { + background: -moz-linear-gradient(#8090a0, #607080) repeat scroll 0 0 #607080; +} + +table#wiki_help tbody tr td:first-child { + background: none; + border: 1px 0 0 1px solid black; + color: white; +} + +table#wiki_help tbody tr td { + background: white; + border-width: 4px 0 1px 0; + border-style: solid; + border-color: #c0c4c8; +} + +.misspelled { + color: inherit; + background-color: inherit; + border-bottom: 1px dashed red; +} +.pot_de_miel { + display: none; +} + +@import "../common/statistics"; diff --git a/test/fixtures/forums.yml b/test/fixtures/forums.yml new file mode 100644 index 000000000..b4b0ccf68 --- /dev/null +++ b/test/fixtures/forums.yml @@ -0,0 +1,9 @@ +one: + title: "Foo bar forum" + cached_slug: "foo-bar-forum" + position: 1 + +two: + title: "Foo bar forum 2" + cached_slug: "foo-bar-forum-2" + position: 2 diff --git a/test/fixtures/friend_sites.yml b/test/fixtures/friend_sites.yml new file mode 100644 index 000000000..4de055f17 --- /dev/null +++ b/test/fixtures/friend_sites.yml @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: friend_sites +# +# id :integer(4) not null, primary key +# title :string(255) +# url :string(255) +# position :integer(4) +# + +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + title: MyString + url: MyString + position: 1 + +two: + title: MyString + url: MyString + position: 2 diff --git a/test/fixtures/links.yml b/test/fixtures/links.yml new file mode 100644 index 000000000..e1b7a58f1 --- /dev/null +++ b/test/fixtures/links.yml @@ -0,0 +1,5 @@ +one: + news: news + title: Un joli lien + url: /links + lang: fr diff --git a/test/fixtures/news.yml b/test/fixtures/news.yml new file mode 100644 index 000000000..52c5978a5 --- /dev/null +++ b/test/fixtures/news.yml @@ -0,0 +1,38 @@ +news: + section: news + state: published + title: "The Lord of the Rings: The Fellowship of the Ring" + cached_slug: the-lord-of-the-rings-the-fellowship-of-the-ring + author_name: J.R.R. Tolkien + author_email: test@exemple.com + body: Une jolie nouvelle + second_part: En deuxième partie + moderator: moderator_1 + +draft: + section: news + state: draft + title: Une jolie actualité en cours d'écriture + cached_slug: une-jolie-actualite-en-cours-decriture + author_name: Auteur sympa + author_email: test@exemple.com + body: Nouvelle en brouillon + second_part: En deuxième partie + +candidate: + section: news + state: candidate + title: Une actualité en cours de soumission + cached_slug: une-actualite-en-cours-de-soumission + author_name: Auteur sympa + author_email: test@exemple.com + body: Nouvelle en soumission + second_part: En deuxième partie + +first_part_only: + section: news + state: draft + title: Une actualité avec une seule partie + cached_slug: une-actualite-avec-une-seule-partie + author_name: Auteur sympa + author_email: test@exemple.com diff --git a/test/fixtures/news_notifications/accept b/test/fixtures/news_notifications/accept new file mode 100644 index 000000000..8196add6a --- /dev/null +++ b/test/fixtures/news_notifications/accept @@ -0,0 +1,3 @@ +NewsNotifications#accept + +Find me in app/views/news_notifications/accept.erb diff --git a/test/fixtures/news_notifications/refuse b/test/fixtures/news_notifications/refuse new file mode 100644 index 000000000..891ac91ab --- /dev/null +++ b/test/fixtures/news_notifications/refuse @@ -0,0 +1,3 @@ +NewsNotifications#refuse + +Find me in app/views/news_notifications/refuse.erb diff --git a/test/fixtures/nodes.yml b/test/fixtures/nodes.yml index 75c7dbbc6..9085774bc 100644 --- a/test/fixtures/nodes.yml +++ b/test/fixtures/nodes.yml @@ -1,11 +1,108 @@ -diary_lorem_cc_licensed: +one: + user: visitor_1 + cc_licensed: true + content: one + content_type: Diary + created_at: <%= Time.now %> + +old: + user: visitor_1 cc_licensed: true + content: old + content_type: Diary + created_at: <%= 4.months.ago %> + +diary_lorem_cc_licensed: user: visitor_1 + cc_licensed: true content: lorem_cc_licensed - content_type: Journal + content_type: Diary diary_lorem_copyright: - cc_licensed: false user: visitor_2 + cc_licensed: false content: lorem_copyright - content_type: Journal + content_type: Diary + +tracker_one: + user: visitor_1 + cc_licensed: true + content: one + content_type: Tracker + +tracker_two: + user: visitor_1 + cc_licensed: true + content: two + content_type: Tracker + +forum: + user: visitor_1 + cc_licensed: true + content: one + content_type: Forum + +news: + user: moderator_1 + cc_licensed: true + content: news + content_type: News + +draft: + user: moderator_1 + cc_licensed: true + content: draft + content_type: News + +candidate: + user: moderator_1 + cc_licensed: true + content: candidate + content_type: News + +first_part_only: + user: moderator_1 + cc_licensed: true + content: first_part_only + content_type: News + +poll: + user: moderator_1 + cc_licensed: true + content: one + content_type: Poll + +poll_draft: + user: moderator_1 + cc_licensed: true + content: draft + content_type: Poll + +poll_collectif: + user: community + cc_licensed: true + content: collectif + content_type: Poll + +post: + user: moderator_1 + cc_licensed: true + content: one + content_type: Post + +wiki: + user: moderator_1 + cc_licensed: true + content: one + content_type: WikiPage + +homePage: + user: moderator_1 + cc_licensed: true + content: homePage + content_type: WikiPage + +bookmark: + user: visitor_0 + content: one + content_type: Bookmark diff --git a/test/fixtures/oauth_applications.yml b/test/fixtures/oauth_applications.yml new file mode 100644 index 000000000..0072c0a0b --- /dev/null +++ b/test/fixtures/oauth_applications.yml @@ -0,0 +1,8 @@ +one: + owner_id: 0 + owner_type: User + name: Test + uid: 12345 + secret: 12345 + redirect_uri: https://localhost:8080 + scopes: [read, write] diff --git a/test/fixtures/pages.yml b/test/fixtures/pages.yml new file mode 100644 index 000000000..b013189c2 --- /dev/null +++ b/test/fixtures/pages.yml @@ -0,0 +1,19 @@ +one: + title: Une jolie page + slug: jolie-page + body: Joe contenu de page + +equipe: + title: Notre équipe + slug: equipe + body: Le contenu de l'équipe + +amis: + title: Nos amis + slug: amis + body: Le contenu des amis + +moderation: + title: Règles de modération + slug: moderations + body: Le contenu des règles de modération diff --git a/test/fixtures/paragraphs.yml b/test/fixtures/paragraphs.yml new file mode 100644 index 000000000..1a880c4eb --- /dev/null +++ b/test/fixtures/paragraphs.yml @@ -0,0 +1,26 @@ +# == Schema Information +# +# Table name: paragraphs +# +# id :integer(4) not null, primary key +# news_id :integer(4) not null +# position :integer(4) +# second_part :boolean(1) +# locked_by :integer(4) +# body :text +# wiki_body :text +# + +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + news: news + position: 1 + second_part: false + body: MyText + +two: + news: news + position: 1 + second_part: false + body: MyText diff --git a/test/fixtures/poll_answers.yml b/test/fixtures/poll_answers.yml new file mode 100644 index 000000000..617851f7e --- /dev/null +++ b/test/fixtures/poll_answers.yml @@ -0,0 +1,4 @@ +one: + poll: one + answer: et hop + position: 0 diff --git a/test/fixtures/polls.yml b/test/fixtures/polls.yml new file mode 100644 index 000000000..896b02695 --- /dev/null +++ b/test/fixtures/polls.yml @@ -0,0 +1,14 @@ +one: + state: published + title: Un joli sondage + cached_slug: un-joli-sondage + +draft: + state: draft + title: Un sondage en cours d'édition + cached_slug: un-sondage-en-cours-dedition + +collectif: + state: published + title: collectif + cached_slug: collectif diff --git a/test/fixtures/posts.yml b/test/fixtures/posts.yml new file mode 100644 index 000000000..eb65ffd89 --- /dev/null +++ b/test/fixtures/posts.yml @@ -0,0 +1,4 @@ +one: + forum: one + title: Joli post de forum + cached_slug: joli-post-de-forum diff --git a/test/fixtures/responses.yml b/test/fixtures/responses.yml new file mode 100644 index 000000000..2957fad22 --- /dev/null +++ b/test/fixtures/responses.yml @@ -0,0 +1,18 @@ +# == Schema Information +# +# Table name: responses +# +# id :integer(4) not null, primary key +# title :string(255) not null +# content :text +# + +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + title: MyString + content: MyText + +two: + title: MyString + content: MyText diff --git a/test/fixtures/sections.yml b/test/fixtures/sections.yml index 648dfd57f..26e35612d 100644 --- a/test/fixtures/sections.yml +++ b/test/fixtures/sections.yml @@ -1,3 +1,7 @@ default: title: LinuxFr.org cached_slug: linuxfr-org + +news: + title: News + cached_slug: news diff --git a/test/fixtures/taggings.yml b/test/fixtures/taggings.yml new file mode 100644 index 000000000..6a31f6f70 --- /dev/null +++ b/test/fixtures/taggings.yml @@ -0,0 +1,4 @@ +one: + tag: one + node: one + user: visitor_0 diff --git a/test/fixtures/tags.yml b/test/fixtures/tags.yml new file mode 100644 index 000000000..472860afd --- /dev/null +++ b/test/fixtures/tags.yml @@ -0,0 +1,3 @@ +one: + name: test + taggings_count: 1 diff --git a/test/fixtures/trackers.yml b/test/fixtures/trackers.yml new file mode 100644 index 000000000..e79ec5831 --- /dev/null +++ b/test/fixtures/trackers.yml @@ -0,0 +1,11 @@ +one: + category: one + title: A nice tracker title + wiki_body: A nice tracker description + cached_slug: tracker_one + +two: + category: one + title: Another nice tracker title + wiki_body: Another nice tracker description + cached_slug: tracker_two diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index ef517563f..48bf15b30 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -40,3 +40,10 @@ admin_<%= n%>: name: <%= "admin_#{n}" %> cached_slug: <%= "admin_#{n}" %> <% end %> + +joe: + name: Joe + cached_slug: joe +bob: + name: Bob + cached_slug: bob diff --git a/test/fixtures/wiki_pages.yml b/test/fixtures/wiki_pages.yml new file mode 100644 index 000000000..e7a045a2b --- /dev/null +++ b/test/fixtures/wiki_pages.yml @@ -0,0 +1,7 @@ +one: + title: The Lord of the Rings + cached_slug: the-lord-of-the-rings + +homePage: + title: LinuxFr.org + cached_slug: home-page diff --git a/test/fixtures/wiki_versions.yml b/test/fixtures/wiki_versions.yml new file mode 100644 index 000000000..a4b9ec134 --- /dev/null +++ b/test/fixtures/wiki_versions.yml @@ -0,0 +1,26 @@ +# == Schema Information +# +# Table name: wiki_versions +# +# id :integer(4) not null, primary key +# wiki_page_id :integer(4) +# user_id :integer(4) +# version :integer(4) +# message :string(255) +# body :text +# created_at :datetime +# + +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + wiki_page: one + version: 1 + message: MyString + body: MyText + +two: + wiki_page: one + version: 1 + message: MyString + body: MyText diff --git a/test/helpers/account_helper_test.rb b/test/helpers/account_helper_test.rb new file mode 100644 index 000000000..eb01bf3e1 --- /dev/null +++ b/test/helpers/account_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class AccountHelperTest < ActionView::TestCase +end diff --git a/test/helpers/account_session_helper_test.rb b/test/helpers/account_session_helper_test.rb new file mode 100644 index 000000000..ec45e21c4 --- /dev/null +++ b/test/helpers/account_session_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class AccountSessionHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/accounts_helper_test.rb b/test/helpers/admin/accounts_helper_test.rb new file mode 100644 index 000000000..cfac5d3e7 --- /dev/null +++ b/test/helpers/admin/accounts_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::AccountsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/banners_helper_test.rb b/test/helpers/admin/banners_helper_test.rb new file mode 100644 index 000000000..01c89668b --- /dev/null +++ b/test/helpers/admin/banners_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::BannersHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/forums_helper_test.rb b/test/helpers/admin/forums_helper_test.rb new file mode 100644 index 000000000..07d68dd9b --- /dev/null +++ b/test/helpers/admin/forums_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::ForumsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/logos_helper_test.rb b/test/helpers/admin/logos_helper_test.rb new file mode 100644 index 000000000..94cb4ad63 --- /dev/null +++ b/test/helpers/admin/logos_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::LogosHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/responses_helper_test.rb b/test/helpers/admin/responses_helper_test.rb new file mode 100644 index 000000000..f3e798da6 --- /dev/null +++ b/test/helpers/admin/responses_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::ResponsesHelperTest < ActionView::TestCase +end diff --git a/test/helpers/admin/sections_helper_test.rb b/test/helpers/admin/sections_helper_test.rb new file mode 100644 index 000000000..84de0dda2 --- /dev/null +++ b/test/helpers/admin/sections_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Admin::SectionsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/boards_helper_test.rb b/test/helpers/boards_helper_test.rb new file mode 100644 index 000000000..283b2671b --- /dev/null +++ b/test/helpers/boards_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class BoardsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/comments_helper_test.rb b/test/helpers/comments_helper_test.rb new file mode 100644 index 000000000..b623af28d --- /dev/null +++ b/test/helpers/comments_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class CommentsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/dashboard_helper_test.rb b/test/helpers/dashboard_helper_test.rb new file mode 100644 index 000000000..f8ef9aeca --- /dev/null +++ b/test/helpers/dashboard_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class DashboardHelperTest < ActionView::TestCase +end diff --git a/test/helpers/diaries_helper_test.rb b/test/helpers/diaries_helper_test.rb new file mode 100644 index 000000000..ffdac8460 --- /dev/null +++ b/test/helpers/diaries_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class DiariesHelperTest < ActionView::TestCase +end diff --git a/test/helpers/form_helper_test.rb b/test/helpers/form_helper_test.rb new file mode 100644 index 000000000..22898119d --- /dev/null +++ b/test/helpers/form_helper_test.rb @@ -0,0 +1,10 @@ +require "test_helper" + +class FormHelperTest < ActionView::TestCase + test "should display errors" do + news = News.new + news.valid? + + assert_match(/

/, messages_on_error(news)) + end +end diff --git a/test/helpers/forums_helper_test.rb b/test/helpers/forums_helper_test.rb new file mode 100644 index 000000000..47741eeab --- /dev/null +++ b/test/helpers/forums_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class ForumsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/home_helper_test.rb b/test/helpers/home_helper_test.rb new file mode 100644 index 000000000..41b8cf4b4 --- /dev/null +++ b/test/helpers/home_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class HomeHelperTest < ActionView::TestCase +end diff --git a/test/helpers/interviews_helper_test.rb b/test/helpers/interviews_helper_test.rb new file mode 100644 index 000000000..edc896996 --- /dev/null +++ b/test/helpers/interviews_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class InterviewsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/links_helper_test.rb b/test/helpers/links_helper_test.rb new file mode 100644 index 000000000..893bfd4c4 --- /dev/null +++ b/test/helpers/links_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class LinksHelperTest < ActionView::TestCase +end diff --git a/test/helpers/moderation/interviews_helper_test.rb b/test/helpers/moderation/interviews_helper_test.rb new file mode 100644 index 000000000..9df58bad4 --- /dev/null +++ b/test/helpers/moderation/interviews_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Moderation::InterviewsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/moderation/news_helper_test.rb b/test/helpers/moderation/news_helper_test.rb new file mode 100644 index 000000000..23d42ccc2 --- /dev/null +++ b/test/helpers/moderation/news_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Moderation::NewsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/moderation/polls_helper_test.rb b/test/helpers/moderation/polls_helper_test.rb new file mode 100644 index 000000000..663cfad87 --- /dev/null +++ b/test/helpers/moderation/polls_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Moderation::PollHelperTest < ActionView::TestCase +end diff --git a/test/helpers/moderation_helper_test.rb b/test/helpers/moderation_helper_test.rb new file mode 100644 index 000000000..cc8db177f --- /dev/null +++ b/test/helpers/moderation_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class ModerationHelperTest < ActionView::TestCase +end diff --git a/test/helpers/news_helper_test.rb b/test/helpers/news_helper_test.rb new file mode 100644 index 000000000..9f1114986 --- /dev/null +++ b/test/helpers/news_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class NewsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/polls_helper_test.rb b/test/helpers/polls_helper_test.rb new file mode 100644 index 000000000..500b767e3 --- /dev/null +++ b/test/helpers/polls_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class PollsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/posts_helper_test.rb b/test/helpers/posts_helper_test.rb new file mode 100644 index 000000000..486b3808d --- /dev/null +++ b/test/helpers/posts_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class PostsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/redaction/news_helper_test.rb b/test/helpers/redaction/news_helper_test.rb new file mode 100644 index 000000000..42850f7d8 --- /dev/null +++ b/test/helpers/redaction/news_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class Redaction::NewsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/redaction_helper_test.rb b/test/helpers/redaction_helper_test.rb new file mode 100644 index 000000000..a18619d57 --- /dev/null +++ b/test/helpers/redaction_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class RedactionHelperTest < ActionView::TestCase +end diff --git a/test/helpers/relevances_helper_test.rb b/test/helpers/relevances_helper_test.rb new file mode 100644 index 000000000..42608f21c --- /dev/null +++ b/test/helpers/relevances_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class RelevancesHelperTest < ActionView::TestCase +end diff --git a/test/helpers/search_helper_test.rb b/test/helpers/search_helper_test.rb new file mode 100644 index 000000000..e7877ba20 --- /dev/null +++ b/test/helpers/search_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class SearchHelperTest < ActionView::TestCase +end diff --git a/test/helpers/sections_helper_test.rb b/test/helpers/sections_helper_test.rb new file mode 100644 index 000000000..bb68c231a --- /dev/null +++ b/test/helpers/sections_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class SectionsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/static_helper_test.rb b/test/helpers/static_helper_test.rb new file mode 100644 index 000000000..e0626e35a --- /dev/null +++ b/test/helpers/static_helper_test.rb @@ -0,0 +1,37 @@ +require "test_helper" + +class StaticHelperTest < ActionView::TestCase + include UsersHelper + + def current_account + accounts "visitor_0" + end + + test "should helperify" do + assert_match "admin_0", helperify("{{admin_list}}") + end + + test "should return admin list" do + assert_match "admin_0", helper_admin_list + end + + test "should return editor list" do + assert_match "editor_0", helper_editor_list + end + + test "should return moderator list" do + assert_match "moderator_0", helper_moderator_list + end + + test "should return maintainer list" do + assert_match "maintainer_0", helper_maintainer_list + end + + test "should return friend sites list" do + assert_match "people-list", helper_friend_sites_list + end + + test "should return responses list" do + assert_match "MyText", helper_responses_list + end +end diff --git a/test/helpers/tags_helper_test.rb b/test/helpers/tags_helper_test.rb new file mode 100644 index 000000000..ee2c1e230 --- /dev/null +++ b/test/helpers/tags_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class TagsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/trackers_helper_test.rb b/test/helpers/trackers_helper_test.rb new file mode 100644 index 000000000..72344bcb7 --- /dev/null +++ b/test/helpers/trackers_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class TrackersHelperTest < ActionView::TestCase +end diff --git a/test/helpers/users_helper_test.rb b/test/helpers/users_helper_test.rb new file mode 100644 index 000000000..774d33fe3 --- /dev/null +++ b/test/helpers/users_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class UsersHelperTest < ActionView::TestCase +end diff --git a/test/helpers/votes_helper_test.rb b/test/helpers/votes_helper_test.rb new file mode 100644 index 000000000..b9126b583 --- /dev/null +++ b/test/helpers/votes_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class VotesHelperTest < ActionView::TestCase +end diff --git a/test/helpers/wiki_pages_helper_test.rb b/test/helpers/wiki_pages_helper_test.rb new file mode 100644 index 000000000..a81afc6cf --- /dev/null +++ b/test/helpers/wiki_pages_helper_test.rb @@ -0,0 +1,4 @@ +require "test_helper" + +class WikiPagesHelperTest < ActionView::TestCase +end diff --git a/test/mailers/news_notifications_test.rb b/test/mailers/news_notifications_test.rb new file mode 100644 index 000000000..d9a79ca23 --- /dev/null +++ b/test/mailers/news_notifications_test.rb @@ -0,0 +1,47 @@ +require "test_helper" + +class NewsNotificationsTest < ActionMailer::TestCase + test "should send accept notification" do + mail = NewsNotifications.accept news(:news) + + assert_match(/Dépêche acceptée/, mail.subject) + assert_match(/a été acceptée/, mail.body.encoded) + end + + test "should send refuse notification" do + mail = NewsNotifications.refuse news(:news), "hello world" + + assert_match(/Dépêche refusée/, mail.subject) + assert_match(/hello world/, mail.body.encoded) + end + + test "should send refuse notification with message" do + mail = NewsNotifications.refuse_with_message news(:news), "hello world", responses(:one).id + + assert_match(/Dépêche refusée/, mail.subject) + assert_match(/hello world/, mail.body.encoded) + + mail = NewsNotifications.refuse_with_message news(:news), "hello world", nil + + assert_match(/Dépêche refusée/, mail.subject) + assert_match(/hello world/, mail.body.encoded) + + mail = NewsNotifications.refuse_with_message news(:news), "en", nil + + assert_match(/Rejected news/, mail.subject) + end + + test "should send rewrite notification" do + mail = NewsNotifications.rewrite news(:news) + + assert_match(/Dépêche renvoyée/, mail.subject) + assert_match(/a été renvoyée/, mail.body.encoded) + end + + test "should send followup notification" do + mail = NewsNotifications.followup news(:news), "hello world" + + assert_match(/Relance/, mail.subject) + assert_match(/hello world/, mail.body.encoded) + end +end diff --git a/test/mailers/previews/news_notifications_preview.rb b/test/mailers/previews/news_notifications_preview.rb new file mode 100644 index 000000000..3440486c0 --- /dev/null +++ b/test/mailers/previews/news_notifications_preview.rb @@ -0,0 +1,12 @@ +# Preview all emails at http://localhost:3000/rails/mailers/news_notifications +class NewsNotificationsPreview < ActionMailer::Preview + # Preview this email at http://localhost:3000/rails/mailers/news_notifications/accept + def accept + NewsNotifications.accept News.first + end + + # Preview this email at http://localhost:3000/rails/mailers/news_notifications/refuse + def refuse + NewsNotifications.refuse News.first, "hello world" + end +end diff --git a/test/models/account_test.rb b/test/models/account_test.rb new file mode 100644 index 000000000..9e8edc4f2 --- /dev/null +++ b/test/models/account_test.rb @@ -0,0 +1,82 @@ +require "test_helper" + +class AccountTest < ActiveSupport::TestCase + def test_should_create_account + assert_difference "Account.count" do + account = new_account + + assert account.save, account.errors.full_messages.to_sentence + end + end + + test "should get anonymous account" do + assert Account.anonymous + assert_equal "Anonyme", Account.anonymous.login + end + + def test_should_require_login + assert_no_difference "Account.count" do + account = new_account(login: nil) + + assert_not account.save, account.errors.full_messages.to_sentence + end + end + + def test_should_require_email + assert_no_difference "Account.count" do + account = new_account(email: nil) + + assert_not account.save, account.errors.full_messages.to_sentence + end + end + + test "should display role" do + assert_equal "visiteur", accounts("visitor_0").display_role(false) + assert_equal "mainteneur", accounts("maintainer_0").display_role(false) + assert_equal "animateur", accounts("editor_0").display_role(false) + assert_equal "modérateur", accounts("moderator_0").display_role(false) + assert_equal "admin", accounts("admin_0").display_role(false) + assert_equal "compte fermé", accounts(:anonymous).display_role(false) + end + + test "should display last seen on" do + assert_equal "jamais", accounts(:anonymous).display_last_seen_on + assert_equal "dans les 30 derniers jours", accounts("visitor_0").display_last_seen_on + assert_equal "il y a moins d’un an", accounts("visitor_negative_karma").display_last_seen_on + end + + test "should display inactive message" do + assert_equal :closed, accounts(:anonymous).inactive_message + assert_equal :inactive, accounts("visitor_0").inactive_message + end + + test "should be able to block" do + assert_not accounts("visitor_0").can_block? + assert_not accounts("editor_0").can_block? + assert_predicate accounts("moderator_0"), :can_block? + assert_predicate accounts("admin_0"), :can_block? + end + + test "should be able to plonk" do + assert_not accounts("visitor_0").can_plonk? + assert_not accounts("editor_0").can_plonk? + assert_predicate accounts("moderator_0"), :can_plonk? + assert_predicate accounts("admin_0"), :can_plonk? + end + + def test_should_delete_account + assert accounts(:joe).delete + end + + protected + + def new_account(options = {}) + Account.new( + { login: "quire", + email: "quire@example.com", + password: "quire69", + password_confirmation: "quire69" } + .merge(options) + ) + end +end diff --git a/test/models/banner_test.rb b/test/models/banner_test.rb new file mode 100644 index 000000000..2c6e132a3 --- /dev/null +++ b/test/models/banner_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +# == Schema Information +# +# Table name: banners +# +# id :integer(4) not null, primary key +# title :string(255) +# content :text +# +class BannerTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/board_test.rb b/test/models/board_test.rb new file mode 100644 index 000000000..b91c92aef --- /dev/null +++ b/test/models/board_test.rb @@ -0,0 +1,21 @@ +require "test_helper" + +# == Schema Information +# +# Table name: boards +# +# id :integer(4) not null, primary key +# user_agent :string(255) +# type :string(255) default("chat"), not null +# user_id :integer(4) +# object_id :integer(4) +# object_type :string(255) +# message :text +# created_at :datetime +# +class BoardTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 000000000..87614ea7b --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,17 @@ +require "test_helper" + +# == Schema Information +# +# Table name: categories +# +# id :integer(4) not null, primary key +# title :string(255) not null +# created_at :datetime +# updated_at :datetime +# +class CategoryTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/comment_test.rb b/test/models/comment_test.rb new file mode 100644 index 000000000..835b81163 --- /dev/null +++ b/test/models/comment_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +# == Schema Information +# +# Table name: comments +# +# id :integer(4) not null, primary key +# node_id :integer(4) +# user_id :integer(4) +# state :string(255) default("published"), not null +# title :string(255) +# body :text +# wiki_body :text +# score :integer(4) default(0) +# answered_to_self :boolean(1) default(FALSE) +# materialized_path :string(1022) +# created_at :datetime +# updated_at :datetime +# +class CommentTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/content_test.rb b/test/models/content_test.rb new file mode 100644 index 000000000..64c7bd8ec --- /dev/null +++ b/test/models/content_test.rb @@ -0,0 +1,33 @@ +require "test_helper" + +class ContentTest < ActiveSupport::TestCase + test "should not create naked content" do + assert_raises NotImplementedError do + Content.create + end + end + + test "should get label for expand" do + assert_equal "Lire la suite", Poll.first.label_for_expand + end + + test "should get alternative formats" do + assert Poll.first.alternative_formats + assert_not Bookmark.first.alternative_formats + end + + test "should get lastmod" do + assert_equal polls(:one).updated_at, polls(:one).lastmod + end + + test "should get changefreq" do + assert_equal "hourly", polls(:one).changefreq + polls(:draft).created_at = 2.days.ago + + assert_equal "daily", polls(:draft).changefreq + polls(:draft).created_at = 4.days.ago + + assert_equal "monthly", polls(:draft).changefreq + assert_equal "yearly", diaries(:old).changefreq + end +end diff --git a/test/models/diary_test.rb b/test/models/diary_test.rb index 0c0f3460b..23bc90024 100644 --- a/test/models/diary_test.rb +++ b/test/models/diary_test.rb @@ -1,69 +1,87 @@ -# encoding: utf-8 -require 'test_helper' +require "test_helper" +# == Schema Information +# +# Table name: diaries +# +# id :integer(4) not null, primary key +# state :string(255) default("published"), not null +# title :string(255) +# cached_slug :string(255) +# owner_id :integer(4) +# body :text +# wiki_body :text +# created_at :datetime +# updated_at :datetime +# class DiaryTest < ActiveSupport::TestCase test "user with positive karma can create diary" do - diary = diaries(:lorem_cc_licensed).dup; - assert diary.creatable_by?(diary.owner.account); - assert diary.save(); + diary = diaries(:lorem_cc_licensed).dup + + assert diary.creatable_by?(diary.owner.account) + assert diary.save end test "user with zero karma cannot create diary" do - diary = diaries(:lorem_cc_licensed).dup; - diary.owner = users(:visitor_zero_karma); - assert_not diary.creatable_by?(diary.owner.account); - assert diary.save(), "Diary model were not saved"; + diary = diaries(:lorem_cc_licensed).dup + diary.owner = users(:visitor_zero_karma) + + assert_not diary.creatable_by?(diary.owner.account) + assert diary.save, "Diary model were not saved" end test "user with negative karma cannot create diary" do - diary = diaries(:lorem_cc_licensed).dup; - diary.owner = users(:visitor_negative_karma); - assert_not diary.creatable_by?(diary.owner.account); - assert diary.save(), "Diary model were not saved"; + diary = diaries(:lorem_cc_licensed).dup + diary.owner = users(:visitor_negative_karma) + + assert_not diary.creatable_by?(diary.owner.account) + assert diary.save, "Diary model were not saved" end test "only admin and moderator can update a diary" do - diary = diaries(:lorem_cc_licensed); - assert_not diary.updatable_by?(accounts(:visitor_1)); - assert_not diary.updatable_by?(accounts(:maintainer_1)); - assert diary.updatable_by?(accounts(:moderator_1)); - assert diary.updatable_by?(accounts(:admin_1)); + diary = diaries(:lorem_cc_licensed) + + assert_not diary.updatable_by?(accounts("visitor_1")) + assert_not diary.updatable_by?(accounts("maintainer_1")) + assert diary.updatable_by?(accounts("moderator_1")) + assert diary.updatable_by?(accounts("admin_1")) end test "only admin and moderator can destroy a diary" do - diary = diaries(:lorem_cc_licensed); - assert_not diary.destroyable_by?(accounts(:visitor_1)); - assert_not diary.destroyable_by?(accounts(:maintainer_1)); - assert diary.destroyable_by?(accounts(:moderator_1)); - assert diary.destroyable_by?(accounts(:admin_1)); + diary = diaries(:lorem_cc_licensed) + + assert_not diary.destroyable_by?(accounts("visitor_1")) + assert_not diary.destroyable_by?(accounts("maintainer_1")) + assert diary.destroyable_by?(accounts("moderator_1")) + assert diary.destroyable_by?(accounts("admin_1")) end test "convert cc_licensed diary to news in redaction space" do - diary = diaries(:lorem_cc_licensed); - diary.node = nodes(:diary_lorem_cc_licensed); - created_news = diary.convert(); + diary = diaries(:lorem_cc_licensed) + diary.node = nodes(:diary_lorem_cc_licensed) + created_news = diary.convert # Retrieve News from database to ensure it were saved correctly - news = News.find(created_news.id); + news = News.find(created_news.id) # Ensure convert work - assert_equal diary.title, news.title; - assert_equal "**TODO** insérer une synthèse du journal", news.versions.first().body; - assert_equal diary.wiki_body, news.versions.first().second_part; - assert_equal diary.owner.try(:name), news.author_name; - assert_equal diary.owner.try(:account).try(:email), news.author_email; - assert_equal diary.node.cc_licensed, news.node.cc_licensed; - assert news.node.cc_licensed; - assert_equal sections(:default).id, news.section_id; + assert_equal diary.title, news.title + assert_equal "**TODO** insérer une synthèse du journal", news.versions.first.body + assert_equal diary.wiki_body, news.versions.first.second_part + assert_equal diary.owner.try(:name), news.author_name + assert_equal diary.owner.try(:account).try(:email), news.author_email + assert_equal diary.node.cc_licensed, news.node.cc_licensed + assert news.node.cc_licensed + assert_equal sections(:default).id, news.section_id # As diary is cc_licensed, news can be reworked collectively in the redaction space - assert_equal "draft", news.state; + assert_equal "draft", news.state end test "cannot convert non CC licensed diary to news" do - diary = diaries(:lorem_copyright); - diary.node = nodes(:diary_lorem_copyright); + diary = diaries(:lorem_copyright) + diary.node = nodes(:diary_lorem_copyright) assert_raises(ActiveRecord::RecordInvalid) do diary.convert end - assert_equal diary.errors.details[:base].first[:error], :cannot_convert + assert_equal :cannot_convert, diary.errors.details[:base].first[:error] assert diary.invalid?(:convert) end end diff --git a/test/models/dictionary_test.rb b/test/models/dictionary_test.rb new file mode 100644 index 000000000..5a5a044ad --- /dev/null +++ b/test/models/dictionary_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +# == Schema Information +# +# Table name: dictionaries +# +# id :integer(4) not null, primary key +# key :string(16) not null +# value :string(1024) +# +class DictionaryTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/forum_test.rb b/test/models/forum_test.rb new file mode 100644 index 000000000..d149b14b8 --- /dev/null +++ b/test/models/forum_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +# == Schema Information +# +# Table name: forums +# +# id :integer(4) not null, primary key +# state :string(255) default("active"), not null +# title :string(255) +# cached_slug :string(255) +# position :integer(4) +# created_at :datetime +# updated_at :datetime +# +class ForumTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/friend_site_test.rb b/test/models/friend_site_test.rb new file mode 100644 index 000000000..24cece701 --- /dev/null +++ b/test/models/friend_site_test.rb @@ -0,0 +1,17 @@ +require "test_helper" + +# == Schema Information +# +# Table name: friend_sites +# +# id :integer(4) not null, primary key +# title :string(255) +# url :string(255) +# position :integer(4) +# +class FriendSiteTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/lang_test.rb b/test/models/lang_test.rb new file mode 100644 index 000000000..afa271411 --- /dev/null +++ b/test/models/lang_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +class LangTest < ActiveSupport::TestCase + setup do + Redis.new.del "lang" + Redis.new.del "lang/fr" + end + + test "should have no language" do + assert_empty Lang.all + end + + test "should add one language" do + Lang["fr"] = "Français" + + assert_not_empty Lang.all + assert_equal 1, Lang.all.size + end +end diff --git a/test/models/link_test.rb b/test/models/link_test.rb new file mode 100644 index 000000000..8fc36db8d --- /dev/null +++ b/test/models/link_test.rb @@ -0,0 +1,27 @@ +require "test_helper" + +# == Schema Information +# +# Table name: links +# +# id :integer(4) not null, primary key +# news_id :integer(4) not null +# title :string(255) +# url :string(255) +# lang :string(255) +# nb_clicks :integer(4) default(0) +# locked_by :integer(4) +# created_at :datetime +# updated_at :datetime +# +class LinkTest < ActiveSupport::TestCase + test "add http:// before a link if it's not the case" do + @link = Link.new + @link.url = "www.yahoo.fr" + + assert_equal "http://www.yahoo.fr", @link.url + @link.url = "http://www.elysee.fr" + + assert_equal "http://www.elysee.fr", @link.url + end +end diff --git a/test/models/news_test.rb b/test/models/news_test.rb new file mode 100644 index 000000000..c46cf7234 --- /dev/null +++ b/test/models/news_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +# == Schema Information +# +# Table name: news +# +# id :integer(4) not null, primary key +# state :string(255) default("draft"), not null +# title :string(255) +# cached_slug :string(255) +# body :text +# second_part :text +# moderator_id :integer(4) +# section_id :integer(4) +# author_name :string(255) default("anonymous"), not null +# author_email :string(255) default("anonymous@dlfp.org"), not null +# created_at :datetime +# updated_at :datetime +# +class NewsTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/node_test.rb b/test/models/node_test.rb new file mode 100644 index 000000000..d7875643c --- /dev/null +++ b/test/models/node_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +# == Schema Information +# +# Table name: nodes +# +# id :integer(4) not null, primary key +# content_id :integer(4) +# content_type :string(255) +# score :integer(4) default(0) +# interest :integer(4) default(0) +# user_id :integer(4) +# public :boolean(1) default(TRUE) +# cc_licensed :boolean(1) default(FALSE) +# comments_count :integer(4) default(0) +# last_commented_at :datetime +# created_at :datetime +# updated_at :datetime +# +class NodeTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/paragraph_test.rb b/test/models/paragraph_test.rb new file mode 100644 index 000000000..fda5b2078 --- /dev/null +++ b/test/models/paragraph_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +# == Schema Information +# +# Table name: paragraphs +# +# id :integer(4) not null, primary key +# news_id :integer(4) not null +# position :integer(4) +# second_part :boolean(1) +# locked_by :integer(4) +# body :text +# wiki_body :text +# +class ParagraphTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/poll_answer_test.rb b/test/models/poll_answer_test.rb new file mode 100644 index 000000000..082016169 --- /dev/null +++ b/test/models/poll_answer_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +# == Schema Information +# +# Table name: poll_answers +# +# id :integer(4) not null, primary key +# poll_id :integer(4) +# answer :string(255) +# votes :integer(4) default(0), not null +# position :integer(4) +# created_at :datetime +# updated_at :datetime +# +class PollAnswerTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/poll_ip_test.rb b/test/models/poll_ip_test.rb new file mode 100644 index 000000000..89fe0766e --- /dev/null +++ b/test/models/poll_ip_test.rb @@ -0,0 +1,15 @@ +require "test_helper" + +# == Schema Information +# +# Table name: poll_ips +# +# id :integer(4) not null, primary key +# ip :integer(4) not null +# +class PollIpTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/poll_test.rb b/test/models/poll_test.rb new file mode 100644 index 000000000..24d27d10a --- /dev/null +++ b/test/models/poll_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +# == Schema Information +# +# Table name: polls +# +# id :integer(4) not null, primary key +# state :string(255) default("draft"), not null +# title :string(255) +# cached_slug :string(255) +# created_at :datetime +# updated_at :datetime +# +class PollTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/post_test.rb b/test/models/post_test.rb new file mode 100644 index 000000000..7962fe6ac --- /dev/null +++ b/test/models/post_test.rb @@ -0,0 +1,22 @@ +require "test_helper" + +# == Schema Information +# +# Table name: posts +# +# id :integer(4) not null, primary key +# state :string(255) default("published"), not null +# title :string(255) +# cached_slug :string(255) +# body :text +# wiki_body :text +# forum_id :integer(4) +# created_at :datetime +# updated_at :datetime +# +class PostTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/reading_test.rb b/test/models/reading_test.rb new file mode 100644 index 000000000..c90e31b86 --- /dev/null +++ b/test/models/reading_test.rb @@ -0,0 +1,17 @@ +require "test_helper" + +# == Schema Information +# +# Table name: readings +# +# id :integer(4) not null, primary key +# user_id :integer(4) +# node_id :integer(4) +# updated_at :datetime +# +class ReadingTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/relevance_test.rb b/test/models/relevance_test.rb new file mode 100644 index 000000000..be82cca18 --- /dev/null +++ b/test/models/relevance_test.rb @@ -0,0 +1,18 @@ +require "test_helper" + +# == Schema Information +# +# Table name: relevances +# +# id :integer(4) not null, primary key +# user_id :integer(4) +# comment_id :integer(4) +# vote :boolean(1) +# created_at :datetime +# +class RelevanceTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/response_test.rb b/test/models/response_test.rb new file mode 100644 index 000000000..86a4c76f9 --- /dev/null +++ b/test/models/response_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +# == Schema Information +# +# Table name: responses +# +# id :integer(4) not null, primary key +# title :string(255) not null +# content :text +# +class ResponseTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/section_test.rb b/test/models/section_test.rb new file mode 100644 index 000000000..578bcd823 --- /dev/null +++ b/test/models/section_test.rb @@ -0,0 +1,23 @@ +require "test_helper" + +# == Schema Information +# +# Table name: sections +# +# id :integer(4) not null, primary key +# state :string(255) default("published"), not null +# title :string(255) +# cached_slug :string(255) +# image_file_name :string(255) +# image_content_type :string(255) +# image_file_size :integer(4) +# image_updated_at :datetime +# created_at :datetime +# updated_at :datetime +# +class SectionTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/tag_test.rb b/test/models/tag_test.rb new file mode 100644 index 000000000..c205e2fc5 --- /dev/null +++ b/test/models/tag_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +# == Schema Information +# +# Table name: tags +# +# id :integer(4) not null, primary key +# name :string(255) +# taggings_count :integer(4) default(0), not null +# +class TagTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/tagging_test.rb b/test/models/tagging_test.rb new file mode 100644 index 000000000..cc9ebfa71 --- /dev/null +++ b/test/models/tagging_test.rb @@ -0,0 +1,18 @@ +require "test_helper" + +# == Schema Information +# +# Table name: taggings +# +# id :integer(4) not null, primary key +# tag_id :integer(4) +# node_id :integer(4) +# user_id :integer(4) +# created_at :datetime +# +class TaggingTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/tracker_test.rb b/test/models/tracker_test.rb new file mode 100644 index 000000000..b3a7ed8c0 --- /dev/null +++ b/test/models/tracker_test.rb @@ -0,0 +1,23 @@ +require "test_helper" + +# == Schema Information +# +# Table name: trackers +# +# id :integer(4) not null, primary key +# state :string(255) default("open"), not null +# title :string(255) +# cached_slug :string(255) +# body :text +# wiki_body :text +# category_id :integer(4) +# assigned_to_user_id :integer(4) +# created_at :datetime +# updated_at :datetime +# +class TrackerTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 000000000..4d4f86398 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,8 @@ +require "test_helper" + +class UserTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb new file mode 100644 index 000000000..73335d24e --- /dev/null +++ b/test/models/vote_test.rb @@ -0,0 +1,56 @@ +require "test_helper" + +# == Schema Information +# +# Table name: votes +# +# id :integer(4) not null, primary key +# user_id :integer(4) +# node_id :integer(4) +# vote :boolean(1) +# created_at :datetime +# +class VoteTest < ActiveSupport::TestCase + def setup + @node = nodes(:diary_lorem_cc_licensed) + @account = accounts(:joe) + + # Reset redis related data + Redis.new.del "nodes/#{@node.id}/votes/#{@account.id}" + Redis.new.del "nodes/#{@node.id}/votes/#{accounts(:bob).id}" + end + + test "A node has a score of 0 by default" do + assert_equal 0, @node.score + end + + test "A user can vote" do + assert_difference "@node.score" do + @node.vote_for @account + @node.reload + end + end + + test "A user change its vote" do + assert_difference "@node.score", -1 do + @node.vote_for @account + @node.vote_against @account + @node.reload + end + end + + test "A user vote twice" do + assert_difference "@node.score" do + @node.vote_for @account + @node.reload + end + end + + test "Two users can vote on the same node" do + assert_difference "@node.score", 2 do + @node.vote_for accounts(:bob) + @node.vote_for @account + @node.reload + end + end +end diff --git a/test/models/wiki_page_test.rb b/test/models/wiki_page_test.rb new file mode 100644 index 000000000..a67834fb2 --- /dev/null +++ b/test/models/wiki_page_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +# == Schema Information +# +# Table name: wiki_pages +# +# id :integer(4) not null, primary key +# state :string(255) default("public"), not null +# title :string(255) +# cached_slug :string(255) +# body :text +# created_at :datetime +# updated_at :datetime +# +class WikiPageTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/models/wiki_version_test.rb b/test/models/wiki_version_test.rb new file mode 100644 index 000000000..0de59f0d1 --- /dev/null +++ b/test/models/wiki_version_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +# == Schema Information +# +# Table name: wiki_versions +# +# id :integer(4) not null, primary key +# wiki_page_id :integer(4) +# user_id :integer(4) +# version :integer(4) +# message :string(255) +# body :text +# created_at :datetime +# +class WikiVersionTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 3ab84e3d1..f17287425 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,19 @@ -ENV['RAILS_ENV'] ||= 'test' -require_relative '../config/environment' -require 'rails/test_help' +require "simplecov" + +SimpleCov.start do + add_group "Controllers", "app/controllers" + add_group "Helpers", "app/helpers" + add_group "Mailers", "app/mailers" + add_group "Models", "app/models" + add_group "Long files" do |src_file| + src_file.lines.count > 100 + end + load_profile "test_frameworks" +end + +ENV["RAILS_ENV"] ||= "test" +require_relative "../config/environment" +require "rails/test_help" class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. diff --git a/vendor/assets/images/feather-icons/dist/icons/activity.svg b/vendor/assets/images/feather-icons/dist/icons/activity.svg new file mode 100644 index 000000000..669a57a77 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/activity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/airplay.svg b/vendor/assets/images/feather-icons/dist/icons/airplay.svg new file mode 100644 index 000000000..7ce730225 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/airplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/alert-circle.svg b/vendor/assets/images/feather-icons/dist/icons/alert-circle.svg new file mode 100644 index 000000000..8d02b7d16 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/alert-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/alert-octagon.svg b/vendor/assets/images/feather-icons/dist/icons/alert-octagon.svg new file mode 100644 index 000000000..de9b03f21 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/alert-octagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/alert-triangle.svg b/vendor/assets/images/feather-icons/dist/icons/alert-triangle.svg new file mode 100644 index 000000000..6dcb09632 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/alert-triangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/align-center.svg b/vendor/assets/images/feather-icons/dist/icons/align-center.svg new file mode 100644 index 000000000..5b8842ea7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/align-center.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/align-justify.svg b/vendor/assets/images/feather-icons/dist/icons/align-justify.svg new file mode 100644 index 000000000..0539876ff --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/align-justify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/align-left.svg b/vendor/assets/images/feather-icons/dist/icons/align-left.svg new file mode 100644 index 000000000..9ac852a51 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/align-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/align-right.svg b/vendor/assets/images/feather-icons/dist/icons/align-right.svg new file mode 100644 index 000000000..ef139ffab --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/align-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/anchor.svg b/vendor/assets/images/feather-icons/dist/icons/anchor.svg new file mode 100644 index 000000000..e01627a3d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/aperture.svg b/vendor/assets/images/feather-icons/dist/icons/aperture.svg new file mode 100644 index 000000000..9936e8688 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/aperture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/archive.svg b/vendor/assets/images/feather-icons/dist/icons/archive.svg new file mode 100644 index 000000000..428882c87 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-down-circle.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-down-circle.svg new file mode 100644 index 000000000..3238091b9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-down-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-down-left.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-down-left.svg new file mode 100644 index 000000000..724835842 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-down-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-down-right.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-down-right.svg new file mode 100644 index 000000000..81d9822ba --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-down-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-down.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-down.svg new file mode 100644 index 000000000..4f84f627b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-left-circle.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-left-circle.svg new file mode 100644 index 000000000..3b19ff8a5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-left-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-left.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-left.svg new file mode 100644 index 000000000..a5058fc73 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-right-circle.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-right-circle.svg new file mode 100644 index 000000000..ff01dd587 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-right-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-right.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-right.svg new file mode 100644 index 000000000..939b57c5b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-up-circle.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-up-circle.svg new file mode 100644 index 000000000..044a75d39 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-up-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-up-left.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-up-left.svg new file mode 100644 index 000000000..cea55e87a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-up-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-up-right.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-up-right.svg new file mode 100644 index 000000000..95678e00b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-up-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/arrow-up.svg b/vendor/assets/images/feather-icons/dist/icons/arrow-up.svg new file mode 100644 index 000000000..16b13aba8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/at-sign.svg b/vendor/assets/images/feather-icons/dist/icons/at-sign.svg new file mode 100644 index 000000000..5a5e5d0d8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/at-sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/award.svg b/vendor/assets/images/feather-icons/dist/icons/award.svg new file mode 100644 index 000000000..be70d5a13 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/award.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bar-chart-2.svg b/vendor/assets/images/feather-icons/dist/icons/bar-chart-2.svg new file mode 100644 index 000000000..864167a6c --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bar-chart-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bar-chart.svg b/vendor/assets/images/feather-icons/dist/icons/bar-chart.svg new file mode 100644 index 000000000..074d7c1a4 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/battery-charging.svg b/vendor/assets/images/feather-icons/dist/icons/battery-charging.svg new file mode 100644 index 000000000..644cb59cb --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/battery-charging.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/battery.svg b/vendor/assets/images/feather-icons/dist/icons/battery.svg new file mode 100644 index 000000000..7fe87710b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/battery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bell-off.svg b/vendor/assets/images/feather-icons/dist/icons/bell-off.svg new file mode 100644 index 000000000..4b07c8480 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bell-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bell.svg b/vendor/assets/images/feather-icons/dist/icons/bell.svg new file mode 100644 index 000000000..bba561c19 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bluetooth.svg b/vendor/assets/images/feather-icons/dist/icons/bluetooth.svg new file mode 100644 index 000000000..cebed7b18 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bluetooth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bold.svg b/vendor/assets/images/feather-icons/dist/icons/bold.svg new file mode 100644 index 000000000..d1a4efd3a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/book-open.svg b/vendor/assets/images/feather-icons/dist/icons/book-open.svg new file mode 100644 index 000000000..5e0ca0ab7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/book-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/book.svg b/vendor/assets/images/feather-icons/dist/icons/book.svg new file mode 100644 index 000000000..12ffcbc46 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/bookmark.svg b/vendor/assets/images/feather-icons/dist/icons/bookmark.svg new file mode 100644 index 000000000..2239cc580 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/box.svg b/vendor/assets/images/feather-icons/dist/icons/box.svg new file mode 100644 index 000000000..d89be30f5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/box.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/briefcase.svg b/vendor/assets/images/feather-icons/dist/icons/briefcase.svg new file mode 100644 index 000000000..e3af05060 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/calendar.svg b/vendor/assets/images/feather-icons/dist/icons/calendar.svg new file mode 100644 index 000000000..6c7fd870d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/camera-off.svg b/vendor/assets/images/feather-icons/dist/icons/camera-off.svg new file mode 100644 index 000000000..daa3e25f0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/camera-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/camera.svg b/vendor/assets/images/feather-icons/dist/icons/camera.svg new file mode 100644 index 000000000..0e7f06037 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cast.svg b/vendor/assets/images/feather-icons/dist/icons/cast.svg new file mode 100644 index 000000000..63c954d98 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/check-circle.svg b/vendor/assets/images/feather-icons/dist/icons/check-circle.svg new file mode 100644 index 000000000..f2f4fd1af --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/check-square.svg b/vendor/assets/images/feather-icons/dist/icons/check-square.svg new file mode 100644 index 000000000..72ab7a806 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/check-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/check.svg b/vendor/assets/images/feather-icons/dist/icons/check.svg new file mode 100644 index 000000000..1c209899d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevron-down.svg b/vendor/assets/images/feather-icons/dist/icons/chevron-down.svg new file mode 100644 index 000000000..278c6a315 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevron-left.svg b/vendor/assets/images/feather-icons/dist/icons/chevron-left.svg new file mode 100644 index 000000000..747d46d90 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevron-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevron-right.svg b/vendor/assets/images/feather-icons/dist/icons/chevron-right.svg new file mode 100644 index 000000000..258de414a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevron-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevron-up.svg b/vendor/assets/images/feather-icons/dist/icons/chevron-up.svg new file mode 100644 index 000000000..4eb5ecc33 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevron-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevrons-down.svg b/vendor/assets/images/feather-icons/dist/icons/chevrons-down.svg new file mode 100644 index 000000000..e67ef2fb0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevrons-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevrons-left.svg b/vendor/assets/images/feather-icons/dist/icons/chevrons-left.svg new file mode 100644 index 000000000..c32e39836 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevrons-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevrons-right.svg b/vendor/assets/images/feather-icons/dist/icons/chevrons-right.svg new file mode 100644 index 000000000..f50681454 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevrons-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chevrons-up.svg b/vendor/assets/images/feather-icons/dist/icons/chevrons-up.svg new file mode 100644 index 000000000..0eaf5183a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chevrons-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/chrome.svg b/vendor/assets/images/feather-icons/dist/icons/chrome.svg new file mode 100644 index 000000000..9189815eb --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/chrome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/circle.svg b/vendor/assets/images/feather-icons/dist/icons/circle.svg new file mode 100644 index 000000000..b0090882b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/clipboard.svg b/vendor/assets/images/feather-icons/dist/icons/clipboard.svg new file mode 100644 index 000000000..ccee454d8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/clock.svg b/vendor/assets/images/feather-icons/dist/icons/clock.svg new file mode 100644 index 000000000..ea3f5e507 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud-drizzle.svg b/vendor/assets/images/feather-icons/dist/icons/cloud-drizzle.svg new file mode 100644 index 000000000..13af6bb57 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud-drizzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud-lightning.svg b/vendor/assets/images/feather-icons/dist/icons/cloud-lightning.svg new file mode 100644 index 000000000..32d154cc0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud-lightning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud-off.svg b/vendor/assets/images/feather-icons/dist/icons/cloud-off.svg new file mode 100644 index 000000000..1e1e7d60b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud-rain.svg b/vendor/assets/images/feather-icons/dist/icons/cloud-rain.svg new file mode 100644 index 000000000..3e0b85b09 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud-rain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud-snow.svg b/vendor/assets/images/feather-icons/dist/icons/cloud-snow.svg new file mode 100644 index 000000000..e4eb82074 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud-snow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cloud.svg b/vendor/assets/images/feather-icons/dist/icons/cloud.svg new file mode 100644 index 000000000..0ee0c6322 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/code.svg b/vendor/assets/images/feather-icons/dist/icons/code.svg new file mode 100644 index 000000000..c4954b55a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/codepen.svg b/vendor/assets/images/feather-icons/dist/icons/codepen.svg new file mode 100644 index 000000000..ab2a815aa --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/codepen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/codesandbox.svg b/vendor/assets/images/feather-icons/dist/icons/codesandbox.svg new file mode 100644 index 000000000..49848f520 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/codesandbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/coffee.svg b/vendor/assets/images/feather-icons/dist/icons/coffee.svg new file mode 100644 index 000000000..32905e520 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/coffee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/columns.svg b/vendor/assets/images/feather-icons/dist/icons/columns.svg new file mode 100644 index 000000000..d264b557b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/columns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/command.svg b/vendor/assets/images/feather-icons/dist/icons/command.svg new file mode 100644 index 000000000..93f554c34 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/command.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/compass.svg b/vendor/assets/images/feather-icons/dist/icons/compass.svg new file mode 100644 index 000000000..329626080 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/compass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/copy.svg b/vendor/assets/images/feather-icons/dist/icons/copy.svg new file mode 100644 index 000000000..4e0b09f19 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-down-left.svg b/vendor/assets/images/feather-icons/dist/icons/corner-down-left.svg new file mode 100644 index 000000000..9fffb3e9f --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-down-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-down-right.svg b/vendor/assets/images/feather-icons/dist/icons/corner-down-right.svg new file mode 100644 index 000000000..b27d408dd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-down-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-left-down.svg b/vendor/assets/images/feather-icons/dist/icons/corner-left-down.svg new file mode 100644 index 000000000..24b8375c5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-left-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-left-up.svg b/vendor/assets/images/feather-icons/dist/icons/corner-left-up.svg new file mode 100644 index 000000000..e54527cd7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-left-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-right-down.svg b/vendor/assets/images/feather-icons/dist/icons/corner-right-down.svg new file mode 100644 index 000000000..a49e6d6c0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-right-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-right-up.svg b/vendor/assets/images/feather-icons/dist/icons/corner-right-up.svg new file mode 100644 index 000000000..a5c5dce55 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-right-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-up-left.svg b/vendor/assets/images/feather-icons/dist/icons/corner-up-left.svg new file mode 100644 index 000000000..0a1ffd613 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-up-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/corner-up-right.svg b/vendor/assets/images/feather-icons/dist/icons/corner-up-right.svg new file mode 100644 index 000000000..0b8f961b7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/corner-up-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/cpu.svg b/vendor/assets/images/feather-icons/dist/icons/cpu.svg new file mode 100644 index 000000000..2ed16ef74 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/cpu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/credit-card.svg b/vendor/assets/images/feather-icons/dist/icons/credit-card.svg new file mode 100644 index 000000000..1b7fd029d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/credit-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/crop.svg b/vendor/assets/images/feather-icons/dist/icons/crop.svg new file mode 100644 index 000000000..ffbfd0456 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/crop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/crosshair.svg b/vendor/assets/images/feather-icons/dist/icons/crosshair.svg new file mode 100644 index 000000000..ba3940150 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/crosshair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/database.svg b/vendor/assets/images/feather-icons/dist/icons/database.svg new file mode 100644 index 000000000..c296fbcfd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/delete.svg b/vendor/assets/images/feather-icons/dist/icons/delete.svg new file mode 100644 index 000000000..8c6074b96 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/disc.svg b/vendor/assets/images/feather-icons/dist/icons/disc.svg new file mode 100644 index 000000000..2595b4446 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/disc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/divide-circle.svg b/vendor/assets/images/feather-icons/dist/icons/divide-circle.svg new file mode 100644 index 000000000..03a50b747 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/divide-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/divide-square.svg b/vendor/assets/images/feather-icons/dist/icons/divide-square.svg new file mode 100644 index 000000000..852f7768c --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/divide-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/divide.svg b/vendor/assets/images/feather-icons/dist/icons/divide.svg new file mode 100644 index 000000000..3cbff3aea --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/divide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/dollar-sign.svg b/vendor/assets/images/feather-icons/dist/icons/dollar-sign.svg new file mode 100644 index 000000000..1a124d269 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/dollar-sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/download-cloud.svg b/vendor/assets/images/feather-icons/dist/icons/download-cloud.svg new file mode 100644 index 000000000..f3126fc39 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/download-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/download.svg b/vendor/assets/images/feather-icons/dist/icons/download.svg new file mode 100644 index 000000000..76767a924 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/dribbble.svg b/vendor/assets/images/feather-icons/dist/icons/dribbble.svg new file mode 100644 index 000000000..bb8577da0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/dribbble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/droplet.svg b/vendor/assets/images/feather-icons/dist/icons/droplet.svg new file mode 100644 index 000000000..ca093014e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/droplet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/edit-2.svg b/vendor/assets/images/feather-icons/dist/icons/edit-2.svg new file mode 100644 index 000000000..06830c9d0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/edit-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/edit-3.svg b/vendor/assets/images/feather-icons/dist/icons/edit-3.svg new file mode 100644 index 000000000..d728efcc6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/edit-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/edit.svg b/vendor/assets/images/feather-icons/dist/icons/edit.svg new file mode 100644 index 000000000..ec7b4ca2d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/external-link.svg b/vendor/assets/images/feather-icons/dist/icons/external-link.svg new file mode 100644 index 000000000..6236df3e0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/eye-off.svg b/vendor/assets/images/feather-icons/dist/icons/eye-off.svg new file mode 100644 index 000000000..77c54cb41 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/eye-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/eye.svg b/vendor/assets/images/feather-icons/dist/icons/eye.svg new file mode 100644 index 000000000..9cde24372 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/facebook.svg b/vendor/assets/images/feather-icons/dist/icons/facebook.svg new file mode 100644 index 000000000..2570f56a0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/fast-forward.svg b/vendor/assets/images/feather-icons/dist/icons/fast-forward.svg new file mode 100644 index 000000000..fa39877aa --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/fast-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/feather.svg b/vendor/assets/images/feather-icons/dist/icons/feather.svg new file mode 100644 index 000000000..ac3b868db --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/feather.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/figma.svg b/vendor/assets/images/feather-icons/dist/icons/figma.svg new file mode 100644 index 000000000..66fd21783 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/figma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/file-minus.svg b/vendor/assets/images/feather-icons/dist/icons/file-minus.svg new file mode 100644 index 000000000..345756ef1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/file-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/file-plus.svg b/vendor/assets/images/feather-icons/dist/icons/file-plus.svg new file mode 100644 index 000000000..eed120047 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/file-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/file-text.svg b/vendor/assets/images/feather-icons/dist/icons/file-text.svg new file mode 100644 index 000000000..4197ddd40 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/file-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/file.svg b/vendor/assets/images/feather-icons/dist/icons/file.svg new file mode 100644 index 000000000..378519ab6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/film.svg b/vendor/assets/images/feather-icons/dist/icons/film.svg new file mode 100644 index 000000000..ac46360d2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/film.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/filter.svg b/vendor/assets/images/feather-icons/dist/icons/filter.svg new file mode 100644 index 000000000..38a47e043 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/flag.svg b/vendor/assets/images/feather-icons/dist/icons/flag.svg new file mode 100644 index 000000000..037737cb6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/folder-minus.svg b/vendor/assets/images/feather-icons/dist/icons/folder-minus.svg new file mode 100644 index 000000000..d5b7af65f --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/folder-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/folder-plus.svg b/vendor/assets/images/feather-icons/dist/icons/folder-plus.svg new file mode 100644 index 000000000..898f2fc98 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/folder-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/folder.svg b/vendor/assets/images/feather-icons/dist/icons/folder.svg new file mode 100644 index 000000000..134458b98 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/framer.svg b/vendor/assets/images/feather-icons/dist/icons/framer.svg new file mode 100644 index 000000000..3e663478b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/framer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/frown.svg b/vendor/assets/images/feather-icons/dist/icons/frown.svg new file mode 100644 index 000000000..f3122547d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/frown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/gift.svg b/vendor/assets/images/feather-icons/dist/icons/gift.svg new file mode 100644 index 000000000..d2c14bd69 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/git-branch.svg b/vendor/assets/images/feather-icons/dist/icons/git-branch.svg new file mode 100644 index 000000000..440037264 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/git-branch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/git-commit.svg b/vendor/assets/images/feather-icons/dist/icons/git-commit.svg new file mode 100644 index 000000000..e959d725a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/git-commit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/git-merge.svg b/vendor/assets/images/feather-icons/dist/icons/git-merge.svg new file mode 100644 index 000000000..c65fffddc --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/git-merge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/git-pull-request.svg b/vendor/assets/images/feather-icons/dist/icons/git-pull-request.svg new file mode 100644 index 000000000..fc80bdfd5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/git-pull-request.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/github.svg b/vendor/assets/images/feather-icons/dist/icons/github.svg new file mode 100644 index 000000000..ff0af4811 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/gitlab.svg b/vendor/assets/images/feather-icons/dist/icons/gitlab.svg new file mode 100644 index 000000000..85d54a1ea --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/globe.svg b/vendor/assets/images/feather-icons/dist/icons/globe.svg new file mode 100644 index 000000000..0a0586d36 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/grid.svg b/vendor/assets/images/feather-icons/dist/icons/grid.svg new file mode 100644 index 000000000..8ef2e9d87 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/hard-drive.svg b/vendor/assets/images/feather-icons/dist/icons/hard-drive.svg new file mode 100644 index 000000000..8e90fa1bc --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/hard-drive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/hash.svg b/vendor/assets/images/feather-icons/dist/icons/hash.svg new file mode 100644 index 000000000..c9c8d41f6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/hash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/headphones.svg b/vendor/assets/images/feather-icons/dist/icons/headphones.svg new file mode 100644 index 000000000..fd8915b48 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/headphones.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/heart.svg b/vendor/assets/images/feather-icons/dist/icons/heart.svg new file mode 100644 index 000000000..a083b7e2a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/help-circle.svg b/vendor/assets/images/feather-icons/dist/icons/help-circle.svg new file mode 100644 index 000000000..51fddd80d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/help-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/hexagon.svg b/vendor/assets/images/feather-icons/dist/icons/hexagon.svg new file mode 100644 index 000000000..eae7f2559 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/hexagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/home.svg b/vendor/assets/images/feather-icons/dist/icons/home.svg new file mode 100644 index 000000000..7bb31b23d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/image.svg b/vendor/assets/images/feather-icons/dist/icons/image.svg new file mode 100644 index 000000000..a7d84b98c --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/inbox.svg b/vendor/assets/images/feather-icons/dist/icons/inbox.svg new file mode 100644 index 000000000..03a13b4e4 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/info.svg b/vendor/assets/images/feather-icons/dist/icons/info.svg new file mode 100644 index 000000000..a09fa5f13 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/instagram.svg b/vendor/assets/images/feather-icons/dist/icons/instagram.svg new file mode 100644 index 000000000..9fdb8e35d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/italic.svg b/vendor/assets/images/feather-icons/dist/icons/italic.svg new file mode 100644 index 000000000..a123d371a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/key.svg b/vendor/assets/images/feather-icons/dist/icons/key.svg new file mode 100644 index 000000000..e778e74eb --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/layers.svg b/vendor/assets/images/feather-icons/dist/icons/layers.svg new file mode 100644 index 000000000..ea788c226 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/layout.svg b/vendor/assets/images/feather-icons/dist/icons/layout.svg new file mode 100644 index 000000000..28743d928 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/layout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/life-buoy.svg b/vendor/assets/images/feather-icons/dist/icons/life-buoy.svg new file mode 100644 index 000000000..54c2bd7dd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/life-buoy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/link-2.svg b/vendor/assets/images/feather-icons/dist/icons/link-2.svg new file mode 100644 index 000000000..8cc7f6dda --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/link-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/link.svg b/vendor/assets/images/feather-icons/dist/icons/link.svg new file mode 100644 index 000000000..c89dd41c2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/linkedin.svg b/vendor/assets/images/feather-icons/dist/icons/linkedin.svg new file mode 100644 index 000000000..395310945 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/list.svg b/vendor/assets/images/feather-icons/dist/icons/list.svg new file mode 100644 index 000000000..5ce38eaa9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/loader.svg b/vendor/assets/images/feather-icons/dist/icons/loader.svg new file mode 100644 index 000000000..e1a70c127 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/loader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/lock.svg b/vendor/assets/images/feather-icons/dist/icons/lock.svg new file mode 100644 index 000000000..de09d9db3 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/log-in.svg b/vendor/assets/images/feather-icons/dist/icons/log-in.svg new file mode 100644 index 000000000..ba0da59a1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/log-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/log-out.svg b/vendor/assets/images/feather-icons/dist/icons/log-out.svg new file mode 100644 index 000000000..c9002c903 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/log-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/mail.svg b/vendor/assets/images/feather-icons/dist/icons/mail.svg new file mode 100644 index 000000000..2af169e83 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/map-pin.svg b/vendor/assets/images/feather-icons/dist/icons/map-pin.svg new file mode 100644 index 000000000..d5548e92c --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/map-pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/map.svg b/vendor/assets/images/feather-icons/dist/icons/map.svg new file mode 100644 index 000000000..ecebd7bf7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/maximize-2.svg b/vendor/assets/images/feather-icons/dist/icons/maximize-2.svg new file mode 100644 index 000000000..e41fc0b73 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/maximize-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/maximize.svg b/vendor/assets/images/feather-icons/dist/icons/maximize.svg new file mode 100644 index 000000000..fc3051894 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/maximize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/meh.svg b/vendor/assets/images/feather-icons/dist/icons/meh.svg new file mode 100644 index 000000000..6f57fff24 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/meh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/menu.svg b/vendor/assets/images/feather-icons/dist/icons/menu.svg new file mode 100644 index 000000000..e8a84a952 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/message-circle.svg b/vendor/assets/images/feather-icons/dist/icons/message-circle.svg new file mode 100644 index 000000000..4b21b32b6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/message-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/message-square.svg b/vendor/assets/images/feather-icons/dist/icons/message-square.svg new file mode 100644 index 000000000..6a2e4e596 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/message-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/mic-off.svg b/vendor/assets/images/feather-icons/dist/icons/mic-off.svg new file mode 100644 index 000000000..0786219cb --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/mic-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/mic.svg b/vendor/assets/images/feather-icons/dist/icons/mic.svg new file mode 100644 index 000000000..dc5f780ce --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/mic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/minimize-2.svg b/vendor/assets/images/feather-icons/dist/icons/minimize-2.svg new file mode 100644 index 000000000..a720fa6c3 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/minimize-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/minimize.svg b/vendor/assets/images/feather-icons/dist/icons/minimize.svg new file mode 100644 index 000000000..46d611969 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/minimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/minus-circle.svg b/vendor/assets/images/feather-icons/dist/icons/minus-circle.svg new file mode 100644 index 000000000..80c0de1e1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/minus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/minus-square.svg b/vendor/assets/images/feather-icons/dist/icons/minus-square.svg new file mode 100644 index 000000000..4862832a8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/minus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/minus.svg b/vendor/assets/images/feather-icons/dist/icons/minus.svg new file mode 100644 index 000000000..93cc73401 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/monitor.svg b/vendor/assets/images/feather-icons/dist/icons/monitor.svg new file mode 100644 index 000000000..6c3556db2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/moon.svg b/vendor/assets/images/feather-icons/dist/icons/moon.svg new file mode 100644 index 000000000..dbf7c6cf5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/more-horizontal.svg b/vendor/assets/images/feather-icons/dist/icons/more-horizontal.svg new file mode 100644 index 000000000..dc6a85564 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/more-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/more-vertical.svg b/vendor/assets/images/feather-icons/dist/icons/more-vertical.svg new file mode 100644 index 000000000..cba6958f2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/more-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/mouse-pointer.svg b/vendor/assets/images/feather-icons/dist/icons/mouse-pointer.svg new file mode 100644 index 000000000..f5af55916 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/mouse-pointer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/move.svg b/vendor/assets/images/feather-icons/dist/icons/move.svg new file mode 100644 index 000000000..4e251b562 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/move.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/music.svg b/vendor/assets/images/feather-icons/dist/icons/music.svg new file mode 100644 index 000000000..7bee2f7e1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/navigation-2.svg b/vendor/assets/images/feather-icons/dist/icons/navigation-2.svg new file mode 100644 index 000000000..ae31db96b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/navigation-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/navigation.svg b/vendor/assets/images/feather-icons/dist/icons/navigation.svg new file mode 100644 index 000000000..f600a4145 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/navigation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/octagon.svg b/vendor/assets/images/feather-icons/dist/icons/octagon.svg new file mode 100644 index 000000000..124c5483d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/octagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/package.svg b/vendor/assets/images/feather-icons/dist/icons/package.svg new file mode 100644 index 000000000..f1e09eec0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/package.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/paperclip.svg b/vendor/assets/images/feather-icons/dist/icons/paperclip.svg new file mode 100644 index 000000000..b1f69b7a7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/paperclip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/pause-circle.svg b/vendor/assets/images/feather-icons/dist/icons/pause-circle.svg new file mode 100644 index 000000000..f6b1a8dfd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/pause-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/pause.svg b/vendor/assets/images/feather-icons/dist/icons/pause.svg new file mode 100644 index 000000000..4e78038de --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/pen-tool.svg b/vendor/assets/images/feather-icons/dist/icons/pen-tool.svg new file mode 100644 index 000000000..0d26fa1e5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/pen-tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/percent.svg b/vendor/assets/images/feather-icons/dist/icons/percent.svg new file mode 100644 index 000000000..2cb9719da --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/percent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-call.svg b/vendor/assets/images/feather-icons/dist/icons/phone-call.svg new file mode 100644 index 000000000..8b8666026 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-call.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-forwarded.svg b/vendor/assets/images/feather-icons/dist/icons/phone-forwarded.svg new file mode 100644 index 000000000..aa21befcb --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-forwarded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-incoming.svg b/vendor/assets/images/feather-icons/dist/icons/phone-incoming.svg new file mode 100644 index 000000000..b2d523a87 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-incoming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-missed.svg b/vendor/assets/images/feather-icons/dist/icons/phone-missed.svg new file mode 100644 index 000000000..4950f09fa --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-missed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-off.svg b/vendor/assets/images/feather-icons/dist/icons/phone-off.svg new file mode 100644 index 000000000..4d00fb3d5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone-outgoing.svg b/vendor/assets/images/feather-icons/dist/icons/phone-outgoing.svg new file mode 100644 index 000000000..fea27a37d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone-outgoing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/phone.svg b/vendor/assets/images/feather-icons/dist/icons/phone.svg new file mode 100644 index 000000000..2a35154a9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/pie-chart.svg b/vendor/assets/images/feather-icons/dist/icons/pie-chart.svg new file mode 100644 index 000000000..b5bbe67c2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/pie-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/play-circle.svg b/vendor/assets/images/feather-icons/dist/icons/play-circle.svg new file mode 100644 index 000000000..8766dc7bf --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/play-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/play.svg b/vendor/assets/images/feather-icons/dist/icons/play.svg new file mode 100644 index 000000000..fd76e30d6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/plus-circle.svg b/vendor/assets/images/feather-icons/dist/icons/plus-circle.svg new file mode 100644 index 000000000..4291ff052 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/plus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/plus-square.svg b/vendor/assets/images/feather-icons/dist/icons/plus-square.svg new file mode 100644 index 000000000..c380e24bd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/plus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/plus.svg b/vendor/assets/images/feather-icons/dist/icons/plus.svg new file mode 100644 index 000000000..703c5b7b2 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/pocket.svg b/vendor/assets/images/feather-icons/dist/icons/pocket.svg new file mode 100644 index 000000000..a3b256190 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/pocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/power.svg b/vendor/assets/images/feather-icons/dist/icons/power.svg new file mode 100644 index 000000000..598308fce --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/printer.svg b/vendor/assets/images/feather-icons/dist/icons/printer.svg new file mode 100644 index 000000000..8a9a7ace1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/radio.svg b/vendor/assets/images/feather-icons/dist/icons/radio.svg new file mode 100644 index 000000000..5abfcd13c --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/refresh-ccw.svg b/vendor/assets/images/feather-icons/dist/icons/refresh-ccw.svg new file mode 100644 index 000000000..10cff0eca --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/refresh-ccw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/refresh-cw.svg b/vendor/assets/images/feather-icons/dist/icons/refresh-cw.svg new file mode 100644 index 000000000..06c358dd0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/refresh-cw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/repeat.svg b/vendor/assets/images/feather-icons/dist/icons/repeat.svg new file mode 100644 index 000000000..c7657b08e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/repeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/rewind.svg b/vendor/assets/images/feather-icons/dist/icons/rewind.svg new file mode 100644 index 000000000..7b0fa3d55 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/rewind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/rotate-ccw.svg b/vendor/assets/images/feather-icons/dist/icons/rotate-ccw.svg new file mode 100644 index 000000000..ade5dc426 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/rotate-ccw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/rotate-cw.svg b/vendor/assets/images/feather-icons/dist/icons/rotate-cw.svg new file mode 100644 index 000000000..83dca3514 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/rotate-cw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/rss.svg b/vendor/assets/images/feather-icons/dist/icons/rss.svg new file mode 100644 index 000000000..c9a136845 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/save.svg b/vendor/assets/images/feather-icons/dist/icons/save.svg new file mode 100644 index 000000000..46c72990d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/scissors.svg b/vendor/assets/images/feather-icons/dist/icons/scissors.svg new file mode 100644 index 000000000..fd0647ff6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/scissors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/search.svg b/vendor/assets/images/feather-icons/dist/icons/search.svg new file mode 100644 index 000000000..8710306dd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/send.svg b/vendor/assets/images/feather-icons/dist/icons/send.svg new file mode 100644 index 000000000..42ef2a243 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/server.svg b/vendor/assets/images/feather-icons/dist/icons/server.svg new file mode 100644 index 000000000..54ce094a5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/settings.svg b/vendor/assets/images/feather-icons/dist/icons/settings.svg new file mode 100644 index 000000000..19c27265a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/share-2.svg b/vendor/assets/images/feather-icons/dist/icons/share-2.svg new file mode 100644 index 000000000..09b1c7bcd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/share-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/share.svg b/vendor/assets/images/feather-icons/dist/icons/share.svg new file mode 100644 index 000000000..df38c14d6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/shield-off.svg b/vendor/assets/images/feather-icons/dist/icons/shield-off.svg new file mode 100644 index 000000000..18692ddd8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/shield-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/shield.svg b/vendor/assets/images/feather-icons/dist/icons/shield.svg new file mode 100644 index 000000000..c7c484137 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/shopping-bag.svg b/vendor/assets/images/feather-icons/dist/icons/shopping-bag.svg new file mode 100644 index 000000000..eaa39e815 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/shopping-bag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/shopping-cart.svg b/vendor/assets/images/feather-icons/dist/icons/shopping-cart.svg new file mode 100644 index 000000000..17a40bf47 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/shopping-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/shuffle.svg b/vendor/assets/images/feather-icons/dist/icons/shuffle.svg new file mode 100644 index 000000000..8cfb5db5d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/shuffle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/sidebar.svg b/vendor/assets/images/feather-icons/dist/icons/sidebar.svg new file mode 100644 index 000000000..8ba817e6f --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/sidebar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/skip-back.svg b/vendor/assets/images/feather-icons/dist/icons/skip-back.svg new file mode 100644 index 000000000..88d024e2f --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/skip-back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/skip-forward.svg b/vendor/assets/images/feather-icons/dist/icons/skip-forward.svg new file mode 100644 index 000000000..f3fdac3ae --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/skip-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/slack.svg b/vendor/assets/images/feather-icons/dist/icons/slack.svg new file mode 100644 index 000000000..5d973466b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/slash.svg b/vendor/assets/images/feather-icons/dist/icons/slash.svg new file mode 100644 index 000000000..f4131b85f --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/sliders.svg b/vendor/assets/images/feather-icons/dist/icons/sliders.svg new file mode 100644 index 000000000..19c938521 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/sliders.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/smartphone.svg b/vendor/assets/images/feather-icons/dist/icons/smartphone.svg new file mode 100644 index 000000000..0171a95a1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/smartphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/smile.svg b/vendor/assets/images/feather-icons/dist/icons/smile.svg new file mode 100644 index 000000000..24dc8a26e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/smile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/speaker.svg b/vendor/assets/images/feather-icons/dist/icons/speaker.svg new file mode 100644 index 000000000..75d5ff9c0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/speaker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/square.svg b/vendor/assets/images/feather-icons/dist/icons/square.svg new file mode 100644 index 000000000..6eabc77db --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/star.svg b/vendor/assets/images/feather-icons/dist/icons/star.svg new file mode 100644 index 000000000..bcdc31aa4 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/stop-circle.svg b/vendor/assets/images/feather-icons/dist/icons/stop-circle.svg new file mode 100644 index 000000000..c10d9d47a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/stop-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/sun.svg b/vendor/assets/images/feather-icons/dist/icons/sun.svg new file mode 100644 index 000000000..7f51b94d1 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/sunrise.svg b/vendor/assets/images/feather-icons/dist/icons/sunrise.svg new file mode 100644 index 000000000..eff4b1e48 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/sunrise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/sunset.svg b/vendor/assets/images/feather-icons/dist/icons/sunset.svg new file mode 100644 index 000000000..a5a222154 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/sunset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/table.svg b/vendor/assets/images/feather-icons/dist/icons/table.svg new file mode 100644 index 000000000..679bd5703 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/tablet.svg b/vendor/assets/images/feather-icons/dist/icons/tablet.svg new file mode 100644 index 000000000..9c80b40a8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/tablet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/tag.svg b/vendor/assets/images/feather-icons/dist/icons/tag.svg new file mode 100644 index 000000000..7219b15f3 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/target.svg b/vendor/assets/images/feather-icons/dist/icons/target.svg new file mode 100644 index 000000000..be84b17c8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/terminal.svg b/vendor/assets/images/feather-icons/dist/icons/terminal.svg new file mode 100644 index 000000000..af459c04e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/terminal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/thermometer.svg b/vendor/assets/images/feather-icons/dist/icons/thermometer.svg new file mode 100644 index 000000000..33142cccc --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/thermometer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/thumbs-down.svg b/vendor/assets/images/feather-icons/dist/icons/thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/thumbs-up.svg b/vendor/assets/images/feather-icons/dist/icons/thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/toggle-left.svg b/vendor/assets/images/feather-icons/dist/icons/toggle-left.svg new file mode 100644 index 000000000..240be290b --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/toggle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/toggle-right.svg b/vendor/assets/images/feather-icons/dist/icons/toggle-right.svg new file mode 100644 index 000000000..fc6e81c19 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/toggle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/tool.svg b/vendor/assets/images/feather-icons/dist/icons/tool.svg new file mode 100644 index 000000000..f3cbf3d90 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/trash-2.svg b/vendor/assets/images/feather-icons/dist/icons/trash-2.svg new file mode 100644 index 000000000..f24d55bf6 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/trash-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/trash.svg b/vendor/assets/images/feather-icons/dist/icons/trash.svg new file mode 100644 index 000000000..55650bd44 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/trello.svg b/vendor/assets/images/feather-icons/dist/icons/trello.svg new file mode 100644 index 000000000..b2f599b64 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/trello.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/trending-down.svg b/vendor/assets/images/feather-icons/dist/icons/trending-down.svg new file mode 100644 index 000000000..a9d4cfa54 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/trending-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/trending-up.svg b/vendor/assets/images/feather-icons/dist/icons/trending-up.svg new file mode 100644 index 000000000..52026a4df --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/trending-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/triangle.svg b/vendor/assets/images/feather-icons/dist/icons/triangle.svg new file mode 100644 index 000000000..274b65284 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/triangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/truck.svg b/vendor/assets/images/feather-icons/dist/icons/truck.svg new file mode 100644 index 000000000..33898373e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/truck.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/tv.svg b/vendor/assets/images/feather-icons/dist/icons/tv.svg new file mode 100644 index 000000000..955bbfff0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/tv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/twitch.svg b/vendor/assets/images/feather-icons/dist/icons/twitch.svg new file mode 100644 index 000000000..170624958 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/twitch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/twitter.svg b/vendor/assets/images/feather-icons/dist/icons/twitter.svg new file mode 100644 index 000000000..f8886eca8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/type.svg b/vendor/assets/images/feather-icons/dist/icons/type.svg new file mode 100644 index 000000000..c6b2de334 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/type.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/umbrella.svg b/vendor/assets/images/feather-icons/dist/icons/umbrella.svg new file mode 100644 index 000000000..dc77c0cb0 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/umbrella.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/underline.svg b/vendor/assets/images/feather-icons/dist/icons/underline.svg new file mode 100644 index 000000000..044945d4a --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/unlock.svg b/vendor/assets/images/feather-icons/dist/icons/unlock.svg new file mode 100644 index 000000000..01dc35973 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/upload-cloud.svg b/vendor/assets/images/feather-icons/dist/icons/upload-cloud.svg new file mode 100644 index 000000000..a1db297c5 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/upload-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/upload.svg b/vendor/assets/images/feather-icons/dist/icons/upload.svg new file mode 100644 index 000000000..91eaff755 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/user-check.svg b/vendor/assets/images/feather-icons/dist/icons/user-check.svg new file mode 100644 index 000000000..42f91b29d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/user-check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/user-minus.svg b/vendor/assets/images/feather-icons/dist/icons/user-minus.svg new file mode 100644 index 000000000..44b75f5a9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/user-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/user-plus.svg b/vendor/assets/images/feather-icons/dist/icons/user-plus.svg new file mode 100644 index 000000000..21460f6ec --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/user-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/user-x.svg b/vendor/assets/images/feather-icons/dist/icons/user-x.svg new file mode 100644 index 000000000..0c41a4819 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/user-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/user.svg b/vendor/assets/images/feather-icons/dist/icons/user.svg new file mode 100644 index 000000000..7bb5f2911 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/users.svg b/vendor/assets/images/feather-icons/dist/icons/users.svg new file mode 100644 index 000000000..aacf6b08e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/video-off.svg b/vendor/assets/images/feather-icons/dist/icons/video-off.svg new file mode 100644 index 000000000..08ec69738 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/video-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/video.svg b/vendor/assets/images/feather-icons/dist/icons/video.svg new file mode 100644 index 000000000..8ff156aa9 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/voicemail.svg b/vendor/assets/images/feather-icons/dist/icons/voicemail.svg new file mode 100644 index 000000000..5d78a8e79 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/voicemail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/volume-1.svg b/vendor/assets/images/feather-icons/dist/icons/volume-1.svg new file mode 100644 index 000000000..150e875fc --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/volume-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/volume-2.svg b/vendor/assets/images/feather-icons/dist/icons/volume-2.svg new file mode 100644 index 000000000..03d521c7e --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/volume-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/volume-x.svg b/vendor/assets/images/feather-icons/dist/icons/volume-x.svg new file mode 100644 index 000000000..be4424069 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/volume-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/volume.svg b/vendor/assets/images/feather-icons/dist/icons/volume.svg new file mode 100644 index 000000000..53bfe15ee --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/volume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/watch.svg b/vendor/assets/images/feather-icons/dist/icons/watch.svg new file mode 100644 index 000000000..a1099da33 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/watch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/wifi-off.svg b/vendor/assets/images/feather-icons/dist/icons/wifi-off.svg new file mode 100644 index 000000000..35eae43b7 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/wifi-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/wifi.svg b/vendor/assets/images/feather-icons/dist/icons/wifi.svg new file mode 100644 index 000000000..748c285e3 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/wifi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/wind.svg b/vendor/assets/images/feather-icons/dist/icons/wind.svg new file mode 100644 index 000000000..82b364681 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/wind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/x-circle.svg b/vendor/assets/images/feather-icons/dist/icons/x-circle.svg new file mode 100644 index 000000000..94aad5e56 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/x-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/x-octagon.svg b/vendor/assets/images/feather-icons/dist/icons/x-octagon.svg new file mode 100644 index 000000000..85431985d --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/x-octagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/x-square.svg b/vendor/assets/images/feather-icons/dist/icons/x-square.svg new file mode 100644 index 000000000..7677c3871 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/x-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/x.svg b/vendor/assets/images/feather-icons/dist/icons/x.svg new file mode 100644 index 000000000..7d5875ca8 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/youtube.svg b/vendor/assets/images/feather-icons/dist/icons/youtube.svg new file mode 100644 index 000000000..c48243850 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/zap-off.svg b/vendor/assets/images/feather-icons/dist/icons/zap-off.svg new file mode 100644 index 000000000..c636f8bbd --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/zap-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/zap.svg b/vendor/assets/images/feather-icons/dist/icons/zap.svg new file mode 100644 index 000000000..8fdafa934 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/zap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/zoom-in.svg b/vendor/assets/images/feather-icons/dist/icons/zoom-in.svg new file mode 100644 index 000000000..da4572d27 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/zoom-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/images/feather-icons/dist/icons/zoom-out.svg b/vendor/assets/images/feather-icons/dist/icons/zoom-out.svg new file mode 100644 index 000000000..fd678d728 --- /dev/null +++ b/vendor/assets/images/feather-icons/dist/icons/zoom-out.svg @@ -0,0 +1 @@ + \ No newline at end of file